상세 컨텐츠

본문 제목

JAVA 5. 참조타입과 참조변수, new 연산자

Backend/JAVA-자바

by 사랑짱 2021. 5. 21. 08:41

본문

 

◆ 참조 타입(Reference type)

- 객체의 번지를 참조하는 타입

- 메모리의 번지(주소값)을 변수 안에 저장

  (변수의 값 즉, 객체는 힙 영역에 저장)

- 참조타입에서 Null은 객체의 주소를 가리키고 있지 않은 상태를 의미

 

 

 참조 타입의 종류

- 배열 타입

- 열거 타입

- 클래스(EX. String)

- 인터페이스

 

  참조타입의 값은 결국 모두 객체이다. 문자리터럴도, 매열도 모두 객체이다!

※ 모든 참조타입은 객체의 주소를 담기 때문에 메모리 사용크기는 모두 8byte이다!

※ 자바 소스 파일(xxx.java) 안에는 오로지 하나의 참조타입만 선언해야 한다!

   (배열은 자료구조니까 제외되며, 예외 케이스 有)

 

 

 메모리 사용 영역

- 기본 타입 변수의 메모리 사용 : 실제 값을 변수 안에 저장

- 참조 타입 변수의 메모리 사용 : 객체의 주소(번지)를 저장

 

1. 메소드 영역

- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역

 

2. 힙 영역 

- 객체와 배열이 생성되는 영역

- 생성된 객체는 식별자(Object ID/해쉬코드)를 갖는다. 

 

3. JVM 스택 영역

- 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면

  해당 프레임을 제거하는 동작 수행( EX. 로컬변수 )

 

 

 참조변수의 ==, != 연산

참조타입의 변수들은 객체의 주소값을 가지고 있기 때문에

참조타입 변수들 간의 ==, != 동등 비교 연산은 동일한 객체를 참조하는지,

즉 같은 주소값을 가지고 있는지를 비교할 때 사용

 

<예시 - String 타입>

문자열 참조타입이기 때문에 String 변수에 직접 저장되는 것이 아니라

변수는 String객체의 주소값만을 저장하고, 객체는 힙영역에  생성된다.

 

이때, 문자열 리터럴이 동일하다면 기본적으로 객체의 주소를 공유한다.

   (new 연산자로 새로운 객체를 만든다면 동일한 리터럴이라도 서로 다른 객체를 참조)

 


< 참고 > 객체의 레퍼런스 체계

- 레퍼런스(주소값) 표현식 -----> " FQCN@<객체의 논리적인 주소> "
- FQCN : Fully Qualified Class Name(풀패키지 명)을 의미
  (ex. 패키지 a.b.c, 생성한 클래스명 : Sarang 인 경우 -> FQCN : a.b.c.Sarang)
- 객체의 논리적인 주소 : 객체의 식별자(해쉬코드)를 16진수로 표현한 값

※ Object 클래스의 toString() : String 타입으로 레퍼런스를 반환
※ String 클래스의 toString() : 문자열 리터럴을 반환하도록 오버라이딩되어 있음!

 

 

New( ) 연산자의 역할

New( ) 연산자는 객체 생성 연산자

New( ) 연산자의 세가지 역할을 기억하자!!

 

1. 힙영역에 객체를 생성한다.

2. 생성자를 호출하여 생성한 객체를 초기화한다.

3. 초기화까지 끝낸 객체의 주소를 반환한다.

 

 

 Null(널)

- 참조타입의 변수가 참조하는 객체가 없을 경우 초기값으로 사용

   (기본타입의 변수에는 사용할 수 없다!!)

- null로 초기화된 참조 변수는 스택영역에 생성

- ==, != 동일비교연산이 가능(true/false로 반환)

 

 

관련글 더보기