static 멤버
1. static 멤버의 선언
다음과 같이 멤버 선언 시 앞에 static이라고 붙이기만 하면 된다.
i.e.
class StaticSample {
int n; //non static field
void g() { //non static method
..
}
static int m; //static field
static void f() { //static method
...
}
}
2. non-static 멤버와 static 멤버의 차이
이제 non static 멤버와 static 멤버의 특징과 차이점을 살펴보자. 객체를 생성하지 않고도 사용할 수 있는 멤버를 static 멤버라고 부른다.
같은 클래스를 이용하여 객체들이 생성되어질 때에 각각의 객체들은 자신만의 필드들을 갖는다. 이들 필드는 인스턴스마다 별도로 생성되기 때문에 인스턴스 변수라고도 한다. 각 객체는 이들 변수에 대하여 별도의 기억 공간을 가지고 있으며, 각기 다른 값을 가지고 있다. 그러나 모든 객체에 공통인 변수가 필요한 경우도 있다. 이러한 변수가 바로 static 변수이다. 이 static 변수는 정적 변수 혹은 클래스 변수라고도 불리운다.
즉, 어떤 객체에서 static 멤버의 값을 변경하면 같은 클래스로 만든 모든 객체의 그 static 멤버의 값이 동시에 같은 값으로 변경된다. 왜냐하면, 모든 객체의 static 멤버는 같은 기억 공간을 공유하기 때문이다.
static 멤버는 클래스당 하나만 생성되는 멤버로서 동일한 클래스의 모든 객체들이 공유한다. 그리고 어떤 객체도 생성되기 전, 즉 프로그램을 시작할 때에 이미 생성된다. 그러므로 객체를 생성하기 전에도 static 멤버는 사용할 수 있다. 반면 non static 멤버는 객체가 생길 때 객체 내부에 하나씩 생성되며, 객체마다 자신의 고유한 멤버 공간을 가지며 객체들이 공유하지 않는다. 객체가 사라지면 non static 멤버도 함께 사라지고 더 이상 접근할 수 없다. static 멤버는 클래스당 하나씩 생긴다고 해서 클래스 멤버라고도 부르며, non static 멤버는 각 객체마다 하나씩 생긴다고 해서 인스턴스 멤버라고도 부른다.
3. static 멤버의 사용법
1) 객체명.static_멤버명
2) 클래스명.static_멤버명
물론 객체를 이용해서 static 멤버에 접근하고 사용할 수는 있지만, 이것은 바른 사용법이 아니다. 왠만하면 "클래스명.static_멤버명" 의 방식을 사용하는 것이 좋다.
4. static의 활용
- 전역 변수와 전역 함수를 만들 때 활용
자바에서는 C나 C++와 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스의 멤버로 존재하여야 한다. 이는 캡슐화의 원칙 때문이다. 그러나 응용 프로그램 작성 시 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 언제든지 호출할 수 있는 전역 함수를 만들어 사용할 필요가 생긴다. static은 이런 문제에 대한 해결책이다. 대표적인 예로 java.lang.Math 클래스의 메소드들을 들 수 있다. 이 클래스는 다음과 같이 객체를 생성하지 않고 바로 호출할 수 있는 수학 계산용 상수와 메소드를 제공한다.
i.e.
public class Math {
public static int abs(int a);
public static double cos(double a);
public static int max(int a, int b);
public static double random();
...
}
Math 클래스의 메소드를 사용하기 위해서 Math 타입의 객체를 만들지는 않고 다음과 같이 사용한다.
i.e.
int n = Math.abs(-5);
- 공유 멤버를 만들고자 할 때 활용
static으로 선언된 필드나 메소드는 모두 이 클래스의 각 객체들의 공통 멤버가 되며 객체들 사이에서 공유된다.
5. static 메소드의 제약 조건
static 메소드는 일반 메소드와는 달리 다음과 같은 특징을 가진다.
- static 메소드는 오직 static 멤버만 접근할 수 있다.
static 메소드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메소드, 인스턴스 변수 등을 사용할 수 없다. 다만 static 멤버들만 사용 가능하다. 그러나 인스턴스 메소드는 static 멤버들을 모두 사용할 수 있다.
- static 메소드에서는 this 키워드를 사용할 수 없다.
static 메소드는 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 호출이 가능하기 때문에 호출 당시 실행 중인 객체를 가리키는 this 레퍼런스를 사용할 수 없다.
'Java > Java 기본' 카테고리의 다른 글
Annotation (0) | 2018.06.29 |
---|---|
final (0) | 2018.06.29 |
접근 지정자 (0) | 2018.06.28 |
가비지와 가비지 컬렉션 (0) | 2018.06.26 |
객체의 소멸 (0) | 2018.06.25 |