[Java] 데이터 타입 - 기본형 & 참조형

조민서·2022년 8월 17일
2

JAVA

목록 보기
3/17
post-thumbnail
post-custom-banner

자바의 데이터 타입으로는 기본형 타입(primitive type)과 참조형 타입(reference type) 2종류가 존재한다.


기본형 타입(Primitive type)

기본형 타입은 위 표와 같이 총 8개의 타입들이 존재한다. 자바에서 미리 형식을 정의하여 제공하고 있으며, 기본값이 존재하기 때문에 Null 개념이 존재하지 않으므로 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용하면 된다.

기본형 타입은 실제 값을 저장하는 공간으로, 스택(Stack) 메모리에 저장된다.


참조형 타입(Reference type)

참조형 타입은 기본형 타입을 제외한 모든 타입들을 말한다. 참조형 타입은 기본형 타입과 달리 빈 객체를 의미하는 Null 개념이 존재한다.

참조형 타입은 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로, 힙(Heap) 메모리에 저장된다.


기본형 매개변수와 참조형 매개 변수

자바에서는 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사해서 넘겨준다. 매개변수의 타입이 기본형 일 때는 기본형 값이 복사되겠지만, 참조형이면 인스턴스의 주소가 복사된다.

메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻는다. 하지만 참조형으로 선언하면 값이 저장된 곳의 주소를 알 수 있기 때문에 값을 읽어 오는 것은 물론 값을 변경 하는 것도 가능하다.

기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (read only)
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (read & write)


기본형 매개변수 예제

아래의 change()함수의 매개변수는 기본형 매개변수로 Data d.x를 change() 해보자.

class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data d = new Data(); // (heap)
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        change(d.x);
        System.out.println("After change(d.x)");
        System.out.println("main() : x = " + d.x);
    }

    static void change(int x) { // 기본형 매개변수 (stack)
        x = 100;
        System.out.println("change() : x = " + x);
    }
}

출력
main() : x = 10
change() : x = 100
After change(d.x)
main() : x = 10

'd.x'의 값이 변경된 것이 아니라, change()메서드의 매개변수의 x 값이 변경된 것이다. 즉, 원본이 아닌 복사본이 변경된 것이라 원본에는 아무런 영향을 미치지 못한다. 이처럼 기본형 매개변수는 변수에 저장된 값만 읽을 수 만 있을 뿐 변경할 수는 없다. (read only)


참조형 매개변수 예제

아래의 change()함수의 매개변수는 기본형 매개변수로 Data d를 change() 해보자.

class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data d = new Data(); // (heap)
        d.x = 10;
        System.out.println("main() : x = " + d.x);
        change(d);
        System.out.println("After change(d)");
        System.out.println("main() : x = " + d.x);
    }

    static void change(Data d) { // 참조형 매개변수 (heap)
        d.x = 100;
        System.out.println("change() : x = " + d.x);
    }
}

출력
main() : x = 10
change() : x = 100
After change(d)
main() : x = 100

기본형 매개변수 예제와 달리, change메서드의 매개변수를 참조형으로 선언했기 때문에, x의 값이 아닌 주소가 매개변수 d에 복사 되었다. 이제 main메서드의 참조변수 d와 change메서드의 참조변수 d는 같은 객체를 가리키게 된다. 그래서 매개변수 d로 x의 값을 읽는 것과 변경하는 것이 모두 가능한 것이다. (read & write)


참조형 변환타입

매개변수뿐만 아니라 반환타입도 참조형이 될 수 있다.

class Data {
    int x;
}

public class Main {
    public static void main(String[] args) {
        Data d = new Data();
        d.x = 10;

        Data d2 = copy(d);
        System.out.println("d.x = " + d.x);
        System.out.println("d2.x = " + d2.x);
    }

    static Data copy(Data d) {
        Data tmp = new Data(); // 새로운 객체 tmp 생성한다.
        tmp.x = d.x; // d.x 값을 tmp.x에 복사한다.

        return tmp; // 복사한 객체의 주소를 반환한다.
    }
}

반환타입이 참조형이라는 것은 메서드가 객체의 주소를 반환한다는 것을 의미한다.


데이터 타입 종류

profile
내 두뇌는 휘발성 메모리다. 😪
post-custom-banner

0개의 댓글