[Java] final 변수와 상수

2024. 12. 20. 23:07·Back-end/Java

❗해당 포스팅은 인프런에서 제공해주는 강의 내용을 개인적으로 정리하였음을 알려드립니다.

 

김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런

김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문

www.inflearn.com


final을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. 이후 변수 값 변경 시 컴파일 오류 발생❗

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

 

매개변수에 final이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다.

static void method(final int parameter) {
    //parameter = 20; //컴파일 오류
}

 

때론 final을 사용하여 메모리가 낭비 되는 경우도 있다. 다음의 경우를 보자.

public class FieldInit {
    final int value = 10;
}
System.out.println("필드 초기화");
FieldInit fieldInit1 = new FieldInit();
FieldInit fieldInit2 = new FieldInit();
FieldInit fieldInit3 = new FieldInit();
System.out.println(fieldInit1.value);
System.out.println(fieldInit2.value);
System.out.println(fieldInit3.value);

모든 인스턴스가 같은 값을 사용하기 때문에 결과적으로 메모리를 낭비하게 된다. 

이럴 때 사용하면 좋은 것이 static 영역인데, static을 사용하여 중복과 비효율 문제 모두 해결 가능하다.

 

 

상수란 변하지 않는 값을 말하는데, 자바 상수는 static final 키워드를 사용한다.

 

public class ConstantMain2 {
    public static void main(String[] args) {
        System.out.println("프로그램 최대 참여자 수 " + 1000);
        int currentUserCount = 999;
        process(currentUserCount++);
        process(currentUserCount++);
        process(currentUserCount++);
    }

    private static void process(int currentUserCount) {
        System.out.println("참여자 수:" + currentUserCount);
        if (currentUserCount < 1000) {
            System.out.println("게임에 참여합니다.");
        }else{
            System.out.println("대기자로 등록됩니다.");
        }
    }
}

위와 같은 프로그램이 있을 때 최대 참여자 수를 수정하려고 하면 관리가 어렵다. 이 코드가 생소한 사람에겐 1000이라는 숫자의 의미를 모를 수도 있다. 이것을 매직넘버라 부른다. ㅎ

 

이러한 문제를 방지하기 위해 static final을 사용한다.

package final1;

public class Constant {
    //수학 상수
    public static final int MAX_USERS = 1000;
}
public class ConstantMain2 {
    public static void main(String[] args) {
        System.out.println("프로그램 최대 참여자 수 " + Constant.MAX_USERS);
        int currentUserCount = 999;
        process(currentUserCount++);
        process(currentUserCount++);
        process(currentUserCount++);
    }

    private static void process(int currentUserCount) {
        System.out.println("참여자 수:" + currentUserCount);
        if (currentUserCount < Constant.MAX_USERS) {
            System.out.println("게임에 참여합니다.");
        }else{
            System.out.println("대기자로 등록됩니다.");
        }
    }
}

 


참조형 변수에 final이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지 참조하는 대상의 값은 변경할 수 있다. 

public class FinalRefMain {
    public static void main(String[] args) {
        final Data data;
        data = new Data(); //참조대상을 바꿀 수 없음

        //참조 대상의 값은 변경 가능
        data.value = 10;
        System.out.println(data.value);
        data.value = 20;
        System.out.println(data.value);
    }
}


정리💫

final은 매우 유용한 제약.
final 붙으면 못바꾼다!!
인스턴스 변수에 사용 할 거면 static을 사용해서 메모리를 효율적으로 사용할 필요가 있다.
static final은 상수다.

'Back-end > Java' 카테고리의 다른 글

[Java] 상속  (0) 2025.02.04
[Java] static 메서드  (1) 2024.12.20
[Java] static 변수  (0) 2024.12.16
[Java] 자바 메모리 구조  (0) 2024.12.14
[Java] 기본형과 참조형  (3) 2024.12.03
'Back-end/Java' 카테고리의 다른 글
  • [Java] 상속
  • [Java] static 메서드
  • [Java] static 변수
  • [Java] 자바 메모리 구조
dev_ajrqkq
dev_ajrqkq
알고리즘 천재가 될 거야
  • dev_ajrqkq
    기록이 자산이다
    dev_ajrqkq
  • 전체
    오늘
    어제
    • 분류 전체보기 (139)
      • Front-end (0)
      • Back-end (11)
        • Spring (1)
        • Java (8)
      • CS (9)
        • 데이터베이스 (5)
        • 네트워크 (4)
      • Algorithm (72) N
      • 이것저것 (0)
      • 버그잡기 (1)
      • TIL (37)
      • 후기 (1)
      • 취준 (0)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      코딩테스트준비
      개발자취업
      오블완
      99클럽
      티스토리챌린지
      TypeScript
      항해99
      Til
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    dev_ajrqkq
    [Java] final 변수와 상수
    상단으로

    티스토리툴바