본문 바로가기

ABAP 프로그래밍 개념/Object-Oriented ABAP

Principles of OOP Part2 : Attributes

Attributes(속성)객체에서 소비되는(사용되는) 데이터를 정의한 것입니다. Attributes는 Elementary type, DIctionary type, User-defined type, reference type 등을 포함한 어떠한 종류의 데이터 타입으로도 선언될 수 있습니다.

Attrubute예시

클래스안에서, 개발자는 types 구문을 사용하여 user-defiend type을 정의할 수 있습니다. Constants(상수) 또한 constants 구문을 사용하여 정의할 수 있다. 또한 PUBLIC SECTION에서 Attribute를 선언할 때 addition인 read-onlydata 구문과 함께 사용하며 외부로부터 접근은 가능하지만, 수정은 불가능하도록 할 수 있다. 다른말로 하면, read-only라는 addition을 사용한 Attrubute는 클래스의 methods를 통해서만 변경이 가능하다. 우리는 이 read-only를 통해서 외부로부터 Attribute에 접근은 가능하지만, 외부 프로그램에 의해서 변경되는 것을 예방할 수 있다.

이전 글에 사용한 소스코드를 다시 참고해보자.

REPORT ZCA_VEHICLE.

CLASS CL_VEHICLE DEFINITION.
    PUBLIC SECTION.
    TYPES ty_speed TYPE i.
    
    METHODS inc_speed IMPORTING im_speed TYPE ty_speed.
    METHODS dec_speed IMPORTING im_speed TYPE ty_speed.
    METHODS stop.
    METHODS get_speed RETURNING VALUE(r_speed) TYPE ty_speed.
    
    PRIVATE SECTION.
    DATA : speed TYPE i.
    
ENDCLASS.

CLASS CL_VEHICLE IMPLEMENTATION.

    METHOD inc_speed.
    ADD im_speed TO speed.
    ENDMETHOD.
    
    METHOD dec_speed.
    SUBTRACT im_speed FROM speed.
    ENDMETHOD.
    
    METHOD stop.
    speed = 0.
    ENDMETHOD.
    
    METHOD get_speed.
    r_speed = speed.
    ENDMETHOD.
    
ENDCLASS.

speed 라는 Attribute는 PRIVATE SECTION에 선언되었기 때문에, CL_VEHICLE에서는 오직 메소드에 의해서만 접근이 가능합니다. 일반적인 규칙으로, 모든 Attributes들은 클래스의 PRIVATE SECTION에 선언되는 것이 좋습니다. Attrubutes에 대한 어떠한 외부 접근은 PUBLIC SECTION에 선언된 getter & setter methods를 통해서 가능하게 하는 것이 좋습니다.

즉, Attribute는 PRIVATE SECTION에 선언하여, 외부 접근을 방지하고 접근은 오로지 PUBLIC SECTION의 METHOD를 통해는 것이 좋습니다.

클래스에서 정의된 Getther methods와 Setter Methods는 각각 속성을 읽거나, 변경할 수 있습니다. Getther Method의 이름은 일반적으로 Attribute(속성) 이름 앞에 get_이라는 접두사를 붙입니다. 유사하게, Setter Method는 일반적으로 Attribute 이름앞에 set_이라는 접두사를 붙입니다. 당신이 공적으로 접근하고 싶은 각 속성은 자신의 속성을 읽고, 변경하는 Setter Method와 변경하는 Setter Method를 가지게 됩니다.


Static and Instance Components


이전에 설명했읏이, Attributes, Methods, Events와 같은 Class의 components 즉, 클래스의 구성요소들은 Instance component와 Static Component로 선언될 수 있다.

Instance Component는 클래스의 인스턴스에 구체적입니다. 이 의미는 구성요소들이 각 객체에 분리되어 존재한다는 의미입니다. Instance compoents는 object_name->component_name로 접근가능합니다. "->"은 Instance Component Seletor라고 불립니다.

Static Components는 오직 클래스에 한번 존재하고, 런타임시에 모든 인스턴스들에서 볼 수 있습니다. Stataic Componets는 Class_name=>component_name으로 접근할 수 있습니다. "=>"은 Static Component Selctor라고 불립니다.

예를 들어, speed라는 Attribute를 Instance Attribute로 정의했다면, 각 인스턴스들 (cl_vehicle이라는 클래스를 인스턴스화 한 차, 버스, 트럭과 같은) 은 speed라는 Attrubute를 각각의 인스턴스들마다 고유하게 하나씩 가지고 있을 것입니다. 그러나, 만약 Attribute를 Static Attribute로 선언했다면, 클래스마다 오직 단 하나의 속성에 대한 인스턴스가 있기 때문에, 차, 버스, 트럭은 같은 값을 가지게 될 것입니다.

개발자는 Static Attribute를 사용하여 클래스의 모든 인스턴스가 공통으로 사용할 값을 정의할 수 있습니다. 차, 버스, 트럭드로 만들수 있는 CL_VEHICLE에서 공통으로 사용할 값을 정의할 때, Static Attribute로 정의하면 됩니다.

이러한 Static Components는 CLASS-라는 키워드를 접두사로 붙여주면됩니다. 에를 들어, Instace Attribute를 선언할 때는 data라는 키워드를 사용하면 되지만, Static Component를 선언할 때는 Class-data라는 키워드를 사용합니다.유사하게 Method를 선언할 때도, Instance Method의 경우에는 methods라는 keyword를 쓰면 되지만, Static Method의 경우에는 class-methods 구문을 사용합니다. Event의 경우에도 마찬가지로 ,eventsclass-events 로 각각 정의할 수 있습니다.

반응형