코딜기

[Java] final (final 필드, final 메서드) 본문

Language/Java

[Java] final (final 필드, final 메서드)

코딜기 2024. 8. 27. 17:55
반응형

final이란?

  • 'final' 키워드는 무언가를 제한하는 의미를 가지며, 변수, 메서드, 클래스에 적용될 수 있습니다.
  • 'final'이 어디에 선언되느냐에 따라 그 의미가 달라집니다.
    • final + 변수 : 변수가 한번 초기화되면 값을 변경할 수 없고, 상수처럼 작동합니다.
    • final + 메서드 : 메서드를 재정의할 수 없고, 상속된 클래스에서도 더 이상 오버라이드되지 않습니다.
    • final + 클래스 : 클래스를 상속할 수 없고, 더 이상 확장이 불가능하며, 다른 클래스가 이 클래스를 기반으로 파생될 수 없습니다.

final 사용 (필드)

  • Person라는 클래스를 하나 만들고 내부에 인스턴스 변수와 'final' 키워드를 사용한 변수를 추가하겠습니다.
  • 'final' 변수는 반드시 선언과 동시에 초기화되거나 생성자를 통해 초기화되어야 합니다.
public class Person {
    final String nation = "대한민국"; // -> 선언과 동시에 초기화
    final String name; // -> 생성자를 통해 초기화
    int age;

    // 값 초기화를 위한 생성자
    public Person(String name) {
        this.name = name;
    }
}
  • 따라서, 'final'로 선언된 변수는 초기화된 후에는 값이 변경될 수 없는 불변의 값으로 취급되기 때문에, 초기화 이후에 다시 값을 할당하는 행위는 허용되지 않습니다.
public class Main {
    public static void main(String[] args) {
        Person p = new Person("김혜성");
        p.nation = "한국"; // -> 에러
        p.name = "이정후"; // -> 에러
    }
}

final 사용 (메서드)

  • Parent 클래스에 메서드를 3개 선언했고, 마지막 메서드만 final로 지정하였습니다.
public class Parent {
    void method1() {}
    void method2() {}
    final void method3() {}
}
  • Parent 클래스를 상속을 받는 Child 클래스를 선언하였습니다.
public class Child extends Parent {
    @Override
    void method1() {
        // TODO Auto-generated method stub
        super.method1();
    }

    @Override
    void method2() {
        // TODO Auto-generated method stub
        super.method2();
    }

//    void method3() {
//        System.out.println("오버라이딩 실패"); (x) -> final 메서드는 오버라이딩을 막습니다.
//    }
}
  • 마지막 메서드는 인텔리제이에서도 자동 오버라이딩이 진행되지 않는 것을 확인할 수 있습니다.
  • 직접 작성하려고 해도 동작하지 않는 것을 볼 수 있는데, 이는 문법적으로 메서드 재정의를 막고 있는 것을 알 수 있습니다.

final 사용 (클래스)

  • 클래스 선언 시 final을 사용하면 그 클래스는 상속이 불가능 해집니다.
  • final 클래스는 자식 클래스를 가질 수 없고, 오직 외부에서 직접 객체 생성을 통해서만 사용할 수 있습니다.
  • 대표적인 final 클래스는 String이 있습니다.
 
반응형

'Language > Java' 카테고리의 다른 글

[Java] 상속 (Inheritance)  (0) 2024.09.02
[Java] 상수 (Constant)  (0) 2024.08.29
[Java] static (static 필드, static 메서드)  (0) 2024.08.27
[Java] 캡슐화 (Encapsulation)  (0) 2024.08.27
[Java] 정보은닉(Infomation Hiding)  (1) 2024.08.26
Comments