Java
정적멤버와 Static

정적(static)은 한글로 '고정된' 이라는 뜻이다.

정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.

정적 필드와 정적 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 추가적을 붙이면 된다.


public class Calculator { 
String color;
static double pi=3.14159; //정적필드
}


필드를 선언할 때 인스턴스 필드로 선언할 것인가, 아니면 정적 필드로 선언할 것인가의 판단 기준은 객체마다 가지고 있어야할 데이터라면 인스턴스 필드로 하고, 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.


위의 Calculator 클래스의 경우 계산기별로 색깔은 다를 수 있기 때문에 인스턴스 필드로 선언했고,

pi 는 객체마다 가지고 있을 필요가 없는 변하지 않는 공용적인 데이터 이므로 정적필드로 선언했다.

메소드의 경우, 인스턴스 메소드로 선언할것인가, 아니면 정적 메소드로 선언할 것인가의 판단 기준은

인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언하고, 인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언한다.


예를 들어 Calculator클래스의 덧셈, 뺄셈 기능은 인스턴스 필드를 이용하기 보다는 외부에서 주어진 매개값들을 가지고 덧셈과 뺄셈을 수행하므로 아래 예와 같이 정적 메소드로 선언하는 것이 좋다.


public Calculator {
String color; //인스턴스필드
void setColor(String color) { this.color=color;} //인스턴스메소드
static int plus(int x,int y) {return x+y;} //정적메소드
static int minus(int x,int y) {return x-y;} //정적메소드
}
public class Calculator {
static double pi=3.14159;
static int plus(int x, int y) {...}
static int minus(int x, int y) {...}
}

정적 필드 pi와 정적메소드 plus(), minus()는 다음과 같이 사용할 수 있다.


doubloe result= 10 * 10 * Calculator.pi;
int result1= Calculator.plus(10,5);
int result2= Calculator.minus(10,5);

혹은

Calculator cal= new Calculator();
double result=10 * 10 * cal.pi;
int result1=cal.plus(10,5);
int result2=cal.minus(10,5);

이런식으로 객체를 생성해서 사용할 수도있다.


정적 메소드와 정적 블록을 선언할 때 주의할 점은 객체가 없어도 실행된다는 특징 때문에, 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 객체 자신의 참조인 this 키워드도 사용이 불가능하다.

예를 들어 아래의 코드표를 보면 되겠다.


public class ClassName{
//인스턴스 필드와 메소드
int field1;
void method1() {...}
//정적 필드와 메소드
static int field2;
static void method() {...}
//정적 블록
static {
field1=10; (x) 컴파일에러
method(); (x) 컴파일에러
field2=10; (o)
method2(); (o)
댓글 0