[final 필드]
final 필드는 초기값이 정해진 이후 수정할수 없는 데이터라는 뜻이다.
final 필드에 초기값을 줄 수 있는 방법은 2가지이다.
1. 필드 선언 시에 주는 법
2. 생성자에서 주는 법
만약에 위 2가지 방법으로 초기화를 안하면 아래처럼 에러가 발생한다.
[final 클래스]
클래스에 final이 붙으면 상속을 허락하지 않겠다는 의미다.
public final class 고양이 { }
[final 메서드]
메서드가 final이면 오버라이딩을 금지하게 된다.
[상수 설명과 특징]
상수는 한번 정하면 바꿀수 없어서, 불변의 값이라고 한다. 예를들어 원주율 이런것인데 자바에서 상수는 static final 이라고 부른다. 자바에서 final 필드는 한 번 초기화 되면 수정할 수 없는 필드이다. final만 있으면 될 것 같은데 자바에서 왜 static이 붙어야 상수일까?
그 이유는 모든 객체마다 데이터가 같아야 하는 공용성을 띠고 있어야 하기 때문이다. 만약에 static이 붙지 않고 final만 있으면 인스턴스 필드로 객체마다 생성되는 것인데 객체마다 초기화를 다르게 해서 다른 값일 수 있기 때문이다.
아래 예제를 보면 static final 과 그냥 final의 차이점을 알 수 있고, final만 있으면 왜 상수가 될 수 없는지 알 수 있다.
public class Earth {
static final double EARTH_RADIUS = 6400;
static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
final String NAME;
public Earth(String name) {
this.NAME = name;
}
}
위 코드에서 static은 메소드 영역에 생성 되었기 때문에 Earth. 으로 사용될수 있었다. 하지만 NAME 필드는 객체가 생성되어야 사용이 가능하고, 또 생성자를 통해서 객체마다 NAME 값이 지정될수 있기 때문에 모든 객체마다 값이 다를 수 있으므로 상수가 될 수 없다. 그래서 final 만으로는 상수가 될 수 없다.
public class EarthExample {
public static void main(String[] args) {
System.out.println("지구의 반지름: " + Earth.EARTH_RADIUS + " km");
System.out.println("지구의 표면적: " + Earth.EARTH_AREA + " km^2");
Earth earth = new Earth("나의 지구");
System.out.println("지구의 이름: " + earth.NAME);
}
}
참고 : 혼자 공부하는 자바 / 신용권 / 한빛미디어
참고 : 자바 객체지향의 원리와 이해 / 김종민 / 위키북스
'Language > Java' 카테고리의 다른 글
[Java] 객체지향 특성의 추상화와 상속, 인터페이스 사용이유, 클래스 다중상속 안되는 이유 (1) | 2024.01.07 |
---|---|
[Java] 자식클래스가 상속받으면 부모 객체를 사용할 수 있는 이유와 상속 사용 주의사항 (0) | 2023.12.18 |
[Java] 싱글톤 디자인 패턴 원리 이해하기, final static 메모리 사용영역으로 이해하기 (0) | 2023.12.05 |
[Java] 인스턴스 멤버와 정적 멤버, 정적 멤버안에 정적 멤버만 사용할 수 있는 이유 (1) | 2023.12.05 |
[Java] 클래스를 사용하게 된 이유, 클래스 구성요소의 설명과 특징, 사용방법 (0) | 2023.12.04 |