값 타입과 참조 타입의 차이
값 타입과 참조 타입의 차이
값 타입 vs 참조 타입
가장 큰 차이점은 데이터가 저장되는 메모리 상의 위치이다.
편의상 값 타입은 원시 타입(Primitive Type)이라고 부르겠다. 참조 타입(Reference Type)
- 원시 타입 : 크기가 작고 고정적이기 때문에 스택 영역에 저장된다.
- 참조 타입 : 크기가 크고 가변적이기 때문에 동적으로 관리되는 힙에 저장된다.
이처럼 저장되는 위치의 차이는 여러 차이점을 만든다.
1) 메모리 및 접근 속도
- 원시 타입
- 선언시 스택에 즉시 생성되므로 선언 직후부터 데이터를 저장하는 용도로 사용할 수 있다.
- 참조 타입
- 선언에 의해 참조만 생성될 뿐, 데이터를 저장할 수 있는 실제 메모리가 할당된 것은 아니다. 따라서 선언 즉시 사용할 수 없다. 반드시 new 연산자로 메모리를 할당받아 초기화해야 한다.
- ‘스택’ 메모리에는 참조값만 존재하고 실제 값은 ‘힙’ 메모리에 존재한다. 값을 필요로 할 때마다 언박싱 과정을 거쳐여 하므로 원시타입과 비교해서 접근 속도가 느려진다.
예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 참조 타입이 좋을 수도 있다.
Boolean의 경우에는 128배나 많은 메모리를 사용하게 된다.
2) 소멸 시점
- 원시 타입 : 변수를 선언한 메소드가 종료될 때 혹은 소속된 객체가 사라질 때, 소멸된다.
- 참조 타입 : 더 이상 참조하는 변수가 없을 때 GC에 의해 제거된다.
3) 복사
- 원시 타입 : 복사에 의해 별개의 복사본이 생성되며 복사 후 원본과 복사본은 별개의 변수이다. 완전히 다른 두 개의 변수가 생성되는 것이다.
- 참조 타입 : 참조 타입끼리의 대입은 힙 영역에 존재하는 데이터를 참조하는 참조자가 하나 더 늘어날 뿐이다. 따라서 별도의 메모리가 추가로 할당되지 않는다. 그래서 둘 중 하나를 변경하면 다른 참조자는 같은 값을 참조하기 때문에 같이 변경된다. (해결하기 위해서는 Deep Copy 해야 한다.)
4) Null
- 원시 타입 : Null 값을 저장할 수 없다.
- 참조 타입 : Null 값을 저장할 수 있다.
결론
성능과 메모리에 장점이 있는 원시 타입을 먼저 고려해본다. 만약, Null을 다뤄야 하거나 제네릭 타입에서 사용되어야 한다면 참조 타입을 사용한다.
참고
This post is licensed under
CC BY 4.0
by the author.
