본문 바로가기
STUDY/Java

[Java] 참조타입(Reference)

자바의 데이터 타입은 크게 기본 타입(Primitive Type) 과 참조 타입(Reference Type) 으로 구분할 수 있습니다.

 

기본 타입(primitive type) 은 아래 포스팅을 참고하시면 됩니다.

 

[Java] 변수

변수(Variable) 는 하나의 메모리를 담는 공간을 의미합니다. 변수를 설정하는 방법은 아래와 같습니다. int num = 10; 위와 같이 직접 입력된 값을 리터럴(literal) 이라고 합니다. 리터럴은 상수(constant) 와..

eatkoala.tistory.com

 


 

ㅁ 참조타입 (Reference Type)

 

참조변수의 타입으로는 배열, 열거, 클래스, 인터페이스가 있습니다.

참조타입 변수는 우선 변수이기 때문에 스택 영역에 할당된다. 하지만, 값이 아닌 주소 값을 가지게 됩니다.

이 주소 값은 참조 타입으로 생성된 힙 영역의 객체 등의 주소입니다.

[참조타입 변수 메모리 구조]

 

위의 그림을 예로 들면, 배열 변수인 'num' 이 스택영역에 할당되고,

힙 영역에 생성된 배열을 가리키고 있는 것을 알 수 있습니다.

이 가리키는 의미는 주소 값을 가지고 있다는 것을 의미하고, 이 주소값을 통해 해당 객체에 접근이 

가능한 것입니다.

 

// num : stack
// new int[] : heap

int[] num = new int[]{10,20};

 

ㅁ 주소 값 비교

 

우선 참조 타입의 주소 값을 비교하기 위해서는 '==' 와 equals() 함수 를 사용할 수 있습니다.   

* 최상위 클래스인 Object 에서 제공하는 함수이다.

 

People p1 = new People();
People p2 = p1;
People p3 = new People();
		
System.out.println(p1==p2);              // true
System.out.println(p1.equals(p2));       // true
System.out.println(p1==p3);              // false
System.out.println(p1.equals(p3));       // false

 

위의 코드에서 생성한 변수는 모두 동일하게 People 클래스 타입의 객체를 가리키고 있는 변수들입니다.

하지만, 결과에서 알 수 있듯이 주소 값이 2개는 동일하고 하나는 다른 것을 확인할 수 있습니다.

주소 값이 동일하다는 의미는 힙 영역에서 동일한 객체를 가리키고 있다는 것을 의미합니다.

 

이는 값을 변경해보면 쉽게 이해하실 수 있을 겁니다.

 

People p1 = new People();
People p2 = p1;
People p3 = new People();
		
p1.age = 10;
System.out.println("P1 age : " + p1.age);    // 10
p2.age = 20;
System.out.println("P1 age : " + p1.age);    // 20		

 

분명 p2 변수에서 값을 변경했는데, p1 변수가 담고 있는 객체의 값이 변경된 것을 확인할 수 있습니다.

이는 두 변수가 동일한 객체를 가리키고 있다는 것을 의미합니다.

 

* 그림이 있으면 이해하기 편하다........ ( 알아서 찾아보도록 하자...... 죄송합니다...)

 

 

변수가 어떤 객체도 참조하지 않는 의미로 'NULL' 값을 설정할 수 있습니다.

이는 변수가 어떤 객체의 주소값을 가지지 않는다는 의미입니다. ( 빈 공간을 의미 )

 

 


 

ㅁ 문자열(String)

 

 

앞서 문자열은 String 클래스를 사용한다고 했다. 즉, 참조 타입인 것입니다.

우선 문자열을 변수에 할당하는 방법은 2 가지가 있습니다.

String str1 = "Hello";
String str2 = new String("Hello");

 

먼저 첫 번째의 경우는 리터럴을 할당하는 것입니다.

여기서 리터럴 값은 문자열 객체로 Heap 영역에 할당됩니다.

 

String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);       // true

 

위에서처럼 두 개의 변수가 동일한 리터럴 객체를 가리키고 있습니다.

 

두 번째의 경우는 String 클래스의 객채를 생성해 각각 할당하는 것입니다.

이 경우는 같은 문자열이여도, 담고 있는 주소값이 다른 것을 확인할 수 있습니다.

 

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));

위는 같은 문자열이여도, 담고 있는 주소값이 다른 것을 확인할 수 있습니다.

 

* 문자열 비교함수 : equals() cf) Object 는 주소 값 비교.

 

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

[Java] 변수  (0) 2019.11.04