
Chapter 5. 참조 타입
5.1 데이터 타입의 분류
- 기본 타입: 값 자체를 스택(Stack) 영역에 저장
- 참조 타입: 객체의 번지를 저장하고, 힙(Heap) 영역의 실제 객체를 참조
- 객체(Object) = 필드(데이터) + 메소드
- 변수는 모두 스택에 생성되며, 참조 타입 변수는 힙 메모리 번지를 저장
int a = 10;
String str = "Hello";
5.2 JVM 메모리 사용 영역
- 메소드 영역: 클래스 정보, static 필드, 메소드 코드 저장
- 힙 영역: 객체가 생성되는 영역, 참조 변수로 접근
- 스택 영역: 메소드 호출 시 프레임 생성, 로컬 변수 저장
5.3 참조 타입 변수의 비교
==, != : 객체의 번지 비교
.equals() : 객체 내부의 값 비교
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
5.4 null과 NullPointerException
null: 아직 객체를 참조하지 않음
NullPointerException: null 상태에서 객체 멤버에 접근 시 발생
- Garbage Collector: 더 이상 참조되지 않는 객체 자동 제거
String str = null;
System.out.println(str.length());
5.5 문자열 타입 (String)
- 불변(Immutable): 문자열 수정 시 새로운 객체 생성
주요 메소드
String str = "Hello Java";
System.out.println(str.equals("Hello Java"));
char c = str.charAt(0);
String newStr = str.replace("Java", "World");
String sub = str.substring(0, 5);
int idx = str.indexOf("Java");
String[] arr = str.split(" ");
5.6 배열
- 같은 타입의 값만 관리, 길이 변경 불가
- 스택에는 배열 번지가, 힙에는 배열 데이터가 저장됨
int[] scores = {90, 85, 80};
int[] arr = new int[3];
void printArr(int[] arr) {
for (int n : arr) System.out.print(n + " ");
}
printArr(new int[] {1,2,3});
5.7 다차원 배열
int[][] matrix = new int[2][3];
matrix[0][0] = 1;
int[][] jagged = new int[2][];
jagged[0] = new int[3];
jagged[1] = new int[2];
5.8 객체 배열
String[] names = new String[3];
names[0] = "Kim";
names[1] = new String("Lee");
5.9 배열 복사
int[] oldArr = {1,2,3};
int[] newArr = new int[5];
System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
5.10 향상된 for문
int[] nums = {1,2,3};
for (int n : nums) {
System.out.println(n);
}
5.11 main() 메소드의 매개변수
java Main Hello World
public static void main(String[] args) {
System.out.println(args[0]);
System.out.println(args[1]);
}
5.12 열거(Enum) 타입
enum Week { MONDAY, TUESDAY, SUNDAY }
Week today = Week.SUNDAY;
if (today == Week.SUNDAY) {
System.out.println("휴일!");
}
5.13 Calendar
import java.util.Calendar;
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "-" + month + "-" + day);
P.S 핵심 요약
- 참조 타입 변수는 **객체의 번지(주소)**를 저장
==은 번지 비교, .equals()는 내용 비교
- String은 불변(Immutable) → 수정 시 새로운 객체 생성
- 배열은 길이 고정, 필요 시
System.arraycopy() 활용
- Enum은 제한된 상수 집합 정의에 유용