▪Object(객체)란? 앞선 글에서 말했듯이 "객체는 클래스의 인스턴스를 의미"한다.
▪객체는 자신의 고유한 이름과 속성을 가지며 클래스가 생성할 수 있는 객체의 수는 무한하다(정해져있지 않다).
클래스 [CLASS 1] ▪속성 ▪메소드 구현 |
왼쪽의 [CLASS 1]을 통해 우측처럼 Class Instance를 여러개 만들 수 있다. | ABAP 프로그램의 내부 선언 ▪Class Instance 1 -> 속성 / 메소드 ▪Class Instance 2 -> 속성 / 메소드 ▪Class Instance 3 -> 속성 / 메소드 |
Object Reference(객체참조)
▪ABAP 프로그램에서 객체에 접근하려면 “객체 참조”를 사용해야 한다.
▪객체 참조는 객체에 대한 포인터로 정의되며 ABAP에서 객체 참조는 항상 객체 참조 변수 내에 존재하게 된다.
▪Object Reference Variable(객체 참조 변수)
ABAP에는 Reference를 포함할 수 있는 두 가지 타입의 변수가 존재
1.객체 참조 변수
2.데이터 참조 변수(Data Reference Variable)
데이터 참조 변수는 객체 참조 변수와 기본 개념은 같다.(Easy ABAP을 본다면 10장 참고 - 추후 정리해서 올릴 예정)
객체 참조 변수는 객체를 참고하는 Reference(참조)를 포함하며 다음 구문을 이용하여 생성한다.
DATA cref TYPE REF TO class
▪"객체 참조 변수”는 이미 존재하는 객체를 참고하거나 초기화 할 수 있다.
▪객체를 가리키는 참조 변수가 객체의 실체를 알고 있으며, 클래스의 인스턴스는 객체를 가리키는 참조 변수를 사용하여 주소를 지정 가능
▪객체 참조 변수를 이용하는 객체들은 객체에 직접 접근할 수 없으며, Reference(객체의 주소)를 이용해야 함.
▪ABAP은 Structure나 인터널 테이블에 사용되는 데이터 타입과 유사하게, 참조 변수를 위해 이미 정의된 데이터 타입이 존재. -> 여기에는 class reference와 Interface Reference 두 가지 객체 참조 타입이 존재.
▪모든 변수와 마찬가지로 객체 참조 변수를 CLEAR 구문으로 초기화할 수 있다.
객체 참조 변수의 초기값은 객체가 참고하는 데이터 타입과 연결되지는 않는다.
Object 생성
▪클래스를 참조하는 ‘cref’라는 객체 참조 변수를 생성하였다면, 이 참조 변수를 이용하여 “클래스의 인스턴스인 객체를 생성”
▪예외적으로,
DATA : l_ref TYPE REF TO OBJECT. 구문과 같이 최상위 클래스 OBJECT를 참조하는 변수 l_ref를 생성하였다면,
인스턴스 생성시 CREATE OBJECT l_ref TYPE class.와 같이 선언하여야한다.
CREATE OBJECT cref [TYPE class].
Object Component 접근
▪객체의 속성(Attribute)과 메서드(Method)에 접근하기 위해
1.ref->attribute 구문
또는
2.CALL METHOD ref->method 구문을 사용한다.
ref->method 구문은 CALL METHOD ref->method 구문의 축약형이다. (4.6버전 이후 메서드의 축약형을 사용가능)
▪또한, 객체가 생성되기 이전에 클래스의 Static 컴포넌트(속성과 메서드)에 접근할 수도 있다.
Static 속성(attribute)에 접근하려면 class=>attribute 구문을 사용하고,
Static 메서드는 CALL METHOD Class=>method 구문을 이용한다.
(Static에 접근할때는 =>을 사용)
<General Object> | <Static Object> |
cref -> attribute | class=>attribute |
CALL METHOD cref- > method | CALL METHOD class=>method |
클래스에서 하나 이상의 인스턴스 생성
▪위에서 봤듯이 CREATE OBJECT 구문을 이용하여 새로운 객체를 생성할 수 있다.
▪프로그램 내에서 같은 클래스로부터 무한한 객체를 생성할 수 있으며, 객체들은 서로 완전히 독립적으로 행동하며 프로그램 내에서 각자의 이름과 속성을 가진다.
<객체 참조 할당>
▪MOVE 구문을 이용하여 다른 참조 변수에 Reference를 할당할 수 있다. 같은 객체에 연결된 객체 참조 변수 내에 Reference를 생성할 수 있으며 MOVE 구문을 사용하거나 할당기호(=)를 사용할 때 시스템은 할당할 수 있는 타입인지 자동으로 체크한다.
1.cref1 = cref2 MOVE
2.cref2 TO cref2
▪위 두가지 예시를 사용하려면 두 개의 클래스는 같은 타입이어야 한다. 즉, 같은 클래스를 참고해야 한다는 의미이다.
예시.
*Class Declarations
CLASS cls DEFINITION INHERITING FROM object.
PUBLIC SECTION.
METHODS: create.
ENDCLASS.
*Class IMPLEMENTATIONs
CLASS cls IMPLEMENTATION.
METHOD create.
WRITE: / 'Object is Created'.
ENDMETHOD.
*GLOBAL DATA
DATA : go_obj1 TYPE REF TO cls,
go_obj2 TYPE REF TO cls.
*Classical Processing Blocks
START-OF-SELECTION.
CREATE OBJECT : go_obj1.
go_obj2 = go_obj1.
CALL METHOD : go_obj2->create.
▪위 예시는 cls라는 클래스로 go_obj1이라는 객체를 생성하였다. CREATE OBJECT 구문으로 go_obj2 객체는 생성하지 않았지만, go_obj2 = go_obj1 구문을 통해 객체가 생성되었다.
(go_obj1는 cls라는 클래스의 인스턴스이며, 참고하는 클래스 타입이 같기 때문에 go_obj2 = go_obj1 구문을 통해 객체를 생성할 수 있다.
<CASTING>
▪casting 기호(?)를 이용해 서로 다른 클래스에서 파생된 객체를 참고하여 또 다른 객체를 생성할 수 있다.
->이때 다른 클래스는 부모 클래스와 부모 클래스를 상속받은 자식 클래스등과 같이 다른 타입을 의미.
-> 자식 클래스는 부모가 가진 속성과 메서드를 재정의하거나 추가 가능
->부모에서 파생된 객체와 자식에서 파생된 객체 타입은 같이 않더라도, 이때는 casting 기호(?)를 이용해 프로그램을 에러없이 실행 가능
'ABAP 프로그래밍 개념 > Object-Oriented ABAP' 카테고리의 다른 글
Object Oriented 언어로서의 ABAP (0) | 2023.01.01 |
---|---|
METHOD (0) | 2020.08.15 |
CLASS [2] 구성요소 (0) | 2020.08.05 |
CLASS [1] (0) | 2020.08.04 |
클래스와 객체의 관계 & 클래스와 인스턴스 (1) | 2020.08.04 |