BE전문가 프로젝트

3. 참조 타입과 참조 변수 본문

JAVA

3. 참조 타입과 참조 변수

원호보고서 2023. 11. 6. 22:33

자바는 크게 기본 타입(이전 포스팅 참조)과 참조 타입으로 분류된다.

여기서 참조 타입이란 객체의 번지를 참조하는 타입을 의미한다.

기본 타입 정수 타입
실수 타입
논리 타입
참조 타입 배열 타입
열거 타입
클래스
인터페이스

기본 타입은 선언 시 실제 값을 변수 안에 저장한다. 반면 참조 타입은 메모리의 번지를 변수에 저장한다.

따라서 String 타입으로 저장한 변수안에 있는 값은 힙 영역에 있는 값이 저장된 번지수가 저장되고 int나 char와 같은 기본타입으로 선언된 변수들은 값이 저장된다.

따라서 번지를 통해 객체를 참조하기 때문에 참조타입 변수라고 한다.

 

메모리 사용 영역

메소드 영역

  • JVM 시작 시 생성되며 모드 스레드가 공유하는 공간
  • 클래스(*.class)들을 클래스로더로 읽어 정적 필드와 상수 등을 분류하여 저장

힙 영역

  • 객체와 배열이 생성되는 공간
  • JVM 스택 영역의 변수 및 다른 객체의 필드에서 참조함
  • 필요없이 메모리만 차지하는 변수 및 필드일 시에는 자동으로 Garbage Colllertor가 자동으로 제거함

스택 영역

  • 메소드 호출시 프레임을 추가(push)하고 종료 시 제거(pop)하는동작을 수행
  • 스택영역에 변수가 생성되는 시점은 최초로 변수에 값이 저장될 때

 

참조 타입 변수 저장 

앞에서 말했듯 기본 타입 변수는 스택에 값을 직접 가지고 있지만 참조 타입 변수의 경우 힙영역의 객체 주소를 갖는다.

int[] numArr = {11, 12, 13};

앞에서와 같이 int 타입의 배열을 생성할 시에 배열 변수 numArr은 스택영역에 생성된다.

하지만 실제 numArr안에 있는 11, 12, 13이라는 값이 저장된 배열은 힙 영역에 생성된다. 따라서 실제 numArr에 저장된 값은 힙 영역의 주소값이 저장되있다고 할 수 있다.

 

기본 타입 변수와 참조 타입 변수 == 및 != 연산 비교

기본 타입 변수의 경우 == 연산 시 변수의 을 비교한다.

하지만 참조 타입 변수의 경우 참조하고 있는 객체를 비교한다.

따라서 참조 타입 변수의 값이 동일하다는 것은 번지 주소을 비교한다는 의미를 기지고 있으며 동일한 객체를 참조한다는 의미이다.

 

 

String

String은 참조 타입이다. 따라서 값을 저장할 때 힙 영역에 값이 저장되며 주소값이 저장된다. 따라서 String 변수에 값을 저장한다는 말은 엄연히 말하면 틀린 말인 것이다.

String str1 = "김덕자";
String str2 = "김덕자";
String str3 = new String("김덕자");

 앞에 String 타입의 변수 3개를 선언하였다.

str1과 str2를 비교해보면 동일한 값이라고 출력된다. 하지만 str2와 str3 비교시 다른 값이라는 것을 알 수 있다.

new 연산자로 하는  객체 생성은 힙 영역에 새로운 객체를 생성한다는 의미이다. 따라서 str1과 str2의 주소값은 같지만 새로 생성된 str3는 다른 값을 참조한다는 것을 알 수 있다.

String으로 된 내부 문자열을 비교하고 싶다면 equals()메소드를 사용하는 것이 좋다.

'JAVA' 카테고리의 다른 글

5.객체 지향 프로그래밍(객체 및 Class에 대하여)  (0) 2023.11.07
4. main mathod  (0) 2023.11.06
2. 반복문  (0) 2023.11.04
1. 변수  (0) 2023.11.03
0.JAVA 시작하기  (0) 2023.10.30
Comments