<aside> 💡 불변 클래스란, 그 인스턴스의 내부 값을 수정할 수 없는 클래스다!
</aside>
클래스를 불변으로 만들기 위한 다섯 가지 규칙들
final
로 선언한다.
private
으로 선언한다.
조금 복잡한 예시를 통해 알아보자!
public final class Complex {
private final double re;
private final double im;
public Complex(final double re, final double im) {
this.re = re;
this.im = im;
}
public double realPart() {
return re;
}
public double imaginaryPart() {
return im;
}
public Complex plus(final Complex c) {
return new Complex(re + c.re, im + c.im);
}
public Complex minus(final Complex c) {
return new Complex(re - c.re, im - c.im);
}
public Complex times(final Complex c) {
return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
}
public Complex dividedBy(final Complex c) {
final double tmp = c.re * c.re + c.im * c.im;
return new Complex(re * c.re + im * c.im) / tmp, (im * c.re - re * c.im) / tmp);
}
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof Complex)) {
return false;
}
Complex c = (Complex) o;
return Double.compare(c.re, re) == 0 && Double.compare(c.im, im) == 0;
}
@Override
public int hashCode() {
return 31 * Double.hashCode(re) + Double.hashCode(im);
}
@Override
public String toString() {
return "(" + re " + " + im + "i)";
}
}
불변 클래스의 장점들
불변 객체는 단순하다.
불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다.
클래스를 스레드 안전하게 만드는 가장 쉬운 방법이다.
그 어떤 스레드도 다른 스레드에 영향을 줄 수 없으니, 불변 객체는 안심하고 공유할 수 있다.
불변 클래스라면 한 번 만든 인스턴스를 재활용하기 쉽다.
public static final Complex ZERO = new Complex(0, 0);
public static final Complex ONE = new Complex(1, 0);
public static final Complex I = new Complex(0, 1);
불변 클래스는 자주 사용되는 인스턴스를 캐싱하여 같은 인스턴스를 중복 생성하지 않게 해주는 정적 팩터리를 제공할 수 있다.