정적 필드와 정적 메소드를 선언하려면 필드와 메소드 선언 시에 static을 꼭 붙혀주어야 한다.
정적 필드, 메소드는 클래스에 고정된 맴버이므로 클래스의 로딩이 끝나면 바로 사용할 수 있다.
객체마다 가지고 있어야 할 데이터라면 인스턴스 필드를 선언
객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드를 선언하는 것이 좋다.
public class Calculator{
//계산기 별로 색상이 다를 수 있어서 인스턴스 필드 선언
String color;
//계산기에서 사용하는 파이의 값은 동일하므로 정적 필드 선언
static double pi = 3.14159;
//계산기에서 사용하는 덧셈의 값은 동일하므로 정적 메소드 선언
static int plus(int x, int y) { return x+y; }
}
클래스가 메모리로 로딩되면 정적 맴버를 바로 사용할 수가 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근 가능하다.
클래스 . 필드;
클래스 . 메소드 (매개변수);
int result = Calculator.plus(10, 5); //15
Calculator calculator = new Calculator();
int result2 = calculator.plus(10, 5);
원칙적으로는 클래스 이름으로 접근해야하지만, 다음과 같이 참조 객채로 접근도 가능하다.
정적 메소드 선언 시 주의점
객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다. 또한 객체 자신의 참조인 this 키워드도 사용이 불가능하다.
public class Test01{
int field1;
void method1() {}
static int field2;
static void method2() {}
static void method3(){
this.field1=10; //컴파일 에러
method1(); //컴파일 에러
field2 = 10;
method2();
}
}
정적 메소드에서 인스턴스 맴버를 사용하고 싶다면 다음과 같이 객체를 먼저 생성하고 참조 변수로 접근해야한다.
main() 메소드를 실행할 때 참조 객체를 만들고 인스턴스 필드와 메소드를 사용하는 것에 대한 이해가 될 것이다.
'JAVA' 카테고리의 다른 글
Equals와 hasCode (0) | 2021.08.07 |
---|---|
예외 클래스 (0) | 2021.08.06 |
final 필드와 상수 (0) | 2021.08.06 |
싱글톤 (0) | 2021.08.06 |
StringBuilder 란 (0) | 2021.08.02 |