자바에서
final 키워드는🔒 "한 번 정해지면 다시는 바꿀 수 없다" 라는 의미
final의 역할
대상 | 의미 |
변수 (필드, 지역 변수) | 한 번 값이 정해지면 재할당 불가 |
메서드 | 오버라이딩(재정의) 불가 |
클래스 | 상속 금지 |
예제: 변수에 final
final int number = 10; number = 20; // ❌ 컴파일 에러! 한 번 정해졌기 때문에 다시 못 바꿈
TypeScript로 치면 const와 같음
const number = 10; number = 20; // ❌ 에러
예제: 메서드에 final
public class Animal { public final void speak() { System.out.println("소리냄"); } } public class Dog extends Animal { @Override public void speak() { // ❌ 에러: final 메서드는 오버라이드 불가 System.out.println("멍멍"); } }
메서드에 final을 붙이면 자식 클래스가 재정의할 수 없게 막는 것
예제: 클래스에 final
public final class Utils { public static void hello() { System.out.println("Hello!"); } } public class MyUtils extends Utils { // ❌ 에러: final 클래스는 상속 불가 }
final class는 완전히 봉인된 클래스, 상속도 못 함
실무에서 사용
상황 | 설명 |
불변 객체 만들기 | final 변수로 내부 값 못 바꾸게 |
상속 막기 | 설계상 확장되면 안 되는 클래스에 final |
안전한 메서드 고정 | 중요한 메서드는 오버라이딩 못 하게 final 처리 |
주의할 점
final List<String> list = new ArrayList<>(); list.add("hello"); // ✅ 가능 list = new ArrayList<>(); // ❌ 불가능
final은 참조값 자체를 못 바꾸게 하는 것
- 그 객체 내부의 내용은 바꿀 수 있음
마치 TS에서 const arr = [] 하고 arr.push()는 되는 것처럼
대상 | final 의미 |
변수 | 한 번 할당 후 값 변경 불가 |
메서드 | 자식 클래스에서 오버라이딩 불가 |
클래스 | 상속 불가 |