Java static, static final, final 차이

2022. 9. 15. 19:00·Java

Java static, static final, final 차이

자바의 static, static final, final은 종종 헷갈릴 수 있는 제어자로 코드를 통해 어떻게 다른지 확인해보겠습니다.

예시 코드

public class Account {

    static double rate = 1.5;
    static final int odLimit = 1000;

    final int accountId;

    public Account(int id) {
        accountId = id;
    }

    public static void main(String[] args) {
        Account first = new Account(123);
        Account second = new Account(456);

        // The following prints 123
        System.out.println(first.accountId);
        // The following prints 456
        System.out.println(second.accountId);

        // Next line triggers a compile error
        // first.accountId = 789;

        //static 변수 변경. Account.rate 1.5 -> 3.5로 변경
        Account.rate = 3.5;
        System.out.println("Account.rate:" + Account.rate);

        //Next line triggers a compile error
        //Account.odLimit = 2000;
    }
}

static

static 키워드를 가진 멤버는 값이 클래스의 모든 인스턴스에 대해 동일합니다.
클래스의 모든 인스턴스가 액세스할 수 있는 전역 변수라고 볼 수 있습니다. 그러나 static 변수는 상수가 아니므로 언제나 변경될 수 있습니다.

  • 때때로 static 을 설명할 때 단 한 번 초기화 된다는 문구를 볼 수 있는데요. 해당 부분을 확인해봐야겠습니다.
  • static 변수가 생성되는 메모리 위치와 실행순서 확인하기.
    • 클래스로더에 의해서 initialize 단계에서 생성되는 것으로 알고 있다.

static final

변경할 수 없고 클래스의 모든 인스턴스에 대해 동일한 값을 설정할 때는 static final을 사용해야 합니다.
static 키워드는 값이 클래스의 모든 인스턴스에 대해 동일함을 의미합니다. final 키워드는 변수에 값이 할당되면 절대 변경할 수 없음을 의미합니다. Java에서 static final의 조합은 클래스 변수의 상수 값을 만드는 방법입니다.

final

final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 합니다. 하지만 인스턴스 변수의 경우 생성자에서 초기화할 수 있습니다.

그 이유는 인스턴스가 new 키워드로 힙에 생성될 때 처음엔 변수 타입의 기본값으로 할당된 후 각 인스턴스에서 설정한 값으로 초기화 되기 때문입니다.

그러므로 accountId가 final이더라도 각 개별 Account 인스턴스는 고유한 값을 가질 수 있습니다.

 


 

추가로 자바 메모리 할당 과정과 JVM에 대해 작성한 글도 확인해보세요.

 

 

자바 상속의 메모리 할당 과정

자바 상속의 메모리 할당 과정 최근 자바의 정석 상속 부분을 다시 읽으며 이해되지 않은 문장들이 있었고 이에 자바 상속의 메모리 할당 과정에 대해 조사하게 되었습니다. 이해한 내용을 바탕

devstep.tistory.com

 

 

 

JVM과 자바 실행 과정 알아보기

자바 소스 파일(.java)을 실행하는 과정을 살펴보면서 JVM의 각 항목에 대해서 알아보았습니다. JVM에 대해 조사할 때 소제목으로 알아보는 것보다는 자바 실행 과정이라는 키워드로 접근하는 것이

devstep.tistory.com

 

 

 


참고자료

  • https://www.theserverside.com/video/Why-we-use-static-final-in-Java-for-constants#:~:text=The%20static%20keyword%20means%20the,to%20create%20a%20constant%20value.
저작자표시 비영리 변경금지 (새창열림)

'Java' 카테고리의 다른 글

Java 클래스  (0) 2022.09.30
Java 예외 처리  (0) 2022.09.29
Java 패키지package  (0) 2022.09.13
자바 상속의 메모리 할당 과정  (0) 2022.09.05
Java 상속, 오버라이딩, 다이나믹 메소드 디스패치  (0) 2022.08.29
'Java' 카테고리의 다른 글
  • Java 클래스
  • Java 예외 처리
  • Java 패키지package
  • 자바 상속의 메모리 할당 과정
devstep
devstep
웹 백엔드 개발자
  • devstep
    개발 여정
    devstep
  • 전체
    오늘
    어제
    • 분류 전체보기 (89) N
      • Java (24)
      • Spring Framework (16)
        • Spring (13)
        • JPA (3)
      • Database (8)
        • RDBMS공통 (1)
        • MySQL (6)
        • Redis (0)
        • Oracle (1)
      • Concept (13)
        • 테스트코드 (4)
        • 클린코드 (2)
        • 성능테스트 (4)
        • 설계 (1)
        • 인증 (1)
        • REST API (1)
      • git (2)
      • Intellij (4)
      • Computer Science (3)
        • 네트워크 (1)
        • 자료구조 (1)
        • 보안 (1)
      • Essay (17) N
        • Learning Essay (10)
        • WIL (7) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    applicationcontext
    JavaMemoryModel
    linux
    tdd
    부하테스트
    component
    nginx
    비대칭암호화
    nofile
    bean
    클린코드
    ClusteredIndex
    성능테스트
    innodb
    JVM
    테스트코드
    JMeter
    storageEngine
    seed
    DDD
    대칭암호화
    부하테스트도구
    springsecurity
    자바메모리모델
    인텔리제이실행에러
    aggregate
    보안
    블록암호화
    단위테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devstep
Java static, static final, final 차이
상단으로

티스토리툴바