인프런/김영한 자바

[김영한의 실전 자바 기본편] - 8. final

sson-coding 2025. 9. 12. 10:07
본 글은 김영한 님의 『김영한의 실전 자바 - 기본편』 강의를 학습하며 정리한 내용입니다.
강의 자료에 포함된 일부 코드와 이미지를 참고하여 발췌·활용하였습니다.

자바 기본기를 제대로 다지고 싶으시다면, 아래 링크에서 강의를 확인해 보세요 

『김영한의 실전 자바 - 기본편』 보러 가기

본 게시물은 파트너스 활동의 일환으로 작성되었으며, 구매 시 소정의 수수료를 받을 수 있습니다.


final 변수

변수에 final 키워드가 붙으면 더는 값을 변경할 수 없게 된다.

그럼 final 을 어떻게 사용할 수 있는지, 사용하면 어떻게 되는지 알아보자.

final - 지역 변수

package final1;
public class FinalLocalMain {
	 public static void main(String[] args) {
		 //final 지역 변수1
		 final int data1;
		 data1 = 10; //최초 한번만 할당 가능
		 //data1 = 20; //컴파일 오류
		 
		 //final 지역 변수2
		 final int data2 = 10;
		 //data2 = 20; //컴파일 오류
		 method(10);
	 }
	 //final 매개변수
	 static void method(final int parameter) {
		 //parameter = 20; 컴파일 오류 
	 }
}

final 을 지역 변수에 설정할 경우 특징은 아래와 같다.

  1. 최초 한번만 할당할 수 있고, 이후에 변수의 값을 변경하려면 컴파일 오류가 발생한다.
  2. 바로 초기화 한 경우 이미 값이 할당되었기 때문에 값을 할당할 수 없다.
  3. 매개변수에 final 이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다.
    1. 호출 시점에 사용된 값이 끝까지 사용된다.

final - 필드(멤버 변수)

//final 필드 - 생성자 초기화
public class ConstructInit {
	 final int value;
	 public ConstructInit(int value) {
		 this.value = value;
	 }
}

//final 필드 - 필드 초기화
public class FieldInit {
	 static final int CONST_VALUE = 10;
	 final int value = 10;
}

final 을 필드에 사용할 경우 특징은 아래와 같다.

  1. 해당 필드는 생성자를 통해 한번만 초기화 할 수 있다.
  2. 필드에서 초기화하면 이미 값이 설정되었기 때문에 생성자를 통해서도 초기화 할 수 없다.

상수

상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말한다. 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 말한다.

이런 이유로 상수는 static final 키워드를 사용한다.

특징

  1. static final 키워드를 사용한다.
  2. 대문자를 사용하고 구분은 _(언더스코어) 로 한다.(관례)
  3. 필드를 직접 접근해서 사용한다.

final 변수와 참조

final 은 변수의 값을 변경하지 못하게 막는다. 기본형 변수에 사용하면 값을 변경할 수 없고, 참조형 변수에 사용하면 참조값을 변경할 수 없다.

그런데 참조 대상의 객체 값은 변경할 수 있다.

public class FinalRefMain {
	 public static void main(String[] args) {
		 final Data data = new Data();
		 //data = new Data(); //final 변경 불가 컴파일 오류
		 //참조 대상의 값은 변경 가능
		 data.value = 10;
		 System.out.println(data.value);
		 data.value = 20;
		 System.out.println(data.value);
	 }
}

# 실행 결과
data.value = 10
data.value = 20

참조형 변수에 final 이 붙으면, 참조값을 다른 값으로 변경하지 못하는 것이다. 이 변수 이외에 다른 곳에 영향을 주는 것이 아니다. 따라서 Data.value 는 값을 변경할 수 있다.