Immutable 객체는 생성 후 상태를 변경할 수 없는 객체입니다. 그 주요 속성은 다음과 같습니다:
Immutable 객체의 장점:
Immutable 클래스 구현 예:
public final class Person { private final String name; private final int age; private final List<String> phones; public Person(String name, int age, List<String> phones) { this.name = name; this.age = age; // 전달된 목록의 변형으로부터 보호 this.phones = Collections.unmodifiableList(new ArrayList<>(phones)); } public String getName() { return name; } public int getAge() { return age; } public List<String> getPhones() { return phones; } // 읽기 전용 목록을 반환 }
Java의 String이 immutable한 이유는 무엇이며, 만약 그렇지 않았다면 어떻게 되었을까요? 많은 사람들은 "안전을 위해"라고 대답하지만, 이는 실제로 무엇을 의미합니까?
답변:
String은 많은 곳에서 사용됩니다: 컬렉션의 키로, 보안 로직(예: 비밀번호)에서. 문자열을 하나의 참조를 통해 변경할 수 있었다면, 동일 객체에 대한 모든 다른 참조에도 영향을 미쳐 컬렉션(예: HashMap - hashCode 계산 시)이 올바르게 작동할 수 없게 만들고 보안 취약점으로 이어질 수 있습니다.
이야기
Collections.unmodifiableList를 반환하기 시작했습니다.이야기
Date, List)를 보관하고 있었습니다. 한 스레드에서 구성을 변경하면 다른 스레드에서 오래된 데이터나 일관성 없는 데이터를 얻어 비즈니스 알고리즘이 잘못 작동했습니다.이야기
로그인 시스템에서 비밀번호가 변경 가능한 객체에 저장되었습니다. 안전하지 않은 접근을 통해 다른 사용자의 비밀번호가 "유출"되었습니다. 같은 객체 인스턴스가 여러 스레드에서 사용되었기 때문입니다.