final에 대한 설명은 아래짤이 최고라고 생각한다.
final은 말 그대로 '최종' 이라는 뜻이다. 클래스,변수,메서드 등 다양한 곳에 붙일 수 있는 modifier이다.
아래 예제를 통해서 final에 대해 알아보자.
public final class FinalPrac {
public static final int MAX_USERS = 9999;
public final int memberFinal = 100;
public final int value;
public ConstructInit(int value) {
this.value = value;
}
public final void finalMethod() {
System.out.println("난 못바꿈");
}
}
상수(constant)
먼저 자바에서 static과 final이 붙은 변수를 '상수'라고 한다.
말 그대로 변수랑 달리 바뀔 수 없이 고정된 값을 말한다.
위 예시에서는 MAX_USERS를 말한다.
상수를 사용하면 *매직넘버의 사용을 막아 코드 가독성이 증대될 수 있고,
*코드에서 숫자 리터럴이 적혀있는 경우 이게 뭐지? 싶을 수 있는데
이 대신 상수를 사용하면 상수의 이름을 통해 이해가 더욱 쉬워진다는 것이다. (편-안)
또한 해당 상수를 사용하는 전체 코드에 일괄적인 변화를 적용할 수 있다.(반대로 그 만큼 조심하고 확인해야 겠지만)
또한 자바에서는 관례적으로 대문자 스네이크 케이스를 사용한다.
final 멤버변수
예제에서 memberFinal을 보면 100이라는 값으로 초기화 되어 있다.
근데 멤버변수이기 때문에 객체를 찍어낼 때마다 각각 100이라는 똑같은 값이 메모리에 올라갈 것이다.
비효율 적이다..! 그렇기 때문에 이런건 static final을 통해 상수로 만들어 버리는 것이 훨씬 효율적이다.
한 편 그냥 public final int value를 보면 final이긴 하지만 생성자를 통해 객체 생성 시 값을 받을 수 있기 때문에
객체마다 다른 값을 가질 수 있다. 이건 의미가 있다. 즉 객체마다 값은 달라야 하지만, 수정해서는 안되는 경우 이렇게 final 변수를 선언하고 생성자를 통해 초기화 해줄 수 있다.
final 메서드
메서드에도 final 키워드를 붙일 수 있다.
이것은 상속을 제대로 배워야 더 정확히 알 수 있지만, final의 의미는 그대로 통한다
내부 구현의 변경이 일어나는 오버라이딩을 막겠다는 것이다. (상속이 계속 되어도 동일한 동작을 보장할 수 있다.)
final 클래스
클래스에도 final 키워드를 붙일 수 있다.
이를 통해서 해당 클래스는 상속이 되지 않는, 최종 클래스라는 뜻이다.
어떻게 보면 객체 지향의 상속을 통한 유연성이 떨어진다고 생각할 수도 있는데,
상속이 필요 없는 클래스의 경우 (상수가 모여 있는 클래스 등) 명확하게 상속되지 않을 거라고 알릴 수 있어서 좋다.
Swift를 학습할 때도 final 클래스를 공부했었는데, 런타임 속도가 빨라지는 장점이 있었다.
(상속같이 복잡한거 없이 그냥 메서드 영역 바로 뽝 찾아가면 되니까)
이렇게 final에 대해 간단하게 알아보았다.
정리하자면 final은 상수를 선언하는 경우에 가장 많이 사용하고,
class의 상속이 일어나지 않는 다는 것을 명시하거나
특정 변수나 메서드의 변경이 일어나지 않아야 할 때 final 이라는 제약을 걸어서
더욱 확실하고 안전한 프로그래밍을 할 수 있다.
학습 출처
'JAVA > Java Intermediate(OOP)' 카테고리의 다른 글
10. 다형성 - 캐스팅과 오버라이딩 (2) | 2024.03.17 |
---|---|
8. 상속, 오버라이딩, super (0) | 2024.03.11 |
6. static 정적 (3) | 2024.03.07 |
5. 접근 제어자와 캡슐화 (0) | 2024.03.03 |
4. 생성자 Construct (0) | 2024.03.02 |