[Java] final 필드, 클래스, 메서드 의미와 상수 개념과 특징, 상수가 static final 인 이유

    [final 필드]

    final 필드는 초기값이 정해진 이후 수정할수 없는 데이터라는 뜻이다. 

     

    final 필드에 초기값을 줄 수 있는 방법은 2가지이다.

    1. 필드 선언 시에 주는 법

    2. 생성자에서 주는 법 

     

    만약에 위 2가지 방법으로 초기화를 안하면 아래처럼 에러가 발생한다.

    [필드에 초기값이 없을때 초기화 하라고 에러 발생]
    [생성자 안에 ssn 초기값을 넣어주는 로직 있으니 에러 발생 안함]

     

     

    [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);
        }
    }

     

     

     

    참고 : 혼자 공부하는 자바 / 신용권 / 한빛미디어

    참고 : 자바 객체지향의 원리와 이해 / 김종민 / 위키북스

    댓글

    Designed by JB FACTORY