final 필드
초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드를 말한다.
final 필드에서 초기값을 줄 수 있는 방법은 1) 필드 선언 시에 주는 방법과 2) 생성자에서 주는 방법으로
두 가지밖에 없다.
public class Example {
final String nation = "한국"; // 필드 선언시 초기화
final String name;
int age;
public Example(String name, int age) {
this.name = name; // 생성자에서 초기화
this.age = age;
}
}
public class FinalEx {
public static void main(String[] args) {
Example e = new Example("코린이", 20);
System.out.println("nation : " + e.nation);
System.out.println("name : " + e.name);
System.out.println("age : " + e.age);
// a.name = "내 이름은 코린이"; // 수정 불가
a.age = 25; // 수정 가능
System.out.println("age : " + a.age);
}
}
// 결과
nation : 한국
name : 코린이
age : 20
age : 25
클래스와 메소드에 final이 지정되면 어떻게 될까? 먼저 클래스 앞에 final 키워드를 붙이게 된다면
이 클래스는 최종적인 클래스가 되므로 상속할 수 없는 클래스가 된다.
즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다는 뜻이다.
아래와 같이 코드를 짠다면
public final class Hello {
}
// final 클래스를 상속할 수 없는 잘못된 코드
public class HelloEx extends Hello{
}
위의 사진과 같은 에러가 발생하는 것을 볼 수 있다.
그리고 메소드에 final을 붙인다면 최종적인 메소드이므로 재정의할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속해서 자식 클래스를 선언할 때 부모 클래스에 선언된 final 메소드는
자식 클래스에서 재정의할 수 없게 된다는 뜻이다. 아래의 코드를 보도록 하자.
public class Hello {
public void say() {
System.out.println("안녕하세요!");
}
public final void talk() {
System.out.println("안녕이라고 말하는 중");
}
}
public class HelloEx extends Hello{
@Override
public void say() {
System.out.println("안녕히 가세요!");
}
// final 메소드는 재정의할 수 없기 때문에 잘못된 코드
@Override
public void talk() {
System.out.println("잘가라고 말하는 중");
}
}
위의 사진과 같이 final 메소드는 재정의할 수 없다라고 뜨면서 에러가 발생하는 것을 볼 수 있다.
final 클래스의 대표적인 예는 자바 표준 API에서 제공하는 String 클래스이다.
위의 사진과 같이 String 클래스의 원본 파일로 들어가보면 final로 정의가 되어 있는 것을 볼 수 있다.
따라서 String 클래스는 자식 클래스를 만들 수 없다.]
상수(static final)
불변의 값을 상수라고 한다. 여기서 말하는 불변의 값은 파이(𝝅)와 같이 변하지 않는 값을 말한다.
위에서 final을 초기 값이 저장되면 수정할 수 없는 필드라고 했었는데
그렇다면 final 필드를 상수라고 부를 수 있는 것일까? 답은 아니다라고 할 수 있다.
왜냐하면 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며,
여러 가지 값으로 초기화될 수 없기 때문이다. final 필드는 객체마다 저장되고, 생성자의 매개값을 통해
여러 가지 값을 가질 수 있기 때문에 상수가 될 수 없다. 즉, 상수는 static이면서 final이어야 한다는 뜻이다.
static final은 객체마다 존재하지 않고 클래스에만 존재한다. 당연하게도 초기값이 저장되면 변경할 수 없다.
그리고 상수의 이름은 모두 대문자로 작성하는 것이 관례라는 것을 잊지말자.
static final double PI = 3.14159;
'국비 지원 > JAVA' 카테고리의 다른 글
[JAVA] ArrayList와 제네릭(Generic) (0) | 2023.05.28 |
---|---|
[JAVA] 예외 처리 (0) | 2023.05.21 |
[JAVA] 익명 함수와 람다 함수 (0) | 2023.05.21 |
[JAVA] 다중 상속과 추상 클래스와 인터페이스의 차이점 (0) | 2023.05.20 |
[JAVA] 인터페이스 (+ 다운 캐스팅) (0) | 2023.05.16 |