final 필드와 상수

Sunny·2022년 12월 17일
0

final은 개발할 때 많이 접하고 익숙하지만, 언제 왜 사용하는지는 깊게 생각해본 적이 없었다. 기술 면접을 보았을 때, 면접관님께서 final을 언제 사용하냐는 말씀에 확신을 가지지 않은 채로 대답을 했었다. 이번 기회에 확실히 개념 정리를 해보고자 한다.

🌱 final 필드

final : [형] 최종적인

final 필드라고 하면 최종적인 필드라는 뜻이 된다.
이 말은 무슨 말일까?

final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정 할 수 없다는 뜻이다.

선언은 다음과 같이 한다.

final 타입 필드 [= 초기값 ];

final 필드의 초기값을 줄 수 있는 방법은 2가지가 있다.
1. 필드 선언시에 주는 방법
2. 생성자에서 주는 방법

  • 복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부 데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야 한다.

다음은 final의 예시이다.

  • 주민등록번호 필드는 한 번 값이 저장되면 변경할 수 없도록 final 필드로 선언
  • 주민등록번호는 Person 객체가 생성될 때 부여되므로 Person 클래스 설계 시 초기값을 미리 줄 수 없음
  • 생성자 매개값으로 주민등록번호를 받아 초기값으로 지정
  • nation은 항상 고정된 값을 갖기 때문에 필드 선언 시 초기값으로 설정
public class Person {
	final String nation = "Korea";
    final String ssn; // 주민등록번호
    String name;
    
    public Person(String ssn, String name) {
    	this.ssn = ssn;
        this.name = name;
    }
}

public class PersonExample {
	public static void main(String[] args) {
    	Person p1 = new Person("123456-789456", "sunny");
        
        System.out.println(p1.nation); // 결과값 : Korea
        System.out.println(p1.ssn);    // 결과값 : 123456-789456
        System.out.println(p1.name);   // 결과값 : sunny
        
        //p1.nation = "Japan";  	// final 필드 수정 불가
        //p1.ssn = "455523-982234"; // final 필드 수정 불가
        p1.name = "nature";
    }
}

🌱 상수(static final)

일반적으로 불변의 값을 상수라고 한다.
(ex. 원주율 파이, 지구의 무게)

이러한 불변의 값을 저장하는 필드를 자바에서는 상수(constant)라고 한다.

❓final 필드는 한 번 초기화되면 수정할 수 없는 필드라고 했는데, 상수라고 불러도 되지 않을까?

이에 대한 답은 'No'이다.
불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러 가지 값으로 초기화될 수 없기 때문이다. final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러가지 값을 가질 수 있기 때문에 상수가 될 수 없다.

상수는 'static'이면서 'final'이어야 한다.

static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다.
그리고 한 번 초기값이 저장되면 변경할 수 없다.

상수는 초기값이 단순 값이라면 선언 시에 주는 것이 일반적이지만, 복잡한 초기화일 경우 정적 블록에서도 할 수 있다.

static final 타입 상수 [=초기값];
static final 타입 상수;
static {
	상수 = 초기값;  
}  

상수에 대한 예시는 다음과 같다.

//상수 선언
public class Earth {
	static final double EARTH_RADIUS = 6400;
    static final double EARTH_SURFACE_AREA;
  
  	static {
  		EARTH_SURFACE_AREA = 4*Math.PI*EARTH_RADIUS*EARTH_RADIUS;
    }
}
  
//상수 사용
public class EarthExample {
	public static void main(String[] args) {
  		System.out.println("지구의 반지름:"+Earth.EARTH_RADIUS+"km");
  		System.out.println("지구의 표면적:"+Earth.EARTH_SURFACE_AREA+"km^2");
  }  
}
profile
개발에 재미를 붙여보기 :)

0개의 댓글