static, final, static final의 차이

·2023년 10월 3일
0

프로젝트 공부

목록 보기
30/33
문법설명
static객체마다 가질 필요가 없는 공용으로 사용하는 필드 혹은 인스턴스 필드를 포함하지 않는 메소드
final한 번 값이 정해지고 나면 값을 바꿀 수 없는 필드
static final모든 영역에서 고정된 값으로 사용하는 상수, 생성 즉시 값을 넣어줘야 한다.

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;

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

또한, 정적 메소드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에
인스턴스 필드나 메소드, 그리고 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
  } 
}

또한 static은 메소드 영역에 저장되기 때문에 시스템 종료 시 까지 계속 메모리에 남게 된다.

2. final

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

final 필드에 값을 저장하는 방법은
선언과 동시에 값을 저장하는 방법과, 선언 후 나중에 저장하는 방법이 있다.

public class Shop{

  // Shop 인스턴스는 closeTime을 바꿀 수 없고, 통일됨
  final int closeTime = 21;
  
  // Shop 인스턴스는 openTime을 각자 설정할 수 있고,
  // 한번 설정하면 바꿀 수 없음
  final int openTime;

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

3. static final = 상수 선언

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

final로 상수 선언이 가능하지 않나요?

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

static final은 아래와 같은 형태로 선언할 수 있다.

static final double PI = 3.141592;

참고
[Java] static, final, static final의 차이

profile
개발자가 되고싶은 낭랑 24세

0개의 댓글

관련 채용 정보