본문 바로가기

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

Principles of OOP(객체지향 프로그래밍의 원칙들) PART 1

PART 1. 구성요소들 & CLASS 선언 방법


이번 글과 이후 이어질 PART를 통해서, class(클래스), objects(객체), attributes(속성), methods(메소드), encapsulations, instantiation, and constructors에 대해 알아보겠습니다. 글 마지막에서는 직접 class를 정의하고, object를 만들고, method를 직접 호출할 수 있을 정도로 이해가 늘어나셨으면 좋겠습니다.

Objects는 데이터를 encapsulate(캡슐화 : 보여지지않게 한다) 하고 이 데이터를 조작할 수 있는 기능을 만듭니다. 객체의 특성(성격들 - attributes)과 기능(methods)들은 하나의 패키지(묶음)입니다. 이 패키지를 정의하는 것을 Class(클래스)라고 합니다. 프로그램안에서 객체(objects)들을 사용하기 위하여, 객체는 클래스의 인스턴스로 존재할 수 있기 때문에, 반드시 클래스는 먼저 정의되어야 합니다. 다른말로 하자면, 클래스는 같은 행동과 구조를 가지고 있는 객체들의 하나의 체계입니다. 클래스는 객체들이 생성될 수 있는 Blueprint(청사진)으로 역할을 합니다.

"즉, Class 자체는 실세계에의 어떤 것의 속성, 행동을 본따서 설계한 설계도이고, 이 Class를 인스턴스화하여 실제로 사용하는 것이 Object(객체)입니다. "

클래스들은 구성요소로서 attributes, methods, 그리고 events를 가질 수 있습니다. Class의 구성요소들은 static 혹은 instance 형식으로 존재가능하며, 이러한 구성요소들은 가시성의 수준을 다르게 부여받을 수 있습니다.

SE24에서 확인가능한 CLASS의 구성요소들
Component의 두 가지 Type : Static or Instance

Static Components는 객체를 정의할 필요 없이 클래스의 이름의 참조를 통해 바로 접근이 가능합니다. 반면, Instance Components는 정의된 클래스의 인스턴스화된 객체를 통해서 오직 접근이 가능합니다.  Static Component가 프로그램에 접근된다면,  오직 하나의 컴포넌트의 인스턴스가 프로그램의 메모리에 존재하게 되기 때문에, 이후 같은 Static Component에 진행되는 연속적인 접근은 프로그램 메모리에 존재하는 같은 인스턴스를 가르킵니다. 그러나, Instance Components는 객체 참조(reference object)을 통해서만 접근이 가능하기 때문에, 각 객체들은 각각의 분리된 인스턴스(instance)로 존재할 수 있습니다. 그렇기 때문에, 같은 component의 다른 인스턴스로서 각각의 분리된 메모리에서 다른 객체들로 존재할 수 있습니다. 같은 component의 다수의 인스턴스를 가질수 있는 능력은 프로그래밍에 큰 유연성을 가져다 주는데, 개발자가 같은 클래스의 다수의 Objects(객체들 : 각각 자신의 독립된 메모리를 점유하고 있는 객체들)을 정의할 수 있기 때문입니다. 예를 들어, 조직의 조직원을 나타내는 구성요소를 가진 클래스를 정의함에 따라, 프로그램은 각각 의 조직원을 대표할 수 있는 객체를 만들수 있는 클래스를 통해 다수의 객체들을 가질 수 있습니다.

클래스의 구성요소들은 PUBLIC, PROTECTED, PRIVATE로 이루어진 visibility sections(특정 한국말로 정의할 수 있지를 못하겠음) 중 하나에 할당(선언)되는데 visibility sections은 각 구성요소에 누가 접근할 수 있는지를 결정합니다. 

3가지 Visibility Area

Public Section에 할당된 구성요소들은 클래스의 외부에서도 접근이 가능합니다. 예를 들어, 클래스의 attribute가 PUBLIC SECTION에 선언되어 있다면, 이 attribute는 클래스에서 접근할 수 있을 뿐만 아니라, 클래스 바깥의 어떠한 프로그램/Object에서도 접근이 가능합니다.

