본문 바로가기

프로그래밍언어/Java

[Java 기본] 기본형과 참조형

기본형 vs 참조형


변수의 데이터타입은 크게 기본형과 참조형으로 분류할 수 있다. 

기본형 : 사용하는 값을 변수에 저장

          int, long, double, doolean

참조형 : 객체가 저장된 메모리의 위치를 가르키는 참조값(위치, 주소)을 변수에 저장. 

          객체, 배열..

 

* 참고 : String은 클래스라서 참조형이다. 하지만 문자형은 자주 다루기 때문에 자바에서 특별하게 편의기능을 제공한다. 따라서 기본형처럼 직접 문자값을 바로 대입한다. 

 

 

기본형, 참조형의 변수대입


대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다. 

 

기본형 대입

int a = 0;
int b = a;

이 코드에서 2번 라인은 a를 b에 넣어주는 것이 아니다. a의 값을 복사해서 b에 넣어주는 것이다. 

 

참조형 대입

Student s1 = new Student();
Student s2 = s1;

참조형도 마찬가지이다. 변수에 들어 있는 참조값을 복사해서 대입한다. 

 

기본형과 변수 대입


아래 코드를 보고 결과값을 예상해보자. 

 public static void main(String[] args) {
        int a = 10;
        int b = a;
        System.out.println("a= " + a);
        System.out.println("b= " + b);

        // a 값 변경
        a = 20;
        System.out.println("a 변경 a= 20");
        System.out.println("a= " + a);
        System.out.println("b= " + b);

        //b 값 변경
        b = 30;
        System.out.println("b 변경 b= 30");
        System.out.println("a= " + a);
        System.out.println("b= " + b);

    }

 

 

참조형과 변수대입


 

참조형은 어떻게 다를까? 다음의 코드를 보자.

 


    public static void main(String[] args) {
        Data dataA = new Data();
        dataA.value = 10;
        Data dataB = dataA;

        System.out.println("dataA 참조값:" + dataA.value); // 10
        System.out.println("dataB 참조값:" + dataB.value); // 10

        dataA.value = 20;
        System.out.println("dataA 값 변경 dataA.value = 20"); //
        System.out.println("dataA 참조값:" + dataA.value); // 20
        System.out.println("dataB 참조값:" + dataB.value); // 20

        dataB.value = 30;
        System.out.println("dataB 값 변경 dataB.value = 30"); //
        System.out.println("dataA 참조값:" + dataA.value); // 30
        System.out.println("dataB 참조값:" + dataB.value); // 30
    }

 

 

 

dataA는 Data 클래스를 통해서 만들었기 때문에 참조형이다. 이 변수는 객체의 참조값을 저장한다. 

dataB는 dataA의 참조값을 복사해서 대입했으므로 같은 주소값을 가지고 있다. dataA, B 는 같은 인스턴스를 가리키고 있기 때문에 하나의 값을 변경해도 둘 다 적용되는 것이다.  즉, 두 변수는 같은 객체 인스턴스를 참조한다. 

 

 

 

* 인프런 '김영한의 실전 자바 - 기본편'을 참고하여 작성하였습니다.