본내용은 코드스피츠 강좌를 이용하여 만든점을 참고드립니다.
자세한 내용은 아래 동영상을 참조하세요
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 의 함수가 구상클래스의 메소드를 호출해서 사용하는 원리
링크드리스트의 원리
데코렝션 패턴의 원리
입니다.
'객체지향' 카테고리의 다른 글
템플릿 메소드(Template Method) 패턴 실제 적용 사례 - 디자인 패턴 (0) | 2024.08.23 |
---|---|
[ES6] 템플릿 메소드 패턴 예제 (0) | 2022.05.09 |
[헤드퍼스트 디자인패턴] 1. 전략패턴 (0) | 2022.03.29 |
객체지향 디자인 패턴 공부 순서 (0) | 2020.08.31 |