안녕하세요 IT뽀로로입니다.
오늘은 static 멤버와 non-static 멤버, 그리고 final 키워드에 대하여 알아보도록 할게요
#static 멤버란?
static 멤버는 객체를 생성하지 않고도 사용할 수 있는 멤버를 static 멤버라고 한다.
static 멤버는 클래스당 하나만 생성되는 멤버로서 클래스 멤버라고도 하며 동일한 클래스의 모든 객체들이 공유한다.
그리고 어떤 객체도 생성되기 전 프로그램을 시작할 때 이미 생성된다.
그러므로 객체를 생성하기도 전에 사용이 가능하다.
class Test{
static int n; //static 멤버
static void g() {...} //static 메소드
}
# non-static 멤버란?
non-static 멤버는 각 객체마다 하나씩 생기는 멤버로 인스턴스 멤버라고 한다.
우리가 클래스를 이용해 객체를 A,B,C 생성했을 때 각자가 따로따로 가지는 멤버이다.
이 멤버는 객체가 생성되어야 사용이 가능하다.
class Test{
int n; //non-static 멤버
void g(){....} //non-static 메소드
}
non-static과 static의 정리는 밑의 표를 참고하세요!
한마디로 non-static은 지역변수라 생각할 수 있고 static 변수는 전역 변수라 생각할 수 있겠죠?
#선언 방법
non-static 멤버는 객체가 생성되어야 생성되므로 보통 [객체명.멤버] 이런 형태로 사용합니다.
s1 = new StaticSample();
s1.n = 50;
하지만 static 멤버는 클래스 로딩 시 멤버 생성이 되므로 [클래스명.멤버] 형태로 사용이 가능합니다.
StaticSample.n = 50;
#static의 활용
자바에서는 C와 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스의 멤버로 존재하여야 합니다.
이는 캡슐화의 원칙 때문입니다. 그러나 응용프로그램 작성 시 모든 클래스에서 공유되는 전역 변수(global variable)이나
모든 클래스에서 언제든지 호출할 수 있는 전역 함수(global function)을 만들어 사용할 필요가 생깁니다.
이럴 때 static을 사용합니다.
예를 들어 계산기의 기능을 만들어야 할 때 먼저 Math라는 클래스를 만들고
클래스 안에 "더하기", "빼기", "나누기" 등 연산 기능을 static으로 만들면 됩니다
public class Math{
public static int add(int a, int b) { return a+b;}
public static int minus(int a, int b) { return a-b;}
}
#static 메소드의 제약조건
1.static 메소드는 오직 static 멤버만 접근할 수 있다.
static 메소드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메서드 인스턴스 변수 등을 사용할 수 없다. 다만 static 멤버만 사용이 가능하다. 그러나 인스턴스 메서드들은 static 멤버를 모두 사용할 수 있다.
class Test{
int n; //non-static 멤버
void f1(int x) {n = x;} //정상
void f1(int x) {m = x;} //정상 : non-static 메서드는 static멤버 사용 가능
static int m; //static 멤버
static void s1(int x){n = x}; //ERROR : 인스턴스 멤버 n 사용 불가능
static void s2(int x){m = x}; //정상 : static 메소드는 static 멤버 m 사용 가능
}
2.static 메소드에서는 this 키워드 사용 불가
그 이유는 클래스 로딩 전부터 만들어져 있기 때문에 실행 중인 객체를 가리키는 this 레퍼런스 사용 불가능하다.
references. 명품 Java Programming
'IT Study > JAVA' 카테고리의 다른 글
[JAVA] 15.업캐스팅, 다운캐스팅, instanceof (0) | 2019.09.08 |
---|---|
[JAVA] 14.final 키워드 (0) | 2019.09.04 |
[JAVA] 12.접근 지정자 (0) | 2019.09.04 |
[JAVA] 11.생성자 (0) | 2019.09.02 |
[JAVA] 10.this (0) | 2019.09.02 |