객체지향

OOP Interface 를 왜 사용하는가 ?

소행성왕자 2020. 7. 27. 13:45

본내용은 코드스피츠 강좌를 이용하여 만든점을 참고드립니다.

자세한 내용은 아래 동영상을 참조하세요

https://www.youtube.com/watch?v=sWyZUzQW3IM&list=PLBNdLLaRx_rI-UsVIGeWX_iv-e8cxpLxS&index=1

 

 

객체지향을 하다보면 Interface 를 사용하게 자주 보입니다.

그렇다면 왜 Interface 를 사용한지 고찰해보록 합시다.

 

여기 가상의 메모리 테이블이 있습니다.

 

여기에 A 라는 변수에 TEST 라는 값을 넣어보도록 하죠

 

 

 

A 의 주소는 11번을 가르키고 있습니다.

 

 

 

B 라는 변수에 A 의 주소값을 입력합니다.

B(26주소) 의 값에는 11번인 A 의 주소값이 입력됩니다.

 

 

 

*B = "TEST"

B 의 주소가 가르키는 값은 찾아보면 "TEST" 값이 나옵니다.

 

 

C 와 D 값이  B 값으로 채워집니다.

C(17번) D(26)번은 모두 11로 채워지겠죠.

여기서 11은 값이 아니라 주소값입니다.

C, D, B 는 원래의 A 값 즉 11번 주소를 가르키고 있습니다.

 

 

그런데 여기서 B 가 배신을 한다고 한다면

K = "ABC" (28번)

B = &K 

B(26)은 11번을 가지고 있다가 28번으로 변경되었습니다.

 

 

그렇다면 구체적으로 어떤일이 발생할까요?

 

B(26주소) 는 K(28주소) 를 가르키고 있는데 

C(17주소) 와 D(36주소) 는 A(11주소)를 가르키고 있습니다.

 

여기서 문제가 발생합니다.

문제는 코드상에서 분명 C 와 D 는 B 와 같아야 하는데

B(26주소) 만 K(28주소) 를 가르키고 있습니다.

 

이것은 큰 문제를 일으킬수 있습니다.

분명 우리는 C=B, D=B 이 코드로 인해 C = D = B 를 믿고 있는데 엉뚱한 결과가 나오기 때문입니다.

이것을 참조의 전파라고 합니다.

참조는 한번 만들어지고 노출되면 무조건 전파되서 아래와 같은 현상을 만듭니다.

이렇게 되면 무서워서 B 를 건들수가 없게 됩니다.

이것이 바로 직접 참조의 문제 입니다.

직접참조를 하면 바꾸는 순간 모든것이 망가지게 되어 있습니다. 전파가 되버렸기 때문이죠. 

 

 

그렇다면 이문제를 어떻게 해야될까요?

B(01주소) 는 value 와 v 라는 키를 가진 객체를 만듭니다.

value(09주소) 키는 &A 를 가르키고 있고

v(16주소) 키는 3값을 가지고 있습니다.

 

C = B  

위 코드로 인해 C(26주소) 는 01 을 가르키고 있습니다.

 

 

C = B,   D = B 

위 코드로 인해  C(17번)  D(26번) 모두 01 주소를 가르키게 됩니다.

 

 

B.VALUE = &K(28주소)

B.VALUE 값을 &K 값으로 바꿔보도록 하죠  

 

 

B.VALUE = &K(28주소) 코드로 인해 

09번 주소가 11번에서 28번으로 바뀌었습니다.  (09번 주소는 B.VALUE 값 입니다.)

C, D, K 모두 01을 가르키게 됬습니다.

C, D, K 는 모두 01(B.VALUE) 를 통해서 09를 접근하게 됩니다.

 

모두 다 같이 B 를 가르킵니다.

B 의 VALUE 값을 바꿔도 나머지 참조 변수(C, D)  에 문제를 일으키지 않습니다.

 

 

중간에 참조를 변경할경우 B.VALUE 처럼 포인터의 포인터를 사용하면 됩니다.

 

위와 같은 원리가 바로 OOP 의 Interface 의 함수가 구상클래스의 메소드를 호출해서 사용하는 원리 

링크드리스트의 원리

데코렝션 패턴의 원리

입니다.