JAVA/JAVA Basic

[ JAVA ] 참조타입(reference type)

IT록흐 2021. 6. 18. 20:02
반응형

 

 

자바 변수 타입에는

두 가지가 있다.

 

원시 타입(primitive) and 참조 타입(referece)

 

변수에 '값'을 넣으면

원시 타입이다.

 

변수에 '주소'를 넣으면

참조 타입이다.

 

 

변수에 주소를 넣는 이유가 무엇일까?

출처 입력

 

JVM은 메모리를 할당받고

메모리 영역을 크게 3가지로 나눈다.

 

 

 

메소드 영역은

객체 생성을 위한 설계도인

클래스를 저장한다.

 

HEAP 영역은

그 클래스를 토대로

만들어진 객체를 저장한다.

 

STACK 영역은

한 스레드(main())가 시작될 때

그 스레드의 흐름에 따라

생성되는 변수를 임시 저장한다.

 

 

STACK 영역은 스레드가 시작되어야 메모리가 할당된다. 스레드가 얼마나 클지 언제 시작될지도 모르는 영역을 큰 영역으로 잡아놓으면 메모리 낭비다. 그러므로 STACK 영역은 크지 않다. 그래서 크기가 큰 객체들을 저장시키지 못한다.

 

이것이 변수에 주소를 저장시키는 이유다.

 

Heap 영역에 객체가 저장되므로 Stack에서 객체 데이터가 필요하면 주소를 타고 Heap을 갔다와야한다. Stack에서 객체의 주소를 저장시키는 변수가 바로 '참조타입변수'이다.

 

 

원시타입(primitive) : 수, 문자, 논리

참조타입(reference) : 문자열(String), 배열, 열거, 클래스, 인터페이스

 

public class ReferenceType {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String tmp1 = "JAVA";
		String tmp2 = "JAVA";
		String tmp3 = new String("JAVA");
		
		if(tmp1 == tmp2) 
		{
			System.out.println("같은 객체입니다.");
		}
		
		if(tmp1 != tmp3) {
			System.out.println("다른 객체입니다.");
		}
	}

}

 

 

String 타입은 참조타입으로 String 변수는 주소를 저장한다.

그러므로 연산자 ==, != 는 값이 아닌 주소의 일치, 불일치를 따진다.

 

tmp1, tmp2 는 문자열 리터럴 "JAVA"를 넣어준다.

(*리터럴은 변수와 상수에 할당되는 원시 값을 의미한다.)

 

그리고 tmp3는 new 연산자로 새로운 String 객체를 생성해준다.

new 연산자는 Heap 영역에 객체를 생성하라는 명령이다.

 

 

 

이처럼 참조타입 변수에는 주소가 저장되어있음을 알 수 있다. 그러므로 만약 참조타입변수를 초기화하지 않으면 null이 디폴트로 저장된다. 그럼 주소가 아닌 String 변수가 가리키는 문자열을 비교하려면 어떻게 해야될까? equals() 메소드를 이용해준다.

 

public class ReferenceType {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String tmp1 = "JAVA";
		String tmp2 = "JAVA";
		String tmp3 = new String("JAVA");
		
		if(tmp1.equals(tmp2)) 
		{
			System.out.println("tmp1과 tmp2는 같은 문장입니다.");
		}
		
		if(tmp1.equals(tmp3)) {
			System.out.println("tmp1과 tmp3는 같은 문장입니다.");
		}
	}

}

 

 

tmp1과 tmp3는 다른 객체이지만

문자열 내용은 같다.

 

 

 

 

 


 

정리

 

 

1. 참조 타입은 주소를 저장하는 변수타입이다.

2. 그 주소는 Heap영역의 객체를 가리킨다.

3. =,!= 연산자는 주소를 비교한다.

 

 

 

 

 

 

 

 

 

 

 

반응형