Java

[ch05 참조타입] 참조 타입과 참조 변수

김차루 2022. 7. 11. 17:02

 

 

📆 2022년 07월 10일

⏰ 23시 00분 ~ 22시 00분

✍ 혼자 공부하는 자바(신용권) 

 

 


 

 

1. 기존 타입 & 참조 타입

1) 기본 타입

- 실제 값을 변수 안에 저장

int age = 25; //age = 25
double price = 100.5; //price = 100.5

 

2) 참조 타입

- 메모리의 번지를 변수 안에 저장- 번지를 통해 객체를 참조

String name = "신용권"; //name = 100(번지)--> 신용권
String hobby = "독서"; //hobby = 200(번지)--> 독서

 

2. 메모리 사용 영역

1) 메소드 영역

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

- 클래스들을 클래스 로더로 읽어 클래스별로 분류해서 저장(정적 필드와 상수, 메소드 코드, 생성자 코드 등)

 

2) 힙 영역

- 객체와 배열이 생성

- JVM 스택 영역의 변수나 다른 객체의 필드에서 참조

- 참조하는 변수나 필드가 없다면 쓰레기로 취급 --> 쓰레기 수집기 실행 및 자동 제거

 

3) JVM 스택 영역

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

char v1 = 'A';  -----  1
if (v1 == 'A'){  -----  2
	int v2 = 100;
    double v3 = 3.14;
   }
   
   boolean v4 = true;  -----  3

기본 타입

- ① 실행 --> 스택 영역에 v1 변수 추가

- ② 실행 --> 스택 안 v1 위로 v2, v3 변수 추가

- ③ 실행 전 --> v2, v3 제거

- ③ 실행 --> v4 변수 추가

참조 타입

- 배열 변수 scores => 스택 영역에 생성 | 실제 10, 20, 30을 갖는 배열 => 힙 영역에 생성

- 배열 변수  scores에는 배열의 힙 영역의 주소가 저장

 

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

- 기본 타입 변수 ==, != : 변수의 값이 같은지, 아닌지를 조사

- 참조 타입 변수 ==, != : 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용

 

참조 타입 변수 == 힙 영역의 객체 주소

⭐결국, ==, !=은 번지 값을 비교하는 것

 

- 동일한 번지 값을 갖고 있다는 것 = 동일한 객체를 참조한다는 것

refVar1 == refVar2  <------  결과:false
refVar1 != refVar2  <------  결과:true
refVar2 == refVar3  <------  결과:true
refVar2 != refVar3  <------  결과:false

 

4. null과 NullPointerException

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

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

 

- null 값을 가지는지 확인하려면 연산 수행을 해야함.

refVar1 == null  <-----  결과:false
refVar1 != null  <-----  결과:true
refVar2 == null  <-----  결과:true
refVar2 != null  <-----  결과:false

 

1) 예외

- 프로그램 실행 도중에 발생하는 오류

- 사용자의 잘못된 입력으로 발생할 수도 있고, 프로그래머가 코드를 잘못 작성해서 발생할 수 있음

ex) NullPointerException : 참조 타입 변수를 잘못 사용하면 발생

int[] intArray = null;
intArray[0] = 10; <------ nullPointerException

- intArray는 배열 변수이므로 참조 변수, null로 초기화가 가능

- 참조하는 배열 객체가 없기 때문에 10을 저장하려고 하면 NullPointerException 발생

String str = null;
String.out.println("총 문자수: " + str.length()); <----- NullPointerException

- String 은 클래스이므로 참조 타입, str 변수도 null로 초기화 가능

- length()라는 메소드를 호출하면 str 변수가 참조하는 String 객체가 없기 때문에 NullPointerException 발생

 

 

5. String 타입

- 문자열을 저장하는 변수

- 문자열을 저장하려면 큰따옴표로 감싼 문자열 리터럴을 대입

- name, hobby는 스택 영역에 생성

- '신용권', '자바'는 힙 영역에  string 객체로 생성

- name, hobby 변수에는 String 객체의 번지 값이 저장

 

1) new 연산자

- 힙 영역에 새로운 객체를 만들 때 사용하는 연산자

String name1 = "신용권";
String name2 = "신용권";
String name3 = new String("신용권");
String name4 = new String("신용권");

- '==' 연산자는 번지가 동일한지를 검사

name1 == name2  <----- 결과:true
name2 == name3  <----- 결과:false

 

2) equals() 메소드

- 원본 문자열과 매개값으로 주어진 비교 문자열이 동일한지 비교한 후 true 또는 false를 리턴

- 내부 문자열을 비교하고 싶을 때 사용