glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-005] 클래스 내 final 변수 초기화 관련 내용 추가 #109

Closed yngbao97 closed 6 months ago

yngbao97 commented 7 months ago

Based on: #100 by @FickleBoBo


클래스 계층구조가 본인에겐 더 익숙한 프로그래밍 방식이어서 충분히 받아드릴 수 있었다.

아이템 23을 읽으며 비슷한 생각을 했었는데, 당연하니까 넘어갈 수 있는 내용을 객관적으로 또 부가적으로 정리해주셔서 클래스 계층 구조의 장점에 대해 다시 한번 생각할 수 있었습니다.

확장성 측면에서 Figure는 파라미터의 개수가 다른 두 개의 생성자로 원와 사각형을 구분하고 있는 것으로 보인다. 이 경우, 구체 혹은 삼각형과 같이 파라미터 개수가 겹치는 도형을 추가하고 싶을 때, 개발자를 골치아프게 할 것 같았다.

클래스 확장성을 고려했을 때 마주할 수 있는 생성자 오버로딩의 약점도 연결해서 말씀해주신 점도 좋았습니다.

성능적 측면에서는 공감하기 어려운 부분이 있었는데, 필드들을 final로 선언하려면 해당 의미에 쓰이지 않는 필드들까지 생성자에서 초기화해야한다 이 부분이다. 쓰이지 않는 필드들을 초기화할 이유를 찾지 못했다. 다음 코드처럼 선언과 동시에 초기화하지 않는다고 오류가 발생하지도 않는데 교재에선 이 부분이 단점 중 하나로 지적됐었다.

다만, 위 부분을 읽으며 final 변수를 초기화 하지 않아도 오류가 나지 않는다는 내용이 의아했는데요. 첨부해주신 예시 코드에서는 main메서드 안에서 선언되었기 때문에 에러가 나지 않은 것으로 생각이 되네요. 메서드 안에서 변수 선언에 사용된 final 키워드는 메서드 동작에 아무런 영향을 미치지 않고 변수에 값을 한번만 할당하도록 하는 용도만 갖기 때문에 컴파일 에러를 띄우지 않는 것 같습니다. 메서드 내부가 아니라 클래스의 필드라면 초기화가 반드시 필요하다는 내용 추가드립니다! 이번주도 고생하셨습니다. 깔끔한 글 감사합니다!

레퍼런스 : https://www.geeksforgeeks.org/final-keyword-in-java/

FickleBoBo commented 7 months ago

좋은 지적 감사합니다. final에 대한 이해가 부족해서 교재의 내용을 의심했습니다. 클래스 멤버 변수로 선언하니 정말 초기화를 하지 않으면 에러가 발생하는 것을 볼 수 있었습니다. 최근 이펙티브 자바에 이어 스프링도 같이 공부하며 final의 활용 방법을 차츰 더 알아가게 되는 것 같은데 앞으로 열심히 활용하겠습니다~!!