본문 바로가기

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

Procedural Programming vs Object-Oriented Programming

ABAP에서 가장 대표적인  Procedural Programming(절차적인 프로그래밍) Techniques의 예시는 Function Module과 Subroutines 입니다. 그러나, Class는 다른 말로 하면, OOP Technique를 실행한 겁니다. Procedural Programming에서, Functions는 데이터로부터 분리되어있고 input-output relationships(parameter을 통한)을 사용해서 연결됩니다.

전형적인 ABAP 프로그램은, 아래 그림과 같이, 프로그램 실행하면서 프로그램에서 사용되는 데이터를 선언한 Data Delcarations 부분과, 데이터를 처리하는 ABAP statement(구문)으로 구성되어 있습니다.

Typical ABAP Program

프로그램 코드를 더 뚜렷하고(legible) 더 구조화(the better structure)하기 위해서, 우리는 subroutines나 fucntion module과 같은 Modulization units(모듈화 유닛)을 사용합니다. 이러한 Subroutines과 function modules는 다양한 프로그램에서 재사용가능합니다. 그러나, 메인 프로그램에서, 전역변수(global variable) 에 대한 특별한 보호가 없기 때문에, 전역변수들은 프로그램 내부에서 접근될 수 있고 변화될 수 있습니다.

Function Group and Its Components

위 그림에서 같이, 각 Function Group은 global data area(전역 데이터 영역)로 구성되어있고, 다수의  Function Modules를 가질 수 있습니다. 모든 Function Group안에 Function Module은 Function Group의 Global Data에 접근 할 수 있습니다.

Function Group의 전역 데이터(global data)는 외부에서는(externally) 접근 될 수 없습니다. 예를 들어, ABAP 프로그램에서 Function Module이 호출된다면, 프로그램은 Function Group의 global data area에 직접 접근할 수는 없습니다. Function Group의 global data area에 접근하기 위해서는, 프로그램은 Function Group의 global data area를 조작(manipulate)할 수 있는 해당 Group의 Function Module의 기능의 사용을 필요로 합니다. 그러므로, Function Group은 데이터와 이 데이터를 관리할 수 있는 Function Module의 집합입니다. ABAP 프로그램은 Function Group에 접근할 수 있고, 그 Group안에서의 Function Module의 사용을 통해 Group을 기능을 사용합니다.

위 그림을 보시면, Function Group의 이름을 : fg_vehicle이라고 한다면, 이 Function Group은 속도를 높이거나 줄이거나, 현재 속도를 나타내는 것을 FM_INT_SPEED, FM_DEC_SPEED, FM_GET_SPEED라는 이름을 통해 기능을 제공합니다.이 기능을 위해서 Function Module은 Function Group의 Global Data인 SPEED라는 전역 변수에 접근해야됩니다. 프로그램 ZDEMO_VEHICLE은 직접 Function Group안에있는 SPEED라는 변수에 접근할 수 없습니다. 만약, 메모리에 Function Group의 인스턴스가 하나만 존재할 수 있다고 한다면, 메인 프로그램이 트럭, 버스, 승용차 등의 다양한 탈 것과 작업을 해야될 때는 추가 개발과 관리가 필요할 것입니다.

다른 말로 한다면, Function Module의 호출 각각이 SPEED라는 변수의 같은 인스턴스에 접근을 한다는 말입니다. 이것은 Procedural Programming의 한계 중 하나라고 볼 수 있습니다. Procedural Programming에서는 유사한 기능을 하는 다수의 오브젝트들을 다룰 수 있는 generic template(일반화된 템플릿)를 정의하는 것이 불가능합니다.

다수의 인스턴스를 만들수 있는 클래스의 능력은 OOP의 핵심 속성 중 하나입니다. Procedural Programming과 달리, OOP의 다수의 인스턴스를 지원하는 개념은 개발자가 Real-life object(현실세계의 오브젝트(객체))의 추상화를 가능하게 해줍니다. 예를 들어, 당신이 클래스 cl_vehicle을 만들어서 vehicle의 속성을 통제하는 기능을 정의할 수 있습니다. 이런 경우에 차, 버스, 트럭 등.. 다수의 탈 것에 다수의 오브젝트들을 만들어서 프로그램에서 각 탈 것의 속성을 이끌어내서 다룰 수 있습니다.

