[Java]final, static 어디다가 갖다붙일래? 그리고 static final까지!

Euiyeon Park·2024년 9월 4일
0

Java

목록 보기
10/16
post-thumbnail

🍧 final

final 키워드는 해당 선언이 최종 상태이고, 절대 수정될 수 없음을 의미한다.
final 키워드는 클래스, 필드, 메소드를 선언할 때 사용할 수 있는데
각 경우마다 해석이 조금씩 달라진다.

final 클래스와 final 메소드는 상속과 관련이 있다.

🍭 final 클래스

final 클래스는 최종적인 클래스가 되므로 상속할 수 없는 클래스가 된다.

public final class McDonald {

	public McDonald(int no, String branch){
    	this.no = no;
        this.branch  = branch;
    }
}
public class McDonaldDT extends McDonald {
	
    // error
		
}

McDonaldfinal 클래스이므로, McDonaldDT가 상속받을 수 없다.

🍭 final 필드(변수)

final 필드(변수)는 한번 초기화되면 다시 값을 변경할 수 없다.

final int value = 20;
value = 30;  // error

💡 클래스 내에서 final 필드를 선언하고 초기화를 하지 않은 경우
반드시 생성자에서 초기화를 해야 한다.

클래스 내의 final 필드는 인스턴스 필드로 인스턴스마다 다른 값을 가져야 하는데,
생성 이후 그 값이 변경되지 않도록 할 때 사용한다.

public class McDonald {
	
    private final int no;	// 지점 번호(인스턴스마다 다른값, 생성 이후 값 변경 불가)
    private String name;	// 지점명
    
    public McDonald(int no, String name){
		this.no = no;
        this.name = name;
    }
    
    public final void makeBurger(){
    	System.out.print("참깨빵위에순쇠고기패티두장특별한소스양상추치즈피클양파까지");
}

🍭 final 메소드

final 메소드는 최종적인 메소드가 되므로 재정의할 수 없는 메소드가 된다.
즉, 부모 클래스를 상속받은 자식 클래스에서 부모 클래스에 선언된 final 메소드는
자식 클래스에서 재정의할 수 없다.

public class McDonaldDT extends McDonald {
	public McDonaldDT(int no, String name){
    	super(no, name);
    }
    
    // error
    @Override
    public void makeBurer(){
        ...재정의할 수 없음...
    }
}

🍧 static final

static final은 주로 상수(constant)를 정의할 때 사용되며,
staticfinal 키워드의 조합으로 이루어져 있다.

1. static
변수(필드)나 메소드 클래스에 속한다.
클래스에 속하기 때문에, 해당 변수나 메서드는 모든 인스턴스가 공유한다.
따라서 인스턴스를 생성하지 않고 클래스 이름을 통해 접근 가능하다.
static 변수는 클래스 로드 시점에 초기화되며, 프로그램 종료 시까지 유지된다.

2. final
변수나 메소드가 더 이상 변경할 수 없도록 한다.
final은 한 번만 초기화할 수 있으며, 그 이후에는 값이 변경되지 않는다.

3. static final
클래스 레벨에서 정의된 상수로, 클래스가 로드될 때 초기화 되며 이후에 변경할 수 없다.
모든 인스턴스가 동일한 상수 값을 공유한다.

💡 staticfinal은 각각 클래스, 메서드, 필드(변수)에 적용될 수 있지만
static final필드(변수)에만 한정된다.

🍭 static 클래스

static 키워드는 일반 클래스에서 사용할 수 없지만
내부 클래스(중첩 클래스)에서는 사용할 수 있다.

static 내부 클래스는 외부 클래스의 인스턴스와 독립적으로 사용할 수 있으며,
외부 클래스의 인스턴스 없이 생성할 수 있다.

🍭 static 필드

static 필드는 클래스 레벨에서 정의되며, 모든 인스턴스가 공유하는 변수다.
클래스에 속하는 변수로 인스턴스를 생성하지 않고도 접근할 수 있다.

🍭 static 메소드

static 메서드는 클래스 레벨에서 정의되며, 인스턴스 없이 호출할 수 있다.


🍧 final과 static final의 차이점(변수)

🍭 범위와 접근성

  • final : 인스턴스 레벨에서 정의, 각 인스턴스마다 고유한 값을 가질 수 있다.
  • static final : 클래스 레벨에서 정의, 모든 인스턴스가 동일한 값을 공유한다.

🍭 초기화 시점

  • final : 생성자에서 초기화, 이 경우 인스턴스마다 다른 값을 가진다.
  • static final : 클래스 로드 시점에 한 번만 초기화, 초기화된 이후 값이 변경되지 않는다.

🍭 용도

  • final : 인스턴스별로 상수화된 값을 가지게할 때 사용한다.
  • static final : 모든 인스턴스가 공유하는 상수를 정의할 때 사용한다.

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글