💁♀️ Final 키워드(Final Keyword)란,
final은 변경 불가의 의미를 담고 있는 키워드.
클래스 필드의 final 변수는 선언과 동시에 초기화 하거나 생성자를 통한 초기화를 해야 함
private final int NON_STATIC_NUM = 1;
>>> 변경 불가한 필드값을 선언할 것이므로 반드시 초기화를 함께 해주어야함
private final String NON_STATIC_NAME;
>>> 객체가 생성될 때 만들어지는 공간
// public FinalFieldTest() {}
>>> NON_STATIC_NAME을 초기화 하지 않는 생성자는 선언할 수 없다.
public FinalFieldTest(String nonStaticname) {
this.NON_STATIC_NAME = nonStaticname;
}
private static final int STATIC_NUM = 1;
>>> 객체가 생성되기도 전에 할당되는 공간
>>> 이미 static으로 공간은 만들어졌고, final로 마지막임을 선언
📌 Ref.
* '상수필드는 생성자를 이용한 초기화가 불가능'
생성자는 인스턴스가 생성되는 시점에 호출되기 때문에 그 전에는 초기화가 일어나지 않음
static은 프로그램이 시작될 때 할당되기 때문에 결국 초기화가 되지않은 상태로 선언된 것과 동일한 맥락
// private static final double STATIC_DOUBLE;
>>> static의 생성시점이 훨씬 빠름
//
// public FinalFieldTest(double staticDouble) {
// FinalFieldTest.STATIC_DOUBLE = staticDouble;
// }
💁♀️ Static 키워드(Static Keyword)란,
static은 정적 메모리 영역에 프로그램이 start될 시 할당 하고자 할 때 사용하는 키워드.
static 필드나 메소드는 객체(인스턴스) 생성 없이 사용 가능
- 여러 인스턴스가 공유해서 사용할 목적으로 만드는 것
public class StaticFieldTest {
// non-static 필드와 static 필드 선언
private int nonStaticCount;
private static int staticCount;
// 두 필드의 값을 확인하는 getter 메소드
public int getNonStaticCount() {
return this.nonStaticCount;
}
>>> static 필드에 접근하기 위해서는 클래스명.필드명으로 접근 (this.로 접근X)
public int getStaticCount() {
return StaticFieldTest.staticCount;
}
// 두 필드의 값을 1 증가시키는 메소드
public void increaseNonStaticCount() {
this.nonStaticCount++;
}
public void increaseStaticCount() {
StaticFieldTest.staticCount++;
}
}
public class StaticMethodTest{
private int count;
public void nonStaticMethod() {
this.count++;
>>> 인스턴스 생성 후 사용 가능한 메소드이기 때문에 this에는 주소가 들어가 있을 것
System.out.println("nonStaticMethod 호출 됨...");
}
public static void staticMethod() {
// this.count++;
>>> 인스턴스를 생성하지않고 사용하는 메소드이기 때문에 this에는 주소가 들어갈 수 없음
>>> this.는 heap영역에 할당되어있는 주소값을 참조하기 때문
System.out.println("StaticMethod 호출 됨...");
}
}
public class Application {
public static void main(String[] args) {
// static 키워드를 필드에서 사용할 때, (객체 생성)
StaticFieldTest sft1 = new StaticFieldTest();
// 현재 두 필드가 가지고 있는 값 확인
System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());
// 두 필드의 값 1씩 증가 후 값 확인
sft1.increaseNonStaticCount();
sft1.increaseStaticCount();
System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());
/* 새로운 StaticFieldTest 객체 생성 */
StaticFieldTest sft2 = new StaticFieldTest();
System.out.println("non-static field : " + sft2.getNonStaticCount());
System.out.println("static field : " + sft2.getStaticCount());
>>> 여전히 static field의 값은 이전과 동일하게 1 출력
// static 키워드를 method에 작성
StaticMethodTest smt = new StaticMethodTest();
smt.nonStaticMethod();
// Static 메소드의 경우 인스턴스를 생성하지 않고 호출하는 방식으로 사용
StaticMethodTest.staticMethod();
>>> 클래스명.필드명();
}
}
💻 Mini Console
non-static field : 0
static field : 0
non-static field : 1
static field : 1
non-static field : 0
static field : 1
nonStaticMethod 호출 됨...
StaticMethod 호출 됨...
📌 Ref.
* 인스턴스 변수의 경우 sft1과 sft2 두 개의 인스턴스가 서로 값을 공유하지 못 하고
인스턴스를 생성할 때마다 0으로 초기화 됨
하지만 static 필드의 경우에는 클래스 변수 자체가 프로그램을 종료할 때까지 유지되고 있기 때문에
값을 유지하고 있음. 여러 개의 인스턴스가 같은 공간을 공유할 목적으로 필드에 static 키워드를 사용