1. 개요
static 메소드는 static 변수를 사용하는 메소드다. 특징으로는
- 인스턴스의 생성과 무관하게 클래스 이름으로 호출할 수 있다.
- 인스턴스 생성 전에 호출할 수 없으므로 static 메소드 내부에서는 인스턴스 변수를 사용할 수 없다. (
인스턴스 생성 전부터 사용할 수 있어야 하는데 인스턴스 변수를 사용하면 없는 변수를 사용하려는 경우가
생기기에 막아놓은 것이다.)
2. 사용 예
public class Employee {
private static int serialNumber = 1000;
private int Id;
private String name;
private String department;
public Employee() {
Id = serialNumber++;
}
public static int getSerialNumber() {
int i = 0;
employeeName = "kim";
return serialNumber;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
일단 이 코드에선 에러가 발생한다.
getSerialNumber 메소드를 보면 int i = 0 이라는 코드가 포함되어 있다.
여기까진 괜찮다. 어차피 메소드가 호출될 때, i라는 지역변수가 생성되고 그걸 사용하는 건 전혀 문제가 되지 않는다.
하지만, employeeName = "kim" 이라는 부분은 문제가 있다.
이 static 메소드가 사용될 때, 생성된 인스턴스가 없다면 employeeName이란 게 존재하지 않기 때문이다.
정리하면 getSerialNumber 메소드를 보면 지역변수, 인스턴스 변수, 스태틱 변수 3가지 변수가 있다.
지역변수와 스태틱 변수는 괜찮지만 인스턴스 변수가 들어가면 에러가 일어난다.
2-2. static 변수의 유효 범위와 메모리
변수의 유효 범위(scope)와 생성과 소물(life cycle)은 각 변수의 종류마다 다르다.
지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다르다.
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | life cycle |
지역 변수 (local variable) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고함수가 종료되면 소멸 |
멤버 변수 (instance variable) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 private가 아니면 참조 변수로 다른 클래스에서 사용가능 | 힙 | 인스턴스가 생성될 때 힙에생성되고, GC가 메모리를 수거할 때 소멸 |
static 변수 (class variable) |
static 예약어를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private가 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작될 때상수와 함께 데이터 영역에생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸 |
그리고 추가로
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리를 할당하는 것은
비효율적임 - 클래스 내부의 여러 메소드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당 되는 경우도 있음
- 상황에 따라 적절하게 변수를 골라서 사용
이정도로 정리할 수 있다.
'자바' 카테고리의 다른 글
객체지향 프로그래밍 정리 4. 배열(Array) (0) | 2022.04.01 |
---|---|
객체지향 프로그래밍 정리 2. static 변수 (0) | 2022.03.31 |
디자인 패턴 7. 전략 패턴 (Strategy Pattern) (0) | 2022.03.12 |
디자인 패턴 6. 파사드 패턴 (Facade Pattern) (0) | 2022.03.12 |
디자인 패턴 5. 옵저버 패턴 (Observer Patern) (0) | 2022.03.12 |
댓글