JAVA

기본형과 참조형

자바의 데이터 타입은 기본형(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으로 변환하는 것이 좋다.