📌 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);
'JAVA' 카테고리의 다른 글
[ java ] 조건문 (0) | 2024.12.03 |
---|---|
[ java ] 반복문 (0) | 2024.12.03 |
[ java ] 클래스 변수, 인스턴스 변수, 지역변수 (0) | 2024.11.14 |
[ java ] 제네릭(generic) (0) | 2024.10.17 |
[ java ] Stream 기본 개념 (0) | 2024.09.23 |