티스토리 뷰

Java

final & static

토마토계란 2021. 12. 22. 02:09

final 키워드

final은 entity가 오로지 한 번 할당될 수 있음을 의미

  • final 변수 : 한 번만 초기화 가능
  • final 메서드 : 해당 메서드를 오버라이드하거나 숨길 수 없음
  • final 클래스 : 상속할 수 없음. 상속 계층 구조에서 '마지막' 클래스
    • 보안과 효율성을 위해 자바 표준 라이브러리 클래스에서 사용
    • 대표적으로 java.lang.System, java.lang.String 이 있다
  1. final 멤버 변수가 반드시 상수는 아니다
  2. final의 의미가 '상수'가 아니라 '한 번만 초기화 가능하다'이기 때문
  3. private 메서드와 final 클래스의 모든 메서드는 명시하지 않아도 final처럼 동작
  4. 오버라이드가 불가능하기 때문

static 키워드

static은 해당 데이터의 메모리 할당을 컴파일 시간에 할 것을 의미.

'전역', '정적'의 의미로 통용된다

  • static 멤버 변수
    • 클래스 변수
    • 모든 해당 클래스는 같은 메모리를 공유
    • 특정 인스턴스에 종속되지 않음
    • 인스턴스가 생성되지 않더라도 사용 가능
  • static 메서드
    • 클래스 메서드
    • 오버라이드 불가
    • 상속 클래스에서 보이지 않음
  • static 블록
    • 클래스 내부에 만들 수 있는 초기화 블록
    • 클래스가 초기화될 때 실행되고, main()보다 먼저 수행됨
  • static 클래스
    • 중첩 클래스(nested class)에만 사용 가능
      • static nested class: static으로 정의된 nested class
      • inner class: static으로 정의되지 않은 nested class
    • 부모 클래스의 멤버 필드중에는 static 필드에만 접근 가능
    • 사실상 일반적인 top-level 클래스와 동일하게 동작하지만, 그 위치가 하나의 top-level 클래스 안에 들어있는 것이다.
      • 이것은 유사한 클래스 집합을 하나로 묶고, 클래스 패키징 구조를 편리하게 정리하는 테크닉으로 사용될 수 있다.

그렇다면 static final을 쓰는 이유?

클래스 멤버 변수를 final로 지정하는 의도의 확인

인스턴스가 만들어질 때마다 새로운 메모리를 할당하지 않으면서, 멤버 변수의 데이터와 의미, 용도를 고정하겠다는 의미.

public static final String NAME_OF_GOD = "하나님";
public static final int MAX_SUBJECT_SCORE = 100;

final 멤버 변수에 static을 사용하지 않는 경우는?

당연히 있다.

인스턴스마다 다른 값을 가질 수 있지만 생성된 후 값이 변경되지 않을 때

대표적으로 Spring Framework에서 사용하는 DI(Dependency Injection)이 있다.

public class A {

  @Autowired
	private final B b;
}

static 멤버 변수에 final을 사용하지 않는 경우는?

가능하지만 좋은 코딩 관례(practice)라고 보기에는 어렵다.

'Java' 카테고리의 다른 글

[Effective Java] Item 44. 표준 함수형 인터페이스를 사용하라  (0) 2023.06.20
Optional 제대로 된 사용법  (0) 2021.12.22
volatile & native  (0) 2021.12.22
Garbage Collector  (0) 2021.12.22
Reflection  (0) 2021.12.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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 31
글 보관함