JAVA

[ java ] Immutable Object(불변 객체)

Adose 2024. 9. 23. 20:24

📌 Immutable Obejct(불변 객체) 

객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다

-> 결론적으로 불변 객체는 값을 변경할 수 없는 객체를 의미하며, read-only 메소드 만을 제공한다. 재할당은 가능하지만, 한번 할당하면 내부 상태는 바꿀 수 없다.  

-> Java에서는 String, Integer가 대표적인 예이다. 

 

 

📍단점

  • 시간 복잡도 관점에서 사용시 주의해야할 필요가 있다. 
  • 불변 객체는 값이 변경될 때마다 새로운 객체를 생성하기 때문에 메모리 사용량이 증가한다.
  • 가변 객체는 내부 필드 값만 수정하면 되지만, 불변 객체는 항상 새로운 객체를 만들어야 해서 메모리 효율이 떨어진다. 
    • String은 불변 객체이기 때문에 문자열을 자주 변경할 때 StringBuilder 같은 가변 객체를 사용하는 것이 성능상 유리합니다.

 

📍장점 

  • 객체에 대한 신뢰도가 높아진다. 불변 객체는 상태가 바뀌지 않기 때문에 객체의 사용 중에 값이 변경될 가능성이 없다. 이를 통해 코드버그 발생 가능성이 줄어든다. 
  • 불변 객체의 값은 변경되지 않기 때문에, 해시코드 값도 변하지 않는다. 이때문에 HashMap, HashSet 등의 자료구조에서 안정적으로 동작이 가능하다. 

 


📌 StringBuffer와 StringBuilder

String 객체는 불변 객체이다. 그렇다면 값을 변경할 수 없다는 것은 무슨 의미일까 ? 

String test = "abc";
System.out.println(System.identityHashCode(test));
test +="def";
System.out.println(System.identityHashCode(test));
System.out.println(test);

 

위의 코드를 실행하면 identityHashCode() 메서드의 출력값이 달라진 것을 볼 수 있다. 위의 코드를 통해 String 객체의 값을 변경하는 작업은 새로운 String 객체를 만들고 값을 복사하는 작업이 수행되는 것을 알 수 있다. 

 

문제 발생!! --> 위와 같이 문자열을 +=과 같이 한다면 시간 복잡도는 오랜 시간이 걸릴 것이다( 복사 후 저장이 반복될 것이기 때문에 ) 

 

 

 

📍 위와 같은 문제의 해결을 위해 나온 것이 StringBuilder 클래스와 StringBuffer 클래스이다. 

StringBuilder test = new StringBuilder();
for(int i=0;i<=1000 ; i++){
    test.append(i);
}

 

String 의 값을 변경하는 연산이 많을때는 효율이 높은 StrinbBuilder클래스나 StringBuffer를 사용하는 것이 좋다. 코테에서는 Thread-Safe가 없는 StringBuilder클래스가 속도 측면에서 미세하게 빨라서 StringBuilder를 사용하는 것을 추천! 

 

Thread-Safe란 ? 

  • Thread-Safe는 멀티스레드 환경에서 여러 스레드가 동시에 같은 자원(데이터, 메모리, 객체 등)에 접근하거나 수정할 때도 데이터 손상이나 일관성 문제 없이 안전하게 실행되는 것을 의미
  • 코딩 테스트에서는 다수의 스레드를 생성할 필요가 없어서 StringBuilder를 추천 하는 거임

 

StringBuilder 기본 사용법 

StringBuilder test = new StringBuilder();

test.append(10);
test.append("abc");

System.out.println(test);
test.deleteCharAt(2); //삭제
System.out.println(test);
test.insert(4,3); //해당되는 위치에 추가 
System.out.println(test);