기본 자료형 (Primitive Data Types)
- int, float, double, long, boolean ... 등 소문자로 시작되는 자료형이다.
- 기본 자료형에 아무 값도 지정하지않은경우 기본값은 0이다.
- 가지고 있는 메소드가 없다.
참조 자료형(Non-Primitive, Reference Data Types)
- String, Camera, SpeedCam .. 대문자로 시작되는 자료형이다. (클래스명 포함)
- 참조 자료형에 아무값도 입력하지 않은 경우엔 null 로 표현한다.
- 메소드를 가질 수 있다.
아래 예제를 통하여 기본자료형과 참조자료형의 차이를 이해해보자.
먼저 기본자료형인 int 예제를 살펴보자.
b=a 실행 시 변수 b에 a의 값을 적용하고, 이후 a와 b의 값을 변경했을때 a와 b는 별개로 수정되었다.
그런데 참조자료형인 Camera 객체를 살펴보면 c2=c1 실행 후 c2.name만 변경해도 c1.name이 함께 수정되는 것을 확인할 수 있다.
이는 참조자료형의 특성이다.
참조자료형은 어떠한 메모리 공간 안에 만들어져있는 것을 참조하고 있는 개념이다.
참조하고 있는 대상을 풍선으로 비유하여 보자면 최초 c1, c2 객체가 생성될 때 c1객체는 첫번째 풍선을, c2객체는 두번째 풍선을 참조하게 된다.
그런데 c2=c1 을 실행하게 되면 두번째 풍선을 가리키고 있던 c2가 첫번째 풍선을 참조하게 된다.
즉 c1과 c2가 같은 풍선(첫번째 풍선)을 가리키게 되는 것이다.
c1, c2 모두 동일한 풍선을 참조하고 있으므로 c1.name이나 c2.name 중 하나만 변경되어도 첫번째 풍선의 값이 달라지게되므로 c1.name, c2.name의 값이 모두 바뀌게 되는 것이다.
즉 기본자료형은 a=b 를 실행할 때 값만 달라지게 되지만, 참조자료형은 가리키는 대상이 달라지는것이다.
아래의 changeName 이라는 메소드를 생성하여 한번 더 확인해보자.
changeName 메소드를 실행하여 c2 객체의 camera.name = "잘못된 카메라"로 수정하게 되면 c1 객체의 name도 함께 수정되는 것을 확인할 수 있다.
이처럼 참조자료형의 경우 참조를 동일하게 설정하게 되면 모든 값이 동일하게 변경된다는 점에 유의하여야한다.
참고로 c2가 가리키는 객체의 참조 관계를 끊고 싶은 경우에는 해당 객체의 값을 null 로 설정해주면 된다.
c2 = null;
위와 같이 c2 = null 로 변경한 후 c2.name에 접근하게 되면 "NullPointerException" 오류가 발생된다.
이는 c2의 값이 null이므로 해당 객체 내에 .name을 찾을 수 없어서 발생되는 오류이다.
'Spec UP - Backend > 나도코딩의 자바기본편' 카테고리의 다른 글
Chap_07. 열거형(Enum) (1) | 2023.05.03 |
---|---|
Chap_07. Final (0) | 2023.05.02 |
Chap_07. Super (0) | 2023.04.28 |
Chap_07. 다형성 (0) | 2023.04.28 |
Chap_07. 메소드 오버라이딩 (0) | 2023.04.28 |
댓글