본문 바로가기

etc.

[Java] 정적 멤버 static (static 필드, static 메소드)

반응형

정적(static) 멤버 클래스에 고정된 멤버로서 객체(인스턴스)를 생성하지 않고 사용할 수 있다

각각 정적 필드(변수), 정적 메소드가 있다

 

정적 멤버를 선언 할 때에는 앞에 static만 붙이면 된다

 

ex )

double PI = 3.141592;

->

static double PI = 3.141592;

 


 

1.1 정적 필드

필드를 선언할 때, 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다

 

ex )

public class Calculator {
    String color;	//객체마다 다른 색깔
    static double PI = 3.141592;	//객체마다 공용된 PI 값
    ...
}

+ ) 위 코드에서 PI 같이 후에 바뀌지 않는 상수(static final)는 " static final double PI = " 로 선언할 수 있다

 


 

1.2 정적 메소드

메소드를 선언할 때, 인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언하는 것이 좋다

 

ex )

public class Calculator {
    String color;	//인스턴스 필드
    void setColor(String color) {		//인스턴스 메소드
        this.color = color;
    }
    
    static int plus(int x, int y) {		//외부에서 주어진 매개값을 이용한 정적 메소드
        return x + y;
    }
}

 

2. 정적 멤버 사용

정적 필드와 정적 메소드는 클래스 객체 생성 없이 클래스 이름으로 접근할 수 있다

물론, 객체 참조 변수로도 접근이 가능하다

 

ex )

클래스명 : Calculator
정적 필드 : PI
정적 메소드 : plus(int x, int y)

Calculator myCal = new Calculator();

double result1 = 10 * 10 * Calculator.PI;
double result2 = 10 * 10 * myCal.PI;

int resultA = Calculator.plus(1, 2);
int resultB = myCal.plus(1, 2);

 

정적 필드를 선언과 동시에 초기값을 줄 수 있다

그러나 정적 필드의 복잡한 초기화 작업을 위해 정적 블록(static block)을 사용할 수 있다

static {
    ...
}

정적 블록은 클래스가 메모리로 로딩될 때 자동적으로 실행된다

클래스 내부에 여러개가 선언되어도 상관없고, 선언된 순서대로 실행된다

 

더불어, 정적 블록 정적 메소드인스턴스 필드 인스턴스 메소드를 사용할 수 없다

사용하고 싶다면, 정적 블록에서 객체를 생성하고 참조 변수 접근해야 한다

 


 

아래 링크는 이해하는 데에 도움되는 점프 투 자바 사이트이다 !

https://wikidocs.net/228

반응형