J-S-10 불변 객체의 원리와 String 클래스 완벽 해부

글 정보
카테고리
Programming/Java/Starter
태그
JavaLevel2

1. 불변 객체(Immutable Object)의 논리적 개념

불변 객체란?

왜 '불변'이어야 할까요? (Side Effect 방지)


2. 불변 객체의 정의와 설계

어떻게 구현하나요?

값을 변경해야 할 때는요?

네이밍 컨벤션 (with~)

대표적인 불변 객체

코드예제

public class UserSettings {
    // 1. 모든 필드를 final로 선언하여 한 번 값이 정해지면 바꿀 수 없게 합니다.
    private final String theme;
    private final int volume;

    // 2. 생성자를 통해 최초 상태를 설정합니다.
    public UserSettings(String theme, int volume) {
        this.theme = theme;
        this.volume = volume;
    }

    // 3. 값 변경이 필요할 때: Setter 대신 '새로운 객체'를 반환하는 메서드(with~)를 만듭니다.
    public UserSettings withTheme(String newTheme) {
        // 기존 volume은 유지하고, 변경된 theme을 가진 새 객체를 생성하여 반환 (Copy & Write)
        return new UserSettings(newTheme, this.volume);
    }
    
    // 단순 확인을 위한 Getter (Setter는 없음)
    public String getTheme() { return theme; }
}

3. 문자열 상수와 String 클래스

문자열(String)의 본질

내부 구조의 변화 (Java 9)

String의 이중성


4. 문자열의 비교 (핵심)

상등 연산자 (==) 사용 금지

올바른 비교 방법

코드 예시

public class StringComparison {
    public static void main(String[] args) {
        // 리터럴 방식: 상수 풀(Pool) 이용
        String poolStr = "Java";
        // new 방식: 힙(Heap) 메모리에 강제로 새 객체 생성
        String heapStr = new String("Java");

        // 1. 주소 비교 (==)
        // 내용은 같지만 메모리 위치가 달라서 false가 나옵니다.
        System.out.println(poolStr == heapStr); // false

        // 2. 값 비교 (equals)
        // 주소와 상관없이 문자열의 내용(Value)만 비교하므로 true입니다.
        System.out.println(poolStr.equals(heapStr)); // true

        // 3. 사전 순서 비교 (compareTo)
        // 두 문자열이 같으면 0, 다르면 사전 순서 차이를 반환합니다.
        System.out.println(poolStr.compareTo(heapStr)); // 0
    }
}

5. String 클래스 주요 메서드

문자 추출 및 검색

비교

변환 및 조작 (새 객체 반환)

기타