[ch05 참조타입] 참조 타입과 참조 변수
📆 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를 리턴
- 내부 문자열을 비교하고 싶을 때 사용