Static 메서드
- 메서드가 수행되려면 메서드 내부에 있는 변수들은 메모리가 할당된 상태여야 한다.
- 인스턴스 변수는 인스턴스 생성이 완료되어야 메모리에 할당된다.
- static 메서드는 인스턴스가 생성되기 전, 프로그램이 로드되는 시점부터 사용될 수 있다.
- 따라서 static 메서드에서는 생성이 완료되지 않은 인스턴스 변수(멤버 변수)를 사용할 수 없다.
- 하지만 static 변수는 이미 존재하므로 일반 메서드 안에서의 사용이 가능하다.
Employee.java의 static 메서드 getSerialNum()
- 메서드 내에서 생성된 지역변수는 사용하는데 문제가 없다.
public static int getSerialNum() {
int i = 0; // 메서드 내부에 선언된 지역변수. 메서드 호출시 생성 & 완료시 소멸
employeeName = "Lee"; // 메서드 호출 시점에 employeeName 변수가 존재하지 않을 수 있음.
}
static 메서드의 참조
- 역시 클래스 이름으로 참조할 수 있다.
System.out.println(Employee.getSerialNum());
상황에 따른 적절한 변수 사용이 중요하다
- 변수의 유효 범위(scope)와 생성과 소멸 시점(life cycle)은 변수의 종류(지역 변수, 멤버 변수, static 변수)에 따라 다르다.
- 멤버 변수가 많은 클래스는 인스턴스 생성 시 많은 메모리를 차지할 수 있으므로 좋은 클래스는 아니다.
- 하지만 멤버 변수가 없으면 필요할 때마다 함수 간 매개 변수를 통해 전달해야 하고 외부에서도 사용하는 것이 어려울 수 있다.
- 따라서 클래스의 속성에 맞는 적절한 개수의 멤버 변수를 설정하는 것이 중요하다.
- 클래스 내부에서 여러번 사용되는 변수를 멤버 변수로 설정해야 한다.
- static 변수는 메모리에 로드되는 시점부터 언로드 될 때까지 메모리를 차지하므로 크기가 큰 배열같은 element는 static 변수로 설정하는 것은 좋지 않다.
- 모든 static 변수를 private으로 설정하지는 않고 인스턴스간 공유할 필요가 있는 변수는 public으로 설정한다.
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
함수 내부 | 함수 내부에서만 사용 | 스택 | 함수가 호출되는 시점에 생성되고 함수가 끝나면 소멸한다. |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용, private이 아니면 참조 변수로 다른 클래스에서 사용 가능 | 힙 | 인스턴스가 생성될 때 생성되고, Garbage Collector가 메모리 수거할 때 소멸된다. |
static 변수 (클래스 변수) |
static 키워드를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용, private 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸된다. |
컴파일 언어들은 비슷하기 때문에 C, C++, C##과 같은 다른 언어를 이해하는데도 도움이 되므로 잘 알아놓으면 좋다!
'Java & Kotlin' 카테고리의 다른 글
[Java 객체지향] Singleton Pattern (static 응용) (0) | 2022.01.27 |
---|---|
[Java 객체지향] Static 변수 (0) | 2022.01.27 |
[Java 객체지향] 객체 간 상호작용 구현해보기 (0) | 2022.01.26 |