Java

[인프런] 기본형과 참조형의 공유

sejin2 2024. 6. 6. 21:34

자바의 데이터 타입을 가장 크게 보면 기본형과 참조형으로 나눌 수 있다.

  • 기본형 : 하나의 값을 여러 변수에서 절대로 공유하지 않는다.
  • 참조형 : 하나의 객체를 참조값을 통해 여러 변수에서 공유할 수 있다.

기본형 변수는 하나의 값을 절대로 공유하지 않는다. 따라서 값을 변경해도 변수 하나의 값이 변경된다.

참조형 변수들은 같은 참조값을 통해 인스턴스를 참조할 수 있다. 

자바에서 모든 값 대입은 변수가 가지고 있는 값을 복사해서 전달한다. 변수가 int와 같은 숫자값을 가지고 있으면 숫자값을 복사해서 전달하므로 같은 인스턴스를 참조하게 된다. 😮
참조형 변수는 참조값을 통해 같은 객체( 인스턴스 )를 공유할 수 있다.

반면 기본형 변수는 절대로 같은 값을 공유하지 않는다. 

 

공유 참조와 사이드 이펙트

사이드 이펙트는 프로그래밍에서 어떤 계산이 주된 작업 외에 추가적인 부수 효과를 일으키는 것을 말한다.

프로그래밍에서 사이드 이펙트는 보통 부정적인 의미로 사용된다. 
사이드 이펙트는 프로그램의 특정 부분에서 발생한 변경이 의도치 않게 다른 부분에 영향을 미치는 경우에 발생한다.
이로 인해서 디버깅이 어려워지고, 코드의 안정성이 저하될 수 있다.

 

참조 값을 다른 변수에 대입하는 순간 변수가 하나의 객체를 공유하게 된다. 
기본형은 항상 값을 복사해서 대입하기 때문에 값이 절대로 공유되지 않지만, 참조형의 경우는 참조값을 복사해서 대입하기 때문에 여러 변수에서 같은 객체를 공유할 수 있다. 
이 경우 사이드 이펙트가 발생할 수 있다.

 

이러한 문제를 어떻게 해결할 수 있을까 ?

발생한 문제들은 모두 공유하면 안되는 객체를 여러 변수에서 공유했기 때문에 발생한 문제이나, 객체를 공유하는 것 자체의 문제는 아니다. 객체를 공유한다고 바로 사이드 이펙트가 발생하는 것은 아니다.
문제의 직접적인 원인은 공유된 객체의 값을 변경한 것이다. 

 

자바에서 여러 참조형 변수가 하나의 객체를 참조하는 공유 참조 문제는 피할 수 없으며, 기본형과 다르게 참조형인 객체는
처음부터 여러 참조형 변수에서 공유될 수 있도록 만들어졌다. 

따라서 어떤 객체를 생성할 때 그 객체의 값을 변경하지 못하도록 만든다면, 사이드 이펙트가 발생하지 않을 것이라고 생각해볼 수 있다. 

불변 객체 ( Immutable Object )

객체의 상태 ( 객체 내부의 값, 멤버 변수 )가 변하지 않는 객체를 불변 객체라고 한다. 

필드를 final로 선언하여 내부의 값이 변경되지 않도록 만든다. 
불변 클래스는 어떻게든 필드 값을 변경할 수 없도록 만들면 된다.

불변 객체는 값을 변경할 수 없기 때문에 사이트 이펙트가 발생하지 않는다. 불변 객체는 값을 변경할 수 없으므로, 값을 변경하고 싶다면 변경하고 싶은 값으로 새로운 불변 객체를 생성해야 한다. 이렇게 하면 기존 변수들이 참조하는 값에 영향을 주지 않는다. 

불변 객체에서 변경과 관련된 메서드들은 보통 객체를 새로 만들어서 반환하기 때문에 꼭 반환 값을 받아야 한다.🤨

 

불변 객체에서 값을 변경하는 경우 withOOO 처럼 with로 시작하는 경우가 많은데, 이는 메서드가 지정된 수정사항을 포함하는 객체의 새 인스턴스를 반환한다는 의미이다.

"with"는 관례처럼 사용되는데, 원본 객체의 상태가 그대로 유지됨을 강조하면서 변경사항에 새 복사본을 포함하는 과정을 간결하게 포함한다.

 

클래스를 불변으로 설계하는 이유

  • 캐시 안정성
  • 멀티 쓰레드 안정성
  • 엔티티의 값 타입

 

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 중급 1편

'Java' 카테고리의 다른 글

[인프런] 래퍼 클래스  (1) 2024.06.09
[인프런] String 클래스  (1) 2024.06.08
Labelled Loop ( 이름을 가지는 반복문 )  (0) 2024.06.03
Enhanced for문  (0) 2024.06.03
[인프런] equals( )  (0) 2024.06.02