OOP에서, 데이터와 기능들은 따로 떨어져서(분리되어서) 존재하지 않습니다. 오히려 같이 개발되어야 합니다. 그 이유로는 Object는 현실 세계의 추상적, 구체적인 것들을 나타내기 떄문에 기능과 속성을 동시에 정의해야합니다. Real-World Entity(현실 세계의 객체)는 오브젝트의 내부 구조, 그리고 데이터(Attributes)을 정의하기 위하여 그것의 특성의 관점에서 바라봐집니다. 그 다음에 오브젝트의 행동을 Method와 Events로 정의합니다. 다른 말로하면, 오브젝트들(객체들)은 데이터와 그 데이터에 관련된 기능들로 구성된 집합입니다. 데이터는 속성(Attribute)로 나타내어지고 기능은 Method로 보통 나타내어 집니다.


아래는 OOP의 핵심 개념들입니다.

1) Delegation of tasks

Objects(객체)는 특정 업무(기능)을 수행하기 위하여 client와 server 두 가지 시스템 모두의 역할을 할 수 있습니다. (client는 데이터 처리의 추제 / server는 처리된 데이터를 받는 역할). 기능의 분배는 불필요한 일을 줄여줍니다. 하나의 객체가 모든 업무를 수행하는 것이 아니라, 하나의 객체가 다른 각체에게 메시지를 보내서 특정 업무를 수행하게 합니다. 이 Priciple of delegation of tasks 는 불필요한 일을 줄여줍니다. 전형적으로 각 객체들은 오직 그 객체의 책임(기능)의 영역 안에 있는 자신에 해당되는 기능만을 수행합니다. 

예를 들어, Vehicle에 연관된 업무를 수행하는 하나의 객체와, Vehicle의 운전자에 관련된 기능을 하는 하나의 객체가 있다고 해봅시다. 이때는 운전자 객체가 Vehicle 객체에게 메시지를 보내서 Vehicle을 통제하는데 관련된 기능을 수행하게 합니다. 이것을 위해서, 각 객체들은 오브젝트 들의 인터페이스인 protocol(프로토콜)을 분명하게 정의하는 것이 좋습니다.

2) Encapsulation(캡슐화)

Encapsulation은 시스템에서 다른 구성요소로부터 객체의 실행(implementation of the object), 즉 객체의 구동되는 과정을 숨기는 것을 통해서 specific implementations(특정 실행 구현부)에 필요하지 않는 경우 종속성이 발생하지 않게 합니다.
예를 들어, 클래스의 PRIVATE SECTION안에있는 구성요소의 실행(Implemetation)을 외부 종속성(클래스의 PRIVATE SECTION에 있는 구성요소에는 어떤 외부 프로그램이나 객체도 접근할 수 없기 때문에) 걱정없이 바꿀 수 있습니다.

3) Inheritance(상속)

클래스 간의 실행관계(Implemetation relationship)은 상속에 의해 정의됩니다. 상속을 사용하면, 하나의 클래스(subclass : 하위 클래스)은 다른 클래스(superclass : 상위 클래스)의 구조(attributes)와 기능(methods)을 적용할 수 있습니다. 하위 클래스(Subclasses)는 슈퍼클래스(Superclass)의 기능과 그 기능 이외로 확장하여 할 수 있습니다. 이것은 소프트웨어 개발 프로세스의 일관성을 증가시킵니다.

4) Polymorphism(다형성)

OOP에서, Polymorphism(다형성)은 같은 메세지에 대해 다른 클래스들의 인스턴스(클래스들이 실제 객체화된 것을 인스턴스라고 함) 가 다르게 반응할 때 발생한다. 개발자는  버스, 차, 트럭과 같은 특정한 객체를 디자인 할 필요는 없다. 대신에, Vehicle이라는 generic object(일반화된 객체)를 디자인하여 상황에 맞게 Vehicle을 버스, 차, 트럭 등으로 사용해야 합니다.

5) Event Controlling

때때로, 특정 객체의 메시지에 대한 반응에 대해서 디자인하는 단게에서 결정하는 것이 어려울 수 있다. 특정 객체에게 메시지들을 다이렉트하게 전송하는 것 대신에, 객체가 Events를 일으키도록 할 수 있다. Event가 객체에 의해 유발되었을 때, 다른 객체들이 그 객체에 반응 할 수 있습니다.\

다음 글들을 통해 이러한 핵심 원리들에 대해서 자세히 설명해보도록 하겠습니다.

반응형