참조의 참조를 쓰는 이유
참조의 참조 : 링크드 리스트, 인터페이스와 구상 클래스, 클래스와 인스턴스, 디자인 패턴(데코레이터 패턴) 등등
- Memory
- Address (메모리의 주소)
- Pointer (메모리의 주소를 가리키는 pointer)
- Variables (위 모두를 아우르는 variables)
- Dispatch
메모리 주소의 크기 : 32bit 컴퓨터인지 64bit 컴퓨터인지가 여기서 나뉘어진다.
32bit 컴퓨터 메모리 하나당 최대 용량 4GB이다.
메모리 한개 블록은 32bit, 64bit 상관없이 4byte로 나누는 경우도 있다.
코드 순서
- A = “TEST” (A라는 변수에 TEST 값을 할당)
- B = &A (B라는 변수에 A의 메모리 주소값을 할당)
- C = B, D = B (C라는 변수와 D라는 변수에 B값(A의 주소값)을 할당)
- B = &K (B에 K의 메모리 주소값을 할당)
3번에서 C와 D에는 B값(A의 주소값)이 할당되어있다.
하지만 4번에서 B는 K의 메모리 주소값을 할당받았다.
결과적으로 코드상에선 C = B, D = B라고 되어있지만 사실 같지 않다.
여기서부터 코드가 오류를 발생시킬 리스크가 엄청나게 커지는 것이다.
해결방법
- 함수형 패러다임 : 참조사용 금지, 값만 사용
- 객체 지향 : 직접참조사용 금지
함수형 프로그래밍이란 ‘순수함수’로 소스를 작성하는 것을 말한다.
‘순수함수’ 외부에 영향을 주지 않고 같은 input이 들어갔을 때 같은 output이 나와야된다.
즉, 함수형 프로그래밍에선 참조를 쓰지 말라고 권고하는 것이다.
참조를 하면 원래 값에 영향을 줄테니까 말이다. (딥카피를 활용..)
const a = {
value: 3,
v: 4
}
b.value; // 3; 더블 디스패치, 디스패치 후 value랑 또 디스패치
- A = “TEST” (A라는 변수에 TEST 값을 할당)
- B = {VALUE: &A, V: 3} (B라는 객체 안의 VALUE 프로퍼티에 A의 메모리 주소값 할당)
- C = B, D = B (C라는 변수와 D라는 변수에 B 객체의 주소 할당)
- B.VALUE = &K (B의 VALUE값을 K의 메모리 주소값으로 재할당)
이렇게해도 C와 D는 B 객체 주소만을 가지고 있으므로 문제없다.
- 링크드 리스트
- 클래스와 인터페이스
모두 위와 같은 원리를 따른다.