값 타입과 불변 객체

값 타입의 정의

값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념이다.

값 타입은 단순하고 안전하게 다룰 수 있어야한다.

값 타입 공유 참조

임베디드 타입 같은 값 타입을 여러 엔티티에서 공유해도 괜찮을까?

답은 No다. 왜냐하면 사이드 이펙트가 발생할 수 있어 위험하다!

값 타입 복사

값 타입의 실제 인스턴스 값을 공유하는 것은 꽤나 위험하다.

대신 값을 복사해서 사용해야한다.

객체 타입의 한계

항상 값을 복사해서 사용하면 공유 참조로 인해 생기는 부작용을 피할 수는 있다.

그러나 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.

자바 기본 타입에 값을 대입하면 값을 복사한다.

객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.

즉, 객체의 공유 참조를 피할 수가 없게 된다.

불변 객체

객체 타입을 수정할 수 없게 만들면 부작용을 원천 차단할 수 있다. (코틀린의 val)

생성자로만 값을 수정하고 수정자(Setter)를 안만들면 해결할 수 있다.

결론

불변이라는 작은 제약으로 부작용이라는 재앙을 막을 수 있다.

Reference

인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편



© 2022. by minkuk

Powered by minkuk