본문 바로가기
Web Technologies 🖥️/java

final의 불가변성 (feat... list, Collections.unmodifiableList) - JAVA

by dudefromkorea 2023. 10. 21.

개발을 하다보면,

불가변을 필두로 전역 변수를

선언해야 하는 경우가 존재한다

 

change maxSpeed error

 

당연히 "final"이라는

키워드를 사용하여

MAXSPEED에

불가변성을 주입하였는데,

그것을 변형하려고 한다면 

에러가 발생할 것이다

 

 

그렇다면,

데이터 타입의 범주를 넘어서

list 단위로

final이라는 키워드를 붙이면

어떤 현상이 발생할까?

 

 

"final은 불가변성을 주입하는 키워드이고,

final list로 list를 생성하게 되면

해당 list는 불가변일 테니,

내부에 있는 자료들 또한

불가변이지 않을까?"

 

라고 생각할 수 있다

 

과연 그럴까?

코드로 살펴보자

 

final list error

코드를 천천히 살펴보자

 

 

2번 줄에서

final 키워드를 사용하여

finalList를 생성하였다

 

그런데 4, 5, 6, 7번 줄에서

값을 자유롭게 삽입하거나

제거할 수 있다는 것을 확인하였다

 

그렇다면 우리가 쓴 "final"은

무쓸모일까?

전혀 그렇지 않다

9번줄을 살펴보자

 

새로운 객체로 선언하려고 하니

에러를 뱉어주었다

 

그렇다면

우리가 여기서 알 수 있는 사실은

 

final로 list를 생성하면,

값을 삽입하거나

수정, 삭제가 가능하지만

list 객체의 주소를 새로 생성하지 못한다는 것!!

 

즉,

list 생성 시

final이 권한을 가지는 부분은

list의 값들이 아니라

list 객체의 주소라는 것

 

그렇다면,

list의 CRUD 또한 막고 싶다면

어떤 방법이 있을까?

 

(CRUD = Create, Read, Update, Delete로

Read는 제한 할 수 없지만,

여기서는 편하게 CRUD라 통칭하겠다)

 

unmodifiable list error

"Collections.unmodifiableList" 를

사용하면 된다

 

Java의 Collections 프레임워크에 있는

유틸리티 메소드로

final로 생성한 list와는 다르게

새로운 객체 생성은 물론,

CRUD 기능까지 불가능하다

 

 

그럼 두 가지를 활용하면

 

managerList clientList seperated

 

이런 식으로 

managerList는

관리자 권한으로

CRUD가 자유롭지만,

clientList는 자유롭지 않다

 

또한 9번과 10번 코드를

살펴보면, final 키워드에 따라

살짝 자유도가 다르다

 

다음번에는

final method와

Observer Pattern

대하여 살펴보자

 

728x90
반응형