기본형과 참조형의 공유

자바의 데이터 타입을 가장 크게 보면 기본형(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

기본형변수 ab 는절대로하나의값을공유하지않는다. b=a 라고하면 자바는 항상값을 복사해서 대입한다. 이 경우 a 에 있는 값 10 을복사해서 b 에 전달한다.

결과적으로 ab 는 둘 다 10 이라는 똑같은 숫자의 값을 가진다. 하지만 a 가 가지는 10b 가가지는 10 은 복사된 완전히 다른 10 이다. 메모리 상에서도 a 에 속하는 10b 에 속하는 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);

	}
}