처음부터 차근차근

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

Language/Java

[Java] 기본형과 참조형

HangJu_95 2023. 12. 21. 22:48
728x90

저번 포스팅에서 기본형 타입을 간단하게 알아봤는데, Java에서 사용되는 데이터 타입인 기본형과 참조형에 대해 알아보겠습니다.

 

[Java] Java 변수 선언, 데이터 타입

변수 프로그래밍을 하다 보면 값을 저장해 둘 공간이 필요한데, 그 공간을 변수라고 합니다. 변수(variable)는 이름 그대로 변할 수 있다는 뜻을 의미하며, 공간에 들어간 값은 변할 수 있습니다.

hangju95.tistory.com

기본형과 참조형

Java의 변수 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있습니다.

  • 기본형(Primitive Type) : int, long, double, boolean처럼 변수에 용하는 값을 변수에 직접 넣을 수 있는 데이터 타입
    • 기본형은 소문자로 시작하며, 자바가 기본으로 제공하는 데이터 타입입니다. 기본형은 개발자가 새로 정의할 수 없으며 개발자는 참조형인 클래스만 직접 정의할 수 있습니다.
  • 참조형(Reference Type) : Student student1, int[] students와 같이 데이터에 접근하기 위한 참조(주소)를 저장하는 데이터 타입을 참조형이라고 합니다. 기본형을 제외하고 모두 참조형입니다.
    • 클래스는 모두 참조형입니다.

참고 - String

String은 사실 클래스여서 참조형인데, 기본형처럼 문자 값을 바로 대입할 수 있습니다.

이는 Java에서 특별하게 편의 기능을 제공하고 있기 때문입니다. (나중에 따로 설명)

Java의 대원칙 중 하나

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

 

Java에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것입니다.

기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한다.

(이것말 알면 오늘 학습 끝)

기본형과 변수 대입

package ref;

public class VarChange1 {
    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);
        System.out.println("b = " + b);

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

 

a = 10
b = 10
변경 a = 20
a = 20
b = 10
변경 b = 30
a = 20
b = 30

기본형은 변수에 들어있는 값을 복사해서 전달하기 때문에, a와 b의 값을 각각 따로 변경했을 때 본인의 값만 변경되는 것을 확인할 수 있습니다.

참조형과 변수대입

package ref;

public class Data {
    int value;
}
package ref;

public class VarChange2 {
    public static void main(String[] args) {
        Data dataA = new Data();
        dataA.value = 10;
        Data dataB = dataA;
        System.out.println("dataA 참조값=" + dataA);
        System.out.println("dataB 참조값=" + dataB);
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);
        //dataA 변경
        dataA.value = 20;
        System.out.println("변경 dataA.value = 20");
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);
        //dataB 변경
        dataB.value = 30;
        System.out.println("변경 dataB.value = 30");
        System.out.println("dataA.value = " + dataA.value);
        System.out.println("dataB.value = " + dataB.value);
    }
}

이 친구의 value는 왜 같이 변할까요??

그 이유는 참조형이기 때문입니다.

변수의 대입은 변수에 들어있는 값을 복사해서 대입합니다. 이때 변수 dataA는 x001이라고 한다면, x001을 복사해서 변수 dataB에 대입합니다.

그렇다면? 똑같은 인스턴스를 바라보고 있네??

이렇게 되는 것입니다.

따라서 dataA.value를 변경하든, dataB를 변경하든 동일한 value값을 출력합니다.

기본형과 메서드 호출

이번에는 메서드 호출에서 직접 해보겠습니다.

package ref;

public class MethodChange1 {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("메서드 호출 전: a = " + a);
        changePrimitive(a);
        System.out.println("메서드 호출 후: a = " + a);
    }
    static void changePrimitive(int x) {
        x = 20;
    }
}

 

메서드 호출 전: a = 10
메서드 호출 후: a = 10

a에 값에 재할당을 안했네? 당연히 변할 리가 없습니다.

단지 메서드를 실행했을 때 a의 값을 x에 전달했고, 그리고 x는 20으로 변했을 뿐입니다.
메서드가 종료되면? x는 참조하고 있는 곳이 없기 때문에 제거됩니다.

참조형과 메서드 호출

package ref;

public class MethodChange2 {
    public static void main(String[] args) {
        Data dataA = new Data();
        dataA.value = 10;
        System.out.println("dataA = " + dataA);
        System.out.println("메서드 호출 전: dataA.value = " + dataA.value);
        changeReference(dataA);
        System.out.println("메서드 호출 후: dataA.value = " + dataA.value);
    }
    static void changeReference(Data dataX) {
        System.out.println("dataX = "+ dataX);
        dataX.value = 20;
    }
}

그렇다면 이 친구는 어떻게될까요??

dataX라는 변수에 dataA의 값을 할당했으니, 참조값이 할당되었습니다.

따라서 dataX의 value 멤버를 변경하면, 같은 참조값을 가지고 있는 dataA도 동일하게 value가 변합니다.

 

자바에서 메서드의 매개변수(파라미터)는 항상 값에 의해 전달됩니다. 그러나 이 값이 실제 값이냐, 참조(메모리 주소)값이냐에 따라 동작이 달라지게 됩니다.

  • 기본형: 메서드로 기본형 데이터를 전달하면, 해당 값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수(파라미터)의 값을 변경해도, 호출자의 변수 값에는 영향이 없다.
  • 참조형: 메서드로 참조형 데이터를 전달하면, 참조값이 복사되어 전달된다. 이 경우, 메서드 내부에서 매개변수(파라미터)로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.

참조

 

김영한의 실전 자바 - 기본편 강의 - 인프런

실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다

www.inflearn.com

'Language > Java' 카테고리의 다른 글

[Java] 객체 지향 프로그래밍  (1) 2023.12.24
[Java] 변수와 초기화, null, null  (0) 2023.12.21
[Java] Class와 데이터  (1) 2023.12.21
[Java] Method  (1) 2023.12.15
[Java] Array  (1) 2023.12.15