Immutability(불변성)이란?
불변성(Immutability)은 객체의 상태가 생성된 후 변경할 수 없는 성질을 말합니다. 즉, 한 번 생성된 객체의 상태는 그대로 유지되며, 변경할 수 없습니다. 이는 객체의 내부 상태(fields)가 변경되지 않음을 의미합니다.
불변 객체(Immutable Object) 특성
불변 객체(Immutable Object)는 다음과 같은 특성을 가집니다:
- 객체의 상태 변경 불가능: 객체가 한 번 생성되면 내부 상태는 변하지 않습니다. 따라서 객체의 모든 필드(fields)는 final로 선언되거나, 필드가 변경되지 않도록 해야 합니다.
- 데이터 보호: 불변 객체는 내부 상태가 변하지 않기 때문에 다른 객체나 외부에서 객체의 상태를 변경할 수 없습니다. 이는 코드의 안정성을 높이고 버그를 줄일 수 있는 장점을 제공합니다.
- 스레드 안전성: 불변 객체는 여러 스레드에서 동시에 접근해도 안전합니다. 왜냐하면 객체의 상태가 변하지 않기 때문에 별도의 동기화가 필요하지 않습니다.
- 캐싱: 불변 객체는 한 번 생성된 후 재사용될 수 있습니다. 이는 메모리 사용을 줄이고 성능을 향상시킬 수 있는 장점을 제공합니다.
일반적으로 불변 객체는 다음과 같은 방법으로 구현됩니다:
- 모든 필드를 private final로 선언하여 외부에서 접근할 수 없도록 합니다.
- 객체를 변경하는 메소드(Setter)를 제공하지 않거나, 필드의 값을 변경할 수 없도록 합니다.
- 객체를 변경하는 대신 새로운 객체를 생성하여 필요한 변경을 반영합니다(불변 객체는 상태를 변경할 수 없으므로 값을 변경하는 것이 아니라 새로운 객체를 생성합니다).
불변 객체의 예로는 Java의 String 클래스가 있습니다. String 객체는 생성된 후에는 내부 문자열이 변경되지 않습니다. 새로운 문자열을 생성하는 연산(concat(), substring() 등)은 새로운 String 객체를 반환하며, 기존 객체는 변경되지 않습니다.
불변 객체는 함수형 프로그래밍(Functional Programming)에서도 중요한 개념으로 사용되며, 예측 가능하고 안정적인 코드를 작성하는 데 도움을 줍니다.
사용 예시
1. String 클래스
Java의 String 클래스는 불변 객체의 대표적인 예입니다. 문자열이 한 번 생성되면 내부의 문자열 데이터는 변경할 수 없습니다. 대신에 문자열을 수정하는 메소드들은 새로운 문자열을 생성하여 반환합니다.
String str1 = "Hello";
String str2 = str1.concat(" World"); // str1은 변경되지 않고, "Hello World"를 새로운 문자열로 반환
System.out.println(str1); // 출력: Hello
System.out.println(str2); // 출력: Hello World
2. java.time 패키지의 LocalDate 클래스
Java 8 이후부터 추가된 java.time 패키지의 LocalDate 클래스는 불변 객체입니다. 날짜를 나타내는 객체는 한 번 생성된 후에는 변경할 수 없습니다.
LocalDate date1 = LocalDate.of(2024, 6, 22);
LocalDate date2 = date1.plusDays(1); // date1은 변경되지 않고, 하루를 추가한 새로운 LocalDate 객체 반환
System.out.println(date1); // 출력: 2024-06-22
System.out.println(date2); // 출력: 2024-06-23
3. BigInteger 클래스
Java의 BigInteger 클래스는 정수를 표현하는 데 사용되며, 불변 객체입니다. 한 번 생성된 BigInteger 객체는 내부 값이 변경될 수 없습니다.
BigInteger num1 = new BigInteger("12345678901234567890");
BigInteger num2 = num1.add(BigInteger.ONE); // num1은 변경되지 않고, 1을 더한 새로운 BigInteger 객체 반환
System.out.println(num1); // 출력: 12345678901234567890
System.out.println(num2); // 출력: 12345678901234567891
4. Collections.unmodifiableList 메소드
Java에서는 수정할 수 없는(불변의) 컬렉션을 만들기 위해 Collections 클래스의 unmodifiableList, unmodifiableSet, unmodifiableMap 등의 메소드를 제공합니다. 이 메소드들은 기존 컬렉션을 수정할 수 없도록 래핑하여 불변성을 보장합니다.
List<String> mutableList = new ArrayList<>();
mutableList.add("apple");
mutableList.add("banana");
List<String> immutableList = Collections.unmodifiableList(mutableList);
// immutableList는 불변 객체이므로 요소 추가나 변경이 불가능
immutableList.add("cherry"); // UnsupportedOperationException 발생
장점
- 스레드 안전성: 불변 객체는 여러 스레드에서 동시에 사용될 때도 안전합니다.
- 캐싱: 한 번 생성된 객체는 재사용될 수 있어 메모리 사용을 줄일 수 있습니다.
- 안정성: 객체의 상태가 변하지 않기 때문에 예측 가능하고 버그를 줄일 수 있습니다.
따라서 불변 객체는 코드의 안정성과 가독성을 높이며, 함수형 프로그래밍 스타일을 채택할 때 유용하게 사용될 수 있습니다.
'Programming > Java, Kotlin' 카테고리의 다른 글
[Java] Serialization란? 사용 방법, 사용 이유, 예시, 장점 (0) | 2024.06.22 |
---|---|
[Java] OOPS란? 객체지향 프로그래밍(OOP, Object-Oriented Programming) 개념 (0) | 2024.06.22 |
[Java] hashCode, equals 메소드 정의, 차이 (0) | 2024.06.22 |
[Java] AOP 란? AOP 장점, 사용 예시 (0) | 2024.06.22 |
[Java] URI, URL 차이 (0) | 2024.06.22 |