도찐개찐

[JAVA] static, final, static final 본문

JAVA

[JAVA] static, final, static final

도개진 2022. 7. 6. 14:44

static

  • 객체의 개수와 상관 없이 한번만 생성되며, 모든 객체가 공유하는 멤버
  • 필드, 메서드 적용할 수 있습니다.
  • Static 메서드 영역에서 객체형 멤버를 접근할 수 없습니다.
  • Static 멤버는 객체 참조로 접근할 수 없고 class로 접근해야 합니다.

final

  • 값 변경이 불가능한 멤버
  • 필드초기화, 생성자 영역에서 값 변경 가능

static final

  • 값 변경이 불가능한 static 멤버
  • 필드초기화영역에서만값변경가능 – 필드 초기화는 필수

 

 

 

1. Static

 

static은 "고정된" 이라는 의미

객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 활용한다.

 

필드나 메소드를 객체마다 다르게 가져야 한다면 인스턴스로 생성하면 되고

공용 데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.

 

사용하기 위해선 클래스 내에서 필드나 메소드 선언 시 static 키워드를 붙여주기만 하면 된다.

 

public class PlusClass{
  static int field1 = 15;

  static int plusMethod(int x, int y){ return x+y; } 
}

다음과 같이 선언하고

 

int ans1 = PlusClass.plusMethod(15,2);
int ans2 = PlusClass.field1 + 2;

다음과 같이 바로 "클래스이름.필드" 로 사용할 수 있다.

 

물론, 아래와 같이 객체 참조 변수를 이용할 수 있지만 추천되진 않는다.

PlusClass pc = new PlusClass();
int ans1 = pc.plusMethod(15,2);

 

또한, 정적 메소드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에

인스턴스 필드나 메소드, 그리고 this 키워드를 사용할 수 없다.

public class PlusClass{
  static int field1 = 15;
  int field2;

  void method1(){}
  static void method2(){}
  static int plusMethod(int x, int y){
    this.field2 = 10; // <-- x
    this.method1(); // <-- x
    field1 = 10; // <-- o
    method2(); // <-- o
  } 
}

간단하게 말하면, 인스턴스 성질은 객체 생성 후 사용할 수 있으므로

객체 참조 없이 사용하는 정적 메소드에는 사용할 수 없는 것이다.

 

 

2. Final

final은 "최종적인" 이라는 의미

즉 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는 의미이다.

 

final 필드에 값을 저장하는 방법은 다음 두 가지가 있다.

public class Shop{

  final int closeTime = 21;
  final int openTime;

  public Shop(int openTime){
    this.openTime = openTime;
  }
}

하나는 closeTime과 같이 선언과 동시에 값을 주는 방법이 있고

openTime과 같이 생성하고, 객체를 생성할 때 생성자 public Shop에 의해 값을 주는 방법이 있다.

 

모든 가게가 오픈 시간은 자유롭지만 한 번 정한 오픈 시간을 바꿀 수 없고, 21시에는 모두 닫아야 할 때

위와 같이 final 키워드를 이용하면, 오픈 시간은 객체마다 다르게 설정이 가능하지만, 닫는 시간은 고정되도록 코딩이 가능하다.

 

 

3. static final

static + final = "고정된 + 최종적인"의 의미로, 상수를 선언하고자 할 때 사용된다.

final만으로 충분히 상수가 되지 않느냐? 라는 질문에는 위에서 충분히 답이 됐을 거라고 본다.

 

상수란, fixed로 변하지 않는 값을 뜻하는데

위의 예시에서, closeTime은 21로 변하지 않지만, openTime은 객체마다 다를 수 있음을 보였으므로 final 자체만으로는 상수를 의미할 수 없다.

 

상수의 선언 방법 또한 간단하다.

static final double PI = 3.141592;

static + final로 선언된 PI 값은 3.141592라는 불변의 값을 가진다. 

해당 값은 객체마다 저장될 필요가 없으며(static의 성질) + 여러 값을 가질 수 없다(final의 특징).

 

 

정리하면, 다음과 같다.

static 객체마다 가질 필요가 없는 공용으로 사용하는 필드 혹은 인스턴스 필드를 포함하지 않는 메소드
final 한 번 값이 정해지고 나면 값을 바꿀 수 없는 필드
static final 모든 영역에서 고정된 값으로 사용하는 상수

 

참고 : https://gobae.tistory.com/3

728x90
Comments