본문 바로가기
ETC/Study

[Java] static, final, static final의 차이점

by Youngs_ 2022. 8. 23.

Static

static은 고정된 이라는 뜻이다. 메모리를 공유하여 사용하기 때문에 필요할때 바로바로 호출하거나 데이터를 가져올 수 있게 된다.
즉, 객체 생성없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 활용한다.
공용데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.

Final

final은 최종적인 이라는 의미이다.
즉, 해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다는 의미이다.
주로 상수로 변수를 사용하기 위해 사용하거나 오버라이딩을 막기 위해 사용한다. 만약 클래스에 final을 사용하면 상속을 막아준다.
따라서 변수, 함수, 클래스의 명시적 제한을 나타내기 위해 사용하며, 이를 통해 다양한 팀 협업시 코드의 가독성을 높여주는 효과를 얻을 수 있다.

Static Final

두개를 합쳐서 생각해보면 고정되어 최종적으로 사용된다고 보면된다.
즉, 클래스 자체에 존재하는 단 하나의 상수이다.(클래스자체로 존재하여 접근가능하고 불변하다)
따라서 클래스의 선언과 동시에 반드시 초기화가 필요한 클래스 상수이다.

 

메모리상에서의 이슈

실제 JVM위에서 돌아가는 메모리는 각 영역마다 다른 속성들을 저장한다.

메소드 영역 : 클래스에 대한 정보와 함께 클래스 변수가 저장된다. 클래스파일(*.class)를 읽어들여 해당 클래스의 정보를 저장한다.
만약 메소드나 변수에 static키워드를 붙이면 메소드 영역에 해당 데이터가 저장된다. 단, static영역에서는 GC(Garbage Collector)가 작동하지 않아서 시스템 종료시까지 계속 메모리에 남게 되고 시스템에 퍼포먼스 측면에서 악영향을 미칠 수 있다.

힙영역 : 자바 프로그램에서 생성된 모든 인스턴스 변수가 저장된다. new 키워드를 사용하여 인스턴스가 생성되고 힙영역에 저장한다.

스택영역 : 메소드가 실행될때 호출과 관계되는 지역 변수나 매개 변수를 저장한다. 스택은 선입선출로 동작한다. 메모리에는 한계가 있기 때문에 계속해서 재귀(함수안에 함수)를 수행하면 스택에 함수정보가 계속 저장되어 문제가 발생할 수 있다.

 


 

static = 고정된

final = 최종적인

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

 

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

static = 고정된 final = 최종적인 final static = 상수? 이론을 공부하면서 세 가지 개념에 대해 모호했던 기억이 있다. 이번에 학습한 내용을 바탕으로 정리하였다. 1. Static static은 "고정된" 이라는 의미

gobae.tistory.com

https://guccin.tistory.com/155

 

[Java] static과 final의 차이가 뭘까?(feat. JVM 메모리)

Static static은 고정된 이라는 뜻이다. 메모리를 공유하여 사용하기 때문에 필요할때 바로바로 호출하거나 데이터를 가져올 수 있게 된다. 즉, 객체 생성없이 사용할 수 있는 필드와 메소드를 생성

guccin.tistory.com

 

'ETC > Study' 카테고리의 다른 글

[Database] EXISTS, IN 차이  (0) 2022.09.30
[Network] GET 방식, POST 방식  (0) 2022.09.05
[디자인 패턴] MVC, MVP, MVVM 차이  (0) 2022.08.23
[Kotlin] 추상클래스, 인터페이스 차이  (0) 2022.08.05
[Android] 4대 컴포넌트  (0) 2022.08.04

댓글