본문 바로가기
프로그래밍언어/Java

05-1. 참조 타입과 참조 변수

by 스꼬맹이브로 2021. 1. 18.
728x90
반응형
SMALL

* 자바는 객체 지향 언어로써 객체를 학습하기 전에 참조 타입의 종류와 참조 변수의 역할이 무엇인지 정확히 이해하는 것이 중요함.

 

기본 타입은 이전에 공부한 내용이므로 참조 타입부터!

 

참조 타입이란? 

  • 객체(object)의 번지를 참조하는 타입
  • 배열, 열거, 클래스, 인터페이스가 있음

<기본 타입과 참조 타입>

기본 타입으로 선언된 변수와 참조 타입으로 선언된 변수의 큰 차이점 = 저장되는 값

기본 타입은 실제 값을 변수 안에 저장하지만, 참조 타입은 메모리의 번지를 변수 안에 저장

≫ 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부름.

 

메모리에서 변수들이 갖는 값을 그림으로 표현하면 다음과 같다.

기본 타입 변수인 age와 price는 직접 값을 저장하지만, String 클래스 변수인 name과 hobby는 힙 영역의 String 객체 번지 값을 가지고 있다.

이처럼 번지를 통해 객체를 참조하기 때문에 String 클래스 변수를 참조 타입 변수라고 한다.

 

<메모리 사용 역역>

먼저 jvm은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 세부 영역으로 구분해서 사용

<메소드 영역>

메소드 영역(Method Area) : JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역

코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메소드 코드, 생성자 코드 등을 분류하여 저장

 

<힙 영역>

힙 영역(Heap Area) : 객체와 배열이 생성되는 영역

생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조함.

만약 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 JVM이 쓰레기로 간주하고 자동으로 제거

 

<JVM 스택 영역>

JVM 스택은 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행

스택 영역에 변수가 생성되는 시점은 초기화가 될 때(최초로 변수에 값이 저장될 때)이다.

변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거됨.

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

참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용

즉, 번지 값을 비교하는 것

 

여기서 refVar1과 refVar2는 서로 다른 객체를 참조하므로 ==연산 결과는 false이며 !=연산 결과는 true로 반환된다.

<null과 NullPointerException>

참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null(널) 값을 가질 수 있음.

참조 타입 변수가 null 값을 가지는지 확인하려면 ==, != 연산을 수행

다음의 경우, refVar1은 값을 가지기 때문에 refVar1 == null의 연산 결과는 false가 된다.

하지만 refVar2는 null값을 가지므로 refVar2 == null의 연산 결과는 true가 된다.

 

자바는 프로그램 실행 도중에 발생하는 오류를 예외(Exception)라고 부른다.

예외 발생 원인은 사용자의 잘못된 입력, 프로그래머의 코드가 잘못 작성된 경우 등으로 참조 변수를 사용하면서 가장 많이 발생하는 예외 중 하나로 NullPointerException이 있다.

NullPointerException은 참조 타입 변수를 잘못 사용하면 발생된다.

<String 타입>

  • 자바는 문자열을 String 변수에 저장하기 때문에 String 변수를 우선 선언해야 하며, 큰따옴표로 감싼 문자열 리터럴 대입
    (변수 선언과 동지에 문자열 저장도 가능)
  • 자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있음.

ex) name1과 name2가 홍길동을 저장하는 경우

  • 또는 new 연산자를 통해 객체를 만들수 있음(new = 객체 생성 연산자)
    ex) String name1 = new String("홍길동");
         String name2 = new String("홍길동");

두 객체는 다른 객체로 생성되며, == 또는 != 연산 수행 시 다른 객체라는 결과로 반환된다.

public class StringEqualsExample {
	public static void main(String[] args) {	
		String strVar1 = "신민철";
		String strVar2 = "신민철";
		
		if(strVar1 == strVar2) {
			System.out.println("strVar1과 strVar2는 참조가 같음");
		} else {
			System.out.println("strVar1과 strVar2는 참조가 다름");
		}
		
		if(strVar1.equals(strVar2)) {
			System.out.println("strVar1과 strVar2는 문자열이  같음");
		}
		
		String strVar3 = new String("신민철");
		String strVar4 = new String("신민철");
		
		if(strVar3 == strVar4) {
			System.out.println("strVar3과 strVar4는 참조가 같음");
		} else {
			System.out.println("strVar3과 strVar4는 참조가 다름");
		}
		
		if(strVar3.equals(strVar4)) {
			System.out.println("strVar3과 strVar4는 문자열이  같음");
		}		
	} 
}

결과 :

728x90
반응형
LIST

'프로그래밍언어 > Java' 카테고리의 다른 글

05-3. 열거 타입  (0) 2021.01.24
05-2. 배열  (0) 2021.01.19
04-2. for문, while문, do-while문  (0) 2021.01.12
04-1. if문, switch문  (0) 2021.01.11
03-2. 연산자의 종류  (0) 2021.01.08