Programing Language/Java

[Java] 자바의 참조 자료형(Reference Data Type)

vinedpillar 2022. 6. 15. 23:43

참조 자료형

  • 참조 자료형은 객체의 주소를 참조하는 자료형으로 배열, 클래스, 인터페이스, 열거형 등이 있습니다.
    • 배열(array): 같은 타입의 데이터 여러 개를 한 단위로 묶어서 저장하는 자료형입니다.
    • 클래스(class): 특정 사물이나 개념을 프로그램으로 표현하기 위한 데이터와 함수의 집합체를 뜻합니다.
    • 인터페이스(interface): 클래스 개념을 추상화하여 최소한의 기능만 기술한 추상 자료형입니다.
    • 열거형(enum): 특정 상수를 묶어서 저장하는 자료형입니다.

  • 자바에서 제공하는 8개의 기본 자료형(byte, short, int, long, char, float, double, boolean)을 제외한 모든 타입은 참조 자료형입니다.

 

 

 

기본 자료형과 참조 자료형의 차이

  • 기본 자료형과 참조 자료형의 차이는 값의 저장 방식입니다.

  • 기본 타입으로 선언된 변수는 값 자체를 저장하지만, 참조 타입으로 선언된 변수는 객체가 생성된 메모리의 주소를 저장합니다.

  • 즉 기본 타입은 값을 직접적으로 가지지만, 참조 타입은 값을 간접적으로 보여줍니다.

기본 자료형, 참조 자료형 저장 비교 예시

// String(문자열) 타입의 참조 자료형 
String name = 홍길동;
String gender = 남성;

// int, double 타입의 기본 자료형
int age = 32;
double height = 175.2;
double weight = 69.4;

 

 

 

 

참조 타입의 값 비교

  • 참조 타입의 변수는 실제 값이 아닌 자료를 저장하고 있는 주소값을 저장하고 있기 때문에 실제 저장하고 있는 값이 같아도 저장하고 있는 메모리의 번지수가 다르면 서로 다른 변수로 판단합니다.

  • 반대로 다른 변수명을 가지고 있더라도 같은 메모리의 주소값을 참조하고 있다면 같은 값으로 판단합니다.
// 참조 타입 변수 값 비교

public class ReferenceTypeVariableCompareExample {
	public static void main(String[] args) {
    	// 참조 변수인 String 타입의 변수 생성
        String str1
        String str2;
        String str3;
        
        // str1 변수의 메모리 주소에 "apple"이라는 값 저장 
        // 객체를 새로 생성하기 위해서는 new 키워드 사용 필요 
        str1 = new String("apple");
        // str2 변수의 메모리 주소에 "apple"이라는 값 저장
        str2 = new String("apple");
        // str2의 주소값을 str3 변수에 저장
        str3 = str2;
        
        // 같은 "apple"을 저장하고 있지만 false 출력
        System.out.println(str1 == str2);
        
        // 서로 같은 주소값을 가지고 있기 때문에 true 출력 
        System.out.println(str2 == str3);    
    }
}

 

 

 

 

null 및 nullpointerexception 

  • 참조 타입의 변수는 기본 타입 변수와 달리 값을 간접적으로 표현하기 때문에 null 값을 가질 수 있습니다.
    (기본 타입 변수는 값이 없으면 오류 발생)

  • 참조 타입 변수가 null값을 가지고 있을 때 해당 변수를 다른 곳에서 활용하려고 하는 경우 "nullpointerexception"이라는 오류가 발생합니다.

  • 따라서 nullpointerexception을 피하기 위해서는 참조 타입 변수가 객체를 정확하게 참조하도록 번지를 대입해야합니다. 
    (경우에 따라 참조 타입 변수에 null을 대입하여 활용하는 경우도 있음)