[JAVA] 13.static 멤버와 final 키워드

안녕하세요 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