토이 프로젝트 배우게 된 것들 & 오류 해결🐰

final vs static final

j_estory 2022. 11. 21. 16:28

final 키워드

  • final은 최종적인 이라는 의미를 가지고 있다. 
  • 즉, 해당 변수는 값이 저장되면 최종적인 값이 된다. 

🏷 final 사용법

 

✔️class 필드 안

 

final String name = "choi";
  • 클래스 필드 변수에 = 연산자를 사용하여 값을 넣어준다.

 

✔️ 생성자를 통해

 

public Class Users {
	final String name;
    
    public Users(String name) {
    	this.name = name;
    }
}

만약, 위의 코드에 static이 붙게 된다면, 

static final String name; // 컴파일 에러가 발생한다.

 

이유: static 키워드는 JVM 구동 시, 메모리에 올라가 있어야 하므로, 객체의 생성과 관계 없이 초기값이 할당 되어 있어야 하기 때문이다.

 

정답: static final String name = "Choi"; // 변수 선언 시 초기 값 할당

 

 

✏️ staitc VS final

 

 

static final 

  • 선언과 동시에 초기화 되어 프로그램이 종료될 때까지 값이 유지된다.
  • 객체 생성과 무관하다.

final

  • 객체 생성 시 마다, 초기화를 통해 값을 다르게 설정 할 수 있다.
  • 객체 생성과 유관하다.

 

❓ final은 상수인가?

 

final을 통해 상수의 역활을 할 수는 있다.

  • = 연산자를 이용하면 사실 값을 변경할 수 없기 때문이다. 
  • 하지만, final을 붙였다고 해서 상수가 되는 건 아니다.
    • 생성자를 통해 값을 할당할 때에는 파라미터로 받는 값에 따라 변수의 값이 달라지기 때문이다.
    • 완전한 상수를 만들기 위해서는 개체의 생성과 상관없이 메모리에 값이 할당되는 static 키워드를 통해 상수를 생성하자!

 

📘 부록

 

해당 내용으로 스터디를 했을 때, 알게된 점도 기록해보려고 한다.

 

만약 ,

fina User user = new User(); 으로 user 객체를 생성한다면,

user의 번지 수는 불변이겠지만, 그 안의 값들은 변경된다.

 

즉, final을 선언했다고 해서 그 안의 값들에 대해서는 불변을 보장할 수 없다는 것이다.