기본형과 참조형
자바의 데이터 타입은 기본형(Primitive Type), 참조형 (Reference Type)으로 나눌 수 있다.
- 기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
- 참조형 : 하나의 객체를 참조값을 통해 여려 변수에서 공유
참조형 변수는 참조값으로 변수에 접근 하기 때문에, 객체의 공유를 막을 수 없다.
→ 불변 객체를 도입
불변 객체
객체의 상태가 변하지 않는 객체 (Imutable Object)
public class ImmutableAddress {
private final String value;
public ImmutableAddress(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return "Address{" +
"value='" + value + '\'' +
'}';
}
}- 값을 변경할 수 있는 setValue 메서드가 제거됨 ⇒ 값을 변경할 수 있는 방법이 없음 ⇒ 새로운 인스턴스 생성으로 값을 변경할 수 밖에 없음
효과
-
불변 객체의 도입으로 사이드 이펙트를 막을 수 있다.
String
String은 참조형이다. 즉, String 인스턴스의 참조값만 들어갈 수 있다.
public final class String {
private final char[] value;// 자바 9 이전
private final byte[] value;// 자바 9 이후//여러 메서드
public String concat(String str) {...}
public int length() {...}
// 메서드와 기능들
}- 동등성과 동일성 / 같은 문자열을 선언 했다고 가정
- == 연산 : false (동일성) - 참조값을 비교하기 떄문
- .equals 연산 : true (논리적 동등성)
단, 리터럴 사용시 ex) String a = “hello”; 메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용 → 같은 문자열 선언시 같은 참조값을 가지게 됨 → 동등성, 동일성 비교 모두 True
불변의 단점 극복
불변의 단점
- 문자열을 수정할 때마다 계속 새로운 객체를 생성해야한다. → 문제 해결을 위해 불변이 아닌 가변의 String을 만들게 되는 계기
StringBuilder
public final class StringBuilder {
char[] value;// 자바 9 이전
byte[] value;// 자바 9 이후
//여러 메서드
public StringBuilder append(String str) {...}
public int length() {...}
}StringBuilder를 이용해 문자열을 변경하는 로직 수행 이후, 마지막에는 불변 String으로 변환하는 것이 좋다.