[Java] 자바의 static, 클래스 멤버, 정적 초기화 블록(static block)
정적(static)은 고정된이란 의미를 가지고 있다. 정적 멤버는 클래스에 고정된 멤버로, 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
정적 멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.
정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트 코드)를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리 된다. 따라서 클래스 로딩이 끝나면 바로 사용할 수 있다.
정적 멤버의 선언과 사용
정적 필드와 메소드를 선언하는 방법은 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
public class ClassName{
//정적 필드
static int name;
//정적 메소드
static int getName(){}
}
객체마다 가지고 있을 필요성이 없는 공용 데이터라면 정적 필드로 선언하는 것이 좋다. 메소드의 경우 인스턴스 필드를 이용하지 않는다면 정적 메소드로 선언한다.
// 스피커 클래스
public Calculator{
String color; //인스턴스 필드 - 객체마다 색이 다름
static double pi = 3.14156; //정적 필드 - 객체마다 값이 같으므로 공용 데이터
void setColor(String color) {this.color = color;} //인스턴스 메소드 - 인스턴스 필드 사용o
static int plus(int x, int y) {return x + y;} //정적 메소드 - 인스턴스 필드 사용x
}
정적 멤버를 사용하기 위해서는 클래스 이름과 함께 도트(.) 연산자로 접근한다.
String color = Calculator.color; //정적 필드
int value = Calculator.plus(10, 10); //정적 메소드
정적 초기화 블록
일반적으로 정적 필드는 필드 선언과 동시에 초기값을 준다.
static double pi = 3.14159;
그러나 선언과 동시에 초기화하기 어려운 상황이 있을 수 있다(좀 더 복잡한 연산이 필요하다던지...). 하지만 정적 필드는 객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없다.
때문에 자바는 정적 필드의 초기화 작업을 위해 정적 블록(static block)을 제공한다. 다음은 커피 클래스에서 정적 블록을 사용해 info 정적 필드를 초기화하는 예제다.
public class Coffe{
static String kind = “과테말라 안티구아”;
static int price = “10000”;
static String info;
static{
info = kind + “,” + price;
}
}
정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행된다. 정적 블록은 클래스 내부에 여러개 선언할 수 있고, 선언된 순서대로 실행된다.
정적 메소드와 정적 블록을 선언할 때 객체가 없어도 실행되기 때문에 주의할 점이 몇 가지 있다. 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 자신의 참조인 this 키워드도 사용이 불가하다.
public class Coffe{
//인스턴스 필드와 메소드
int price;
int getPrice(){return price;}
//정적 필드와 메소드
static String kind;
static String getKind(){return kind;}
//정적 블록
static {
price = 10000; //컴파일 에러
int value = getPrice(); //컴파일 에러
kind = “과테말라 안티구아”; //가능
String result = getKind(); //가능
}
}
정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
static {
Coffe coffe = new Coffe();
coffe.price = 10000;
int value = coffe.getPrice();
}
'자바' 카테고리의 다른 글
[Java] 자바의 인터페이스(interface)란? (0) | 2021.01.07 |
---|---|
[Java] Object 클래스 (0) | 2020.12.26 |
[Java] 자바의 클래스 - WHITESHIP LIVE 자바 스터디 (0) | 2020.12.18 |
[Java] 자바의 제어문2, 조건문 (2) | 2020.12.12 |
[Java] 자바의 제어문1, 반복문 (0) | 2020.12.12 |
댓글