Component들이 PROTECTED SECTION에 선언되어져 있다면, Components는 같은 클래스나 그 하위 클래스들(subclasses)에서 접근이 가능합니다.

Components들이 PRIVATE SECTION에 선언되어져 있다면, 오직 그 선언된 클래스에서만 접근이 가능합니다.

클래스는 두가지 파트(영역)으로 구성되어 있습니다. 그것은 definition partimplementation part 입니다.

attrtibutes, methods, events 뿐만 아니라 같이 사용되는 constants, types, 그리고 implemented interface 등의 Class의 Components(구성요소)들은 definition part에 선언됩니다.

오직 클래스의 methods만이 implementation part에서 구동됩니다.

아래는 그 예시이다.

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.

위 예시와 같이, Class cl_vehicle은 DEFINITION 영역과 IMPLEMENTATION 영역으로 정의 및 구성되어 있습니다. DEFINITION 영역은 CLASS ~ ENDCLASS라는 구문안에서 DEFINITION이라는 addition 구문을 통해서 정의됩니다. IMPLEMENTAION 영역은 CLASS ~ ENDCLASS라는 구문안에서 IMPLEMENTAION이라는 addition 구문을 통해서 정의됩니다.

cl_vehicle이라는 클래스는 inc_speed, dec_speed, stop, get_speed라는 메소드로 구성되어있고, 각각의 메소드들은 DEFINITION SECTION에서는 PUBLIC SECTION안에서 정의되어있고, IMPLEMENTATION SECTION에서는 각각 METHOD ~ ENDMETHOD 구문을 통해 기능이 정의되어 있습니다.

유저가 정의한 ty_speed는 types 키워드를 통해서 정의되어 있고, speed라는 attribute(속성)은 클래스의 PRIVATE SECTION에 정의되어 있습니다. 클래스의 Method들은 import, export, returning, changing 파라미터를 포함하고 있습니다.

위 구문에서 정의된 클래스 cl_vehicle은 CLASS statement를 통해 정의되었습니다. CLASS statement는 중첩되서 선언될 수 없다. : 이 말은 클래스 안에 클래스를 선언할 수 없다는 의미입니다. 이전에 언급했듯이, 클래스는 PUBLIC SECTION, PROTECTED SECTION, PRIVATE SECTION으로 구분지어지는 Visibility Section으로 구성되어있다. PUBLIC SECTION 아래서 정의된 구성요소들은 클래스의 Public interface를 구성하여, 외부에서도 구성요소에 직접 들어올 수 있게 해줍니다.

PRIVATE SECTION의 구성요소들은 오직 클래스 내부에서만 보입니다. 그 의미는 같은 클래스의 Methods이 이 구성요소들에 접근할 수 있다는 의미입니다. 클래스는 friend 라고 알려진 다른 클래스에게 자신의 private한 구성여소에 접근하는 것을 허락하는 것을 알릴 수 있습니다. 이것은 클래스들 간의 friendship relationship이라고 하는데 추후 알아보도록 하겠습니다. PRIVATE section을 사용해서 클래스의 구성요소들을 외부로부터 숨기는 것을 implementation hiding 혹은 encapsulation이라고 불립니다. 이 것은 외부에 대한 의존성없이 클래스의 내부 구조의 변화에 유연성을 제공합니다. 

PROTECTED SCTION에서의 특정한 가시성은 자신의 클래스 혹은 Subclass에서의 접근을 허락하는데 사용합니다. 위 코드 예시에서 보면, cl_vehicle이라는 클래스의 나머지 Component들이 PUBLIC SECTION에선언된것과 달리,  Attribute인 speed는 PRIVATE SECTION에 선언되어 있습니다.

이후에는 위에서 간략하게 알아본 내용들을 자세히 하나씩 설명해보도록 하겠습니다.

반응형