[Java] Chapter 5. 참조 타입

SeungWoo Cha·2025년 9월 6일

Chapter 5. 참조 타입

5.1 데이터 타입의 분류

  • 기본 타입: 값 자체를 스택(Stack) 영역에 저장
  • 참조 타입: 객체의 번지를 저장하고, 힙(Heap) 영역의 실제 객체를 참조
  • 객체(Object) = 필드(데이터) + 메소드
  • 변수는 모두 스택에 생성되며, 참조 타입 변수는 힙 메모리 번지를 저장
int a = 10;              // 값 자체 저장
String str = "Hello";    // str은 객체 번지를 저장

5.2 JVM 메모리 사용 영역

  • 메소드 영역: 클래스 정보, static 필드, 메소드 코드 저장
  • 힙 영역: 객체가 생성되는 영역, 참조 변수로 접근
  • 스택 영역: 메소드 호출 시 프레임 생성, 로컬 변수 저장

5.3 참조 타입 변수의 비교

  • ==, != : 객체의 번지 비교
  • .equals() : 객체 내부의 값 비교
String s1 = new String("Java");
String s2 = new String("Java");

System.out.println(s1 == s2);      // false (다른 객체)
System.out.println(s1.equals(s2)); // true (문자열 값 동일)

5.4 null과 NullPointerException

  • null: 아직 객체를 참조하지 않음
  • NullPointerException: null 상태에서 객체 멤버에 접근 시 발생
  • Garbage Collector: 더 이상 참조되지 않는 객체 자동 제거
String str = null;
System.out.println(str.length()); // NullPointerException

5.5 문자열 타입 (String)

  • 불변(Immutable): 문자열 수정 시 새로운 객체 생성

주요 메소드

String str = "Hello Java";

// 문자열 비교
System.out.println(str.equals("Hello Java")); // true

// 문자 추출
char c = str.charAt(0);  // 'H'

// 문자열 대체
String newStr = str.replace("Java", "World");

// 문자열 자르기
String sub = str.substring(0, 5); // "Hello"

// 문자열 찾기
int idx = str.indexOf("Java");    // 6

// 문자열 분리
String[] arr = str.split(" ");    // {"Hello", "Java"}

5.6 배열

  • 같은 타입의 값만 관리, 길이 변경 불가
  • 스택에는 배열 번지가, 힙에는 배열 데이터가 저장됨
// 배열 선언과 초기화
int[] scores = {90, 85, 80};

// new 연산자 사용
int[] arr = new int[3]; // {0,0,0}

// 메소드 매개변수 전달
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]; // 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]); // Hello
    System.out.println(args[1]); // World
}

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은 제한된 상수 집합 정의에 유용
profile
한 발자국씩

0개의 댓글