Java - final

develkkm·2025년 9월 22일

0부터 시작하는 Java

목록 보기
17/27

final


1. final 변수

final은 “끝”이라는 의미 그대로, 더 이상 변경할 수 없음을 뜻한다.

지역 변수

public class FinalLocalMain {
    public static void main(String[] args) {
        final int data1;
        data1 = 10;   // 최초 한 번만 할당 가능
        // data1 = 20; // 컴파일 오류

        final int data2 = 10;
        // data2 = 20; // 컴파일 오류

        method(10);
    }

    static void method(final int parameter) {
        // parameter = 20; // 컴파일 오류
    }
}
  • final 지역 변수는 최초 한 번만 값을 할당할 수 있다.
  • 매개변수에 final을 붙이면 메서드 내부에서 값 변경이 불가능하다.

2. final 필드 (멤버 변수)

생성자 초기화

public class ConstructInit {
    final int value;

    public ConstructInit(int value) {
        this.value = value; // 생성자를 통해 최초 한 번 초기화
    }
}

필드 초기화

public class FieldInit {
    static final int CONST_VALUE = 10; // static final
    final int value = 10;              // 인스턴스별 고정 값
}
  • 생성자 초기화: 인스턴스마다 다른 값을 가질 수 있다.
  • 필드 초기화: 모든 인스턴스가 같은 값을 가진다.
  • static final : 클래스 차원에서 단 하나만 존재하며 변경 불가능하다.

3. 상수(Constant)

변하지 않고, 프로그램 전체에서 공유되는 고정된 값을 상수라 한다.
자바에서는 static final 키워드로 정의한다.

public class Constant {
    public static final double PI = 3.14;
    public static final int HOURS_IN_DAY = 24;
    public static final int MINUTES_IN_HOUR = 60;
    public static final int SECONDS_IN_MINUTE = 60;
    public static final int MAX_USERS = 1000;
}
  • 이름은 대문자로 작성하며 단어 구분은 _ 사용 (MAX_USERS)
  • 값을 변경할 수 없으므로 필드 직접 접근이 가능하다.
  • 프로그램 설정값이나 수학적 상수 등에 사용된다.

4. final과 참조형 변수

기본형과 참조형에 final을 적용했을 때 동작이 다르다.

public class Data {
    public int value;
}

public class FinalRefMain {
    public static void main(String[] args) {
        final Data data = new Data();

        // data = new Data(); // 컴파일 오류: 참조값 변경 불가

        data.value = 10; // 참조 대상 내부 값은 변경 가능
        data.value = 20;
    }
}
  • final Data data : 다른 객체를 가리킬 수 없다. (참조값 변경 불가)
  • 하지만 data.valuefinal이 아니므로 내부 데이터 변경은 가능하다.

5. 실무 활용 예시

고객의 id와 같이 절대 바뀌면 안 되는 값final을 적용한다.

public class Member {
    private final String id; // 변경 불가
    private String name;

    public Member(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public void changeData(String id, String name) {
        // this.id = id; // 컴파일 오류
        this.name = name;
    }

    public void print() {
        System.out.println("id:" + id + ", name:" + name);
    }
}
public class MemberMain {
    public static void main(String[] args) {
        Member member = new Member("myId", "kim");
        member.print();

        member.changeData("myId2", "seo");
        member.print();
    }
}

실행 결과

id:myId, name:kim
id:myId, name:seo
  • id는 생성자에서만 초기화 가능, 이후 변경 불가
  • name은 자유롭게 변경 가능
profile
알던것을 더 확실하게

0개의 댓글