기본형과 참조형의 공유
자바의 데이터 타입을 가장 크게 보면 기본형(Primitive Type)과 참조형(Reference Type)으로 나눌 수 있다.
하나의 값을 공유하거나 또는 공유하지 않는 다는 것이 무슨 뜻인지 예제를 통해 알아보자.
기본형 예제
기본형은 하나의 값을 여러 변수에서 절대로 공유하지 않는다. 다음 예를 보자.
package lang.immutable.address;
public class PrimitiveMain {
public static void main(String[] args) {
//기본형은 절대로 같은 값을 공유하지 않는다.
int a = 10;
intb=a;//a->b, 값 복사 후 대입
System.out.println("a = " + a);
System.out.println("b = " + b);
b = 20;
System.out.println("20 -> b");
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
a = 10
b = 10
20 -> b
a = 10
b = 20
기본형변수 a 와 b 는절대로하나의값을공유하지않는다.
b=a 라고하면 자바는 항상값을 복사해서 대입한다. 이 경우 a 에 있는 값 10 을복사해서 b 에 전달한다.
결과적으로 a 와 b 는 둘 다 10 이라는 똑같은 숫자의 값을 가진다. 하지만 a 가 가지는 10 과 b 가가지는 10 은 복사된 완전히 다른 10 이다. 메모리 상에서도 a 에 속하는 10 과 b 에 속하는 10 이 각각 별도로 존재한다.
b=20 이라고 하면 b 의 값만 20 으로 변경된다.
a 의 값은 10 으로 그대로 유지된다.
기본형 변수는 하나의 값을 절대로 공유하지 않는다. 따라서 값을 변경해도 변수 하나의 값만 변경된다. 여기서는 변수 b 의 값만 20 으로 변경되었다.
너무 당연한 이야기이다. 그렇다면 이번에는 참조형 예제를 보자.
참조형 예제
package lang.immutable.address;
public class Address {
private String value;
public Address(String value) {
this.value = value;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public void String getValue() {
return value;
}
@Override
public String toString() {
return "Address{" +
"value='" + value + '\\'' + '}';
}
단순히 주소를 보관하는 객체이다.
객체의 값을 편하게 확인하기 위해 IDE의 도움을 받아서 toString() 을 재정의하자
package lang.immutable.address;
public class RefMain1_1 {
public static void main(String[] args) {
//참조형 변수는 하나의 인스턴스를 공유할 수 있다.
Address a = new Address("서울");
Address b = a;
System.out.println("a = " + a);
System.out.println("b = " + b);
b.setValue("부산"); //b의 값을 부산으로 변경해야함
System.out.println("부산 -> b");
System.out.println("a = " + a); //사이드 이펙트 발생
System.out.println("b = " + b);
}
}