Static 멤버
자바는 클래스 로더를 사용해서 클래스를 메서드 영역에 저장하고 사용한다. Static 멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다. 그렇기 때문에 Static 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능하다.
“Static 멤버란 메서드 영역의 클래스에 고정적으로 위치하는 멤버를 말한다.” 이게 대체 무슨 말일까?
일반적인 변수나 메서드는 객체가 생성될 때마다 새로 만들어지지만, static 멤버는 클래스 자체에 속하고, 프로그램이 실행되는 동안 한 번만 만들어진다. 즉, 객체가 여러 개 생성되더라도 static 멤버는 딱 하나만 존재한다는 뜻이다.
예시)
static 필드가 필요한 경우
>>원의 지름이나 넓이를 구할 때 쓰는 원주율 π는 객체마다 가지고 있을 필요가 없기 때문에 static 필드로 선언하는 것이 좋다.
= 객체마다 가지고 있을 필요성이 없는
공용적인 필드는 static 필드로 선언하는 것이 좋다.
static 메서드가 필요한 경우
>> 계산기를 만들 때, 사칙연산의 경우 외부에서 주어진 매개값들을 가지고 처리하므로 객체마다 들고있을 필요가 없다.
= 인스턴스 필드를 이용하지 않는 메서드는 static 메서드로 선언하는 것이 좋다.
static 멤버 사용
클래스가 메모리로 로딩되면 static 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근하면 된다.
예를 들어 원의 넓이도 구해주는 간단한 계산기를 만들고 싶다면
public class Calculator {
static double pi = 3.14159;
static int plus(int firstNumber, int secondNumber) {...}
static int minus (int firstNumber, int secondNumber) {...}
}
(대충 메인 메소드) ...
//원의 넓이 계산
double result1 = 10 * 10 * Calculator.pi;
//덧셈 뺄셈 계산
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);
이런 식으로 객체화 없이 바로 사용이 가능하다.
Static 블록
static 필드는 선언과 동시에 초기값을 주는 것이 일반적이나 복잡한 초기화 작업이 필요하다면 static 블록을 사용해야 한다. static {..}
참고)
static 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않는다. 생성자는 객체 생성 후 실행되기 때문이다.
static 메서드와 static 블록은 객체가 없어도 실행된다는 특징 때문에 내부에 인스턴스 필드나 인스턴스 메서드를 사용할 수 없다. 또한, 객체 자신의 참조인 this도 사용할 수 없다.
Final 필드
인스턴스 필드와 static 필드는 언제든지 값을 변경할 수 있다. 그러나 경우에 따라서는 값을 변경하는 것을 막고 읽기만 허용해야 할 때가 있다. 이 때 final 필드와 상수를 선언해서 사용한다.
final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없게 된다.
상수
원주율 π나 지구의 무게 및 둘레 등등 변하지 않는 값은 상수로 선언하면 된다.
상수는 객체마다 저장할 필요가 없고, 여러 개의 값을 가져도 안 되기 때문에 static 이면서 final인 특성을 가져야 한다.
-참고 자료-
신용권,임경균 『이것이 자바다』 : 한빛출판네트워크, 2022