<aside> 💡 불변 클래스란, 그 인스턴스의 내부 값을 수정할 수 없는 클래스다!

</aside>

클래스를 불변으로 만들기 위한 다섯 가지 규칙들

  1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.
  2. 클래스를 확장할 수 없도록 한다.
  3. 모든 필드를 final 로 선언한다.
  4. 모든 필드를 private 으로 선언한다.
  5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.

조금 복잡한 예시를 통해 알아보자!

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)";
		}
}

불변 클래스의 장점들

  1. 불변 객체는 단순하다.

  2. 불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요가 없다.