자바에서 final 클래스는 어디에 사용하나요?

조회수 8252회

제가 자바에 관한 책을 읽는데요. 거기서 모든 클래스를 final로 선언할수 있다고 나왔어요. 근데 저는 final클래스를 어디에 사용할지 잘 모르겠어요.

방금 이런 새로운 방법을 배워서 프로그래머들이 이걸 실제로 프로그램에 적용하는지가 궁금해요. 만약 적용시킨다면 보통 언제 사용하는지를 알면 제가 이해하는데 더 도움이 될것 같아요. 그리고 저도 언제 사용할지를 알게 될 것같아요.

final로 클래스를 정의해도 객체지향이라면 왜 그런지 좀 설명해주세요.

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    우선, 어떻게 사용하는지 궁금하다고 하셨잖아요. final클래스는 단순히 확장할수 없는 클래스라고 생각하시면 됩니다. 이건 단순히 객체오브젝트의 값을 final로 선언한다는 거랑은 다른데요. 이펙티브 자바라는 책을 보시면 이런 내용이 있어요.

    "일반적인 클래스의 경우 대개 상속을 하게 되므로 final도 아니고 상속을 위한 설계나 문서화도 하고 있지 않다. 그러나 이런 행태는 위험하다. 그런 클래스에 변경이 생길 때마다 클라이언트의 서브 클래스가 제대로 동작하지 않을 가능성이 생긴다. 이것은 이론에만 그치는 문제가 아니다. 상속을 위해 설계나 문서화 되지 않은 final이 실체 클래스의 내부 코드를 수정한 후에 사옥 관련 결함이 보고되는 경우가 결코 드물지 않다. 이런 문제를 해결하는 가장 좋은 방법은 서브 클래스를 안전하게 만들 수 있도록 설계나 문서화되지 않은 클래스의 상속을 금지하는 것이다. 상속을 막는 방법은 두 가지가 있다. 둘 중 더 쉬운 방법은 클래스를 final로 선언하는 것이다. 그리고 차선책으로는 모든 생성자를 private이나 패키지 전용으로 하고, 생성자 대신 public static 팩토리 메소드를 추가하는 것이다. 이 방법은 서브 클래스 사용시 유연성을 제공한다."

    위의 내용처럼 상속에 관해 충분히 고려하지 않았다면 부모 클래스와 상속 받는 클래스 사이에서 예상하지 못한 일들을 겪을 수 있습니다. 그래서 클래스는 두가지로 분류를 할 수 있어요.

    1. 클래스를 확장 가능하게 설계 하는 것. 이때는 그에 관련된 충분한 설명을 문서화 하셔야해요.
    2. 확장 불가능한 클래스로 설계 하는 것. (클래스를 final로 정의하는거)

    몇천줄이 넘어가는 코드를 작성하게 된다면 클래스에 몇자 더 적는건 별로 큰 노력이아니에요. 유지 보수없이 그냥 당장의 코드만 짜는데 의미를 둔다면 final은 필요 없을 거지만 final은 이 클래스가 상속을 염두해두지 않고 설계된 거라는걸 쉽게 알려준다는 것만 아시면 돼요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)