티스토리 뷰

리뷰어님의 피드백!

우테코에서 자동차 경주 미션을 하면서 리뷰어님께 위와 같은 피드백을 받았습니다..

미션은 GitHub - woowacourse/java-racingcar-precourse: 자동차 경주 게임 미션을 위한 저장소에서 볼 수 있습니다

public class InputView {

    private static final int MAX_TRIAL_NUM = 2;
    private static final int MIN_CAR_NAME_LENGTH = 1;
    private static final int MAX_CAR_NAME_LENGTH = 5;
}

위 클래스는 자동차의 입력을 받는 클래스의 필드 선언 부분입니다..


여기서 고민이 됐던 점은 요구 사항에서 InputView의 경우 하나의 인스턴스만 생성되는데
해당 필드들을 'final'로 선언할지 아니면 'static final'로 선언할지 의문이 생겼습니다.

 

스스로도 final, static final의 모호함과 기준이 없었기에,,,
이번 기회를 통해 기본 개념을 다시 학습할겸 관련 내용을 정리해보려고 합니다.

final

의미 : 마지막의, 변경될 수 없는

적용 대상 :

  • 클래스
    - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. (즉, final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.)
    예시: Constants, Util 형식의 클래스
  • 메서드
    - 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다
  • 멤버/지역 변수
    - 원시 타입의 경우 final로 선언하면 초기화 후, 값을 변경할 수 없는 상수가 된다
    - 객체 타입의 경우 final로 초기화 이후, 다른 참조 값을 지정할 수 없다 (단, 객체 자체가 immutable하다는 의미는 아님)

 

저장위치 : (final 키워드가 붙은)멤버 변수(클래스 영역에 선언)의 경우 인스턴스가 생성될 때, heap영역에 저장되며 GC에 의해 소멸한다

객체 타입의 경우 final을 붙인다고 해도 값이 변경될 수 있습니다. (객체 내에 있는 setter 같은 메서드들을 통해..)

static

의미 : 클래스의, 공통적인

 

적용 대상 :

  •  멤버변수
    - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다
    - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다
    - 클래스가 메모리에 로드될 때 생성된다
  • 메서드
    - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다
    - static메서드 내에서는 인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)들을 직접 사용할 수없다

 

저장 위치 : 클래스 변수(static 변수)의 경우 클래스가 메모리에 올라갈 때 메소드 영역(= 클래스 영역 = static 영역)에 저장된다. 그 후 프로그램이 종료시 소멸한다

static final

의미 : 클래스에서 사용할 해당 멤버 변수의 데이터와 그 의미, 용도를 고정시키겠다!

 

static final의 경우 인스턴스가 생성될 때마다 새로운 메모리에 초기화 시키지말고

다 같은 값을 가질 수 있는 '상수'로 사용하자는 의미가 생겨 관례상 멤버 상수는 static final 키워드를 붙인다고 합니다.

 

추가로, 멤버 변수에 final 키워드만 붙이는 경우는

1. 인스턴스마다 초기화 할 때 다른 값을 가지는 경우..
2. Spring 프레임워크를 사용하여 private final 키워드를 사용해 의존성을 주입을 받는 경우

가 있습니다.

추가적으로 알게된 부분

자바의 초기화 순서 :

  1. 기본값 초기화 (멤버 변수가 초기화 될 때, 초기화되있지 않은 변수들에 자료형의 기본값을 넣어준다)
  2. 명시적 초기화 (변수 선언과 동시에 초기화한 경우, 클래스 변수가 인스턴스 변수보다 우선)
  3. 초기화 블럭을 통한 초기화 (클래스 초기화 블럭이 인스턴스 초기화 블럭보다 우선)
  4. 생성자를 통한 초기화

제한자 선언 순서 (네이버 코딩 컨밴션)
“(public protected private) abstract static final transient volatile synchronized native strictfp”

참고 자료 : 
왜 자바에서 final 멤버 변수는 관례적으로 static을 붙일까? | Uno’s Blog

'Backend > Java' 카테고리의 다른 글

[Java] 자바 추상클래스와 인터페이스  (0) 2022.01.15
[Java] Java About Me  (0) 2021.11.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함