LHJ

I'm a FE developer.

2. 참조의 참조를 쓰는 이유

02 Aug 2020 » codespitz_re

참조의 참조를 쓰는 이유

참조의 참조 : 링크드 리스트, 인터페이스와 구상 클래스, 클래스와 인스턴스, 디자인 패턴(데코레이터 패턴) 등등

  1. Memory
  2. Address (메모리의 주소)
  3. Pointer (메모리의 주소를 가리키는 pointer)
  4. Variables (위 모두를 아우르는 variables)
  5. Dispatch

메모리 주소의 크기 : 32bit 컴퓨터인지 64bit 컴퓨터인지가 여기서 나뉘어진다.
32bit 컴퓨터 메모리 하나당 최대 용량 4GB이다.
메모리 한개 블록은 32bit, 64bit 상관없이 4byte로 나누는 경우도 있다.

코드 순서

  1. A = “TEST” (A라는 변수에 TEST 값을 할당)
  2. B = &A (B라는 변수에 A의 메모리 주소값을 할당)
  3. C = B, D = B (C라는 변수와 D라는 변수에 B값(A의 주소값)을 할당)
  4. 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랑 또 디스패치
  1. A = “TEST” (A라는 변수에 TEST 값을 할당)
  2. B = {VALUE: &A, V: 3} (B라는 객체 안의 VALUE 프로퍼티에 A의 메모리 주소값 할당)
  3. C = B, D = B (C라는 변수와 D라는 변수에 B 객체의 주소 할당)
  4. B.VALUE = &K (B의 VALUE값을 K의 메모리 주소값으로 재할당)

이렇게해도 C와 D는 B 객체 주소만을 가지고 있으므로 문제없다.

  • 링크드 리스트
  • 클래스와 인터페이스

모두 위와 같은 원리를 따른다.