프로그래밍/java

[자바JAVA] Final & static ( 필드, 메소드)

pupu91 2022. 7. 7. 20:41
반응형

 


final

 


 

  • 변경 불가의 의미를 담고 있는 키워드
  • 클래스 필드의 final 변수는 선언과 동시에 초기화 하거나 생성자를 통한 초기화를 해야 함( 인스턴스 생성만 하면 기본 값 0이 필드에 들어가기 떄문에)

 

(1) 선언과 동시에 초기화 하기
private final int NON_STATIC_NUM = 1;

(2) 생성자를 이용해 초기화 하기
private final String NON_STATIC_NAME;
public Test(String nonStaticName) {
		this.NON_STATIC_NAME = nonStaticName;
	}
(3) static field에 final사용
private static final int STATIC_NUM = 1;
생성자의 이용한 초기화는 불가능.
static은 프로그램이 시작 될 때 할당 되기 때문에 초기화가 되지 않은 상태로 선언된 것과 동일하다.
생성자는 인스턴스가 생성되는 시점에 호출이 되기 때문에 그 전에는 초기화가 일어나지 못하여
생성자를 이용한 초기화는 불가능하다.

 

 

 

 


static

 


 

  • 정적 메모리 영여에 프로그램이 시작할 때 할당을 하는 키워드
  • 인스턴스를 생성하지 않고도 사용할 클래스의 멤버(필드, 메소드)에 지정할 수 있음
  • 여러 인스턴스가 공유해서 사용할 목적의 공간

 

 


 

 

◇ static 필드 흐름 살펴보기 ◇

 

 

 

1 . class StaicFieldTest 생성 후 작성

 

public class StaticFieldTest {

(1) non-static 필드와 static 필드 선언하기
    private int nonStaticCount;
	private static int staticCount;

(2) non-static 필드에 대한 값 확인
public int getNonStaticCount() {
		return this.nonStaticCount;
	}

(3)  static 필드에 대한 값 확인
public int getStaticCount() {
       return StaticFieldTest.staticCount;
	} => static 필드에 접근하기 위해서는 클래스명.필드명으로 작성


(4) 두 필드 값을 1씩 증가시키기 위한 용도의 메소드 생성
public void increaseNonStaticCount() {
this.nonStaticCount++;
	}
	
public void increaseStaticCount() {
		StaticFieldTest.staticCount++;
	}

 

 

 

 

 

2 . class StaticMethodTest 생성 후 작성

 

(5) 호출할 메소드 작성
public class StaticMethodTest {
	
	private int count;
	
public void nonStaticMethod() {
    	this.count++;
        System.out.println("nonStaticMethod 호출 됨...");
	} => 인스턴스 생성 후 사용 가능한 메소드이ㅣ 때문에 this에는 주소값만 있음.
    
    
  public static void staticMethod() {
	System.out.println("staticMethod 호출 됨...");
	} => 인스턴스를 생성하지 않고 사용하는 메소드이기 때문에 this에는 주소가 들어갈 수 없음

 

반응형

 

 

 

3 . Application class 생성 후 메인메소드에서 호출 후 출력

StaticFieldTest sft1 = new StaticFieldTest();

(1) 두 필드가 가지고 있는 값 확인
System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());
◇ 실행 결과
non-static field : 0
static field : 0

(2) 두 필드의 값 1씩 증가 후 값 확인

StaticFieldTest의 1씩 증가시키기 위한 용도로 작성한 메소드 호출
↓ 
sft1.increaseNonStaticCount(); 
sft1.increaseStaticCount();

System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());

◇ 실행 결과
non-static field : 1
static field : 1

(3) 새로운 StaticFieldTest 인스턴스 생성하여 값 확인
StaticFieldTest sft2 = new StaticFieldTest();
System.out.println("non-static field : " + sft2.getNonStaticCount());
System.out.println("static field : " + sft2.getStaticCount());

◇ 실행 결과
non-static field : 0
static field : 1

 

 

  • 인스턴스 변수의 경우에는 stf1 과 stf2 두 개의 인스턴스가 서로 값을 공유하지 못하여  새로운 인스턴스를 생성할 때마다 0으로 초기화 된다.
  • static 필드의 경우 클래스 변수 자체가 프로그램을 종료할 때까지 유지되고 있기 때문에 새로운 인스턴스를 생성하여도 값을 유지하고 있다 
  • 여러 개의 인스턴스가 같은 공간을 공유할 목적으로 필드에 static 키워드를 사용한다.
  • static 메소드를 호출할 때는 인스턴스를 생성하지 않고 호출하는 방식으로 사용해야한다.

 

 

 

4. class StaticMethodTest의 작성한 메소드 호출

StaticMethodTest smt = new StaticMethodTest();
smt.nonStaticMethod();

StaticMethodTest.staticMethod();
=> static 메소드를 호출할 때는 인스턴스를 생성하지 않고 호출하는 방식으로 사용해야한다.

◇ 실행 결과
nonStaticMethod 호출 됨...
staticMethod 호출 됨...
반응형