개발을 하다보면,
불가변을 필두로 전역 변수를
선언해야 하는 경우가 존재한다
당연히 "final"이라는
키워드를 사용하여
MAXSPEED에
불가변성을 주입하였는데,
그것을 변형하려고 한다면
에러가 발생할 것이다
그렇다면,
데이터 타입의 범주를 넘어서
list 단위로
final이라는 키워드를 붙이면
어떤 현상이 발생할까?
"final은 불가변성을 주입하는 키워드이고,
final list로 list를 생성하게 되면
해당 list는 불가변일 테니,
내부에 있는 자료들 또한
불가변이지 않을까?"
라고 생각할 수 있다
과연 그럴까?
코드로 살펴보자
코드를 천천히 살펴보자
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라 통칭하겠다)
"Collections.unmodifiableList" 를
사용하면 된다
Java의 Collections 프레임워크에 있는
유틸리티 메소드로
final로 생성한 list와는 다르게
새로운 객체 생성은 물론,
CRUD 기능까지 불가능하다
그럼 두 가지를 활용하면
이런 식으로
managerList는
관리자 권한으로
CRUD가 자유롭지만,
clientList는 자유롭지 않다
또한 9번과 10번 코드를
살펴보면, final 키워드에 따라
살짝 자유도가 다르다
다음번에는
final method와
Observer Pattern
대하여 살펴보자
'Web Technologies 🖥️ > java' 카테고리의 다른 글
equals() 랑 "==" 랑 똑같은 거 아니였어? - JAVA (1) | 2023.12.17 |
---|---|
scan.next() 사용 시 주의 사항 - JAVA (0) | 2023.12.14 |
BufferedWriter 는 뭔데 sysout 보다 빨라? - JAVA (0) | 2023.12.08 |
method에 final을 붙이면 어떻게 돼? (final 메소드) - JAVA (45) | 2023.10.31 |
깔끔한 if문 작성하는 법 좀 알려줘 (feat... 화이트리스트) - JAVA (2) | 2023.09.29 |