Final & Static 키워드(Final & Static Keyword)

Joy🌱·2022년 12월 31일
0

☕ Java

목록 보기
20/40
post-thumbnail

👀 Final 키워드(Final Keyword)

💁‍♀️ Final 키워드(Final Keyword)란,
final은 변경 불가의 의미를 담고 있는 키워드.
클래스 필드의 final 변수는 선언과 동시에 초기화 하거나 생성자를 통한 초기화를 해야 함


1) 선언과 동시에 초기화

private final int NON_STATIC_NUM = 1;
>>> 변경 불가한 필드값을 선언할 것이므로 반드시 초기화를 함께 해주어야함

2) 생성자를 이용해 초기화

	private final String NON_STATIC_NAME;
    >>> 객체가 생성될 때 만들어지는 공간
	
//	public FinalFieldTest() {} 
    >>> NON_STATIC_NAME을 초기화 하지 않는 생성자는 선언할 수 없다.
	
	public FinalFieldTest(String nonStaticname) {
		this.NON_STATIC_NAME = nonStaticname;
	}

3) static field에 final 사용 : 상수 필드

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 키워드(Static Keyword)란,
static은 정적 메모리 영역에 프로그램이 start될 시 할당 하고자 할 때 사용하는 키워드.
static 필드나 메소드는 객체(인스턴스) 생성 없이 사용 가능

  • 여러 인스턴스가 공유해서 사용할 목적으로 만드는 것

◼ StaticFieldTest Class

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++;
	}
}

◼ StaticMethodTest Class

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 호출 됨...");
	}
}

◼ Application Class

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 키워드를 사용

profile
Tiny little habits make me

0개의 댓글

관련 채용 정보