※ non-static 멤버와 static 멤버
멤버 변수를 분류하라고 한다면 non-static 멤버와 static 멤버로 분류할 수가 있다.
여기서 static 멤버란 객체를 생성하지 않고도 사용할 수 있는 멤버를 말한다.
그렇다면 이와 반대인 non-stiatic 멤버는?
예상한대로, 객체를 생성해야지만 사용할 수 있는 멤버이다.
※ 특징
1) static 멤버
- 클래스당 하나만 생성
- 객체 내부가 아닌 별도의 공간에 생성되어 동일한 클래스의 모든 객체들이 공유 (=일종의 전역변수같은 개념)
- 프로그램이 실행되자마자 생성되기 때문에 객체가 생성되기 전에도 static 멤버는 사용이 가능하며, 프로그램 종료까지 접근 가능
- 클래스당 하나씩 생긴다고 하여 클래스 멤버라고도 부름.
2) non-static 멤버
- 객체당 하나씩 생성
- 객체마다 자신의 고유한 멤버 공간을 가지며 공유하지 않음
- 객체가 사라지면 non-static 멤버도 함께 사라지며 더 이상 접근이 불가능함
- 각 객체마다 하나씩 생긴다고 하여 인스턴스 멤버라고도 부름.
※ static 멤버 사용
1번째 방법 : 객체명 이용
- static 멤버 또한 멤버이기 때문에 일반적인 멤버 변수 사용법처럼 객체명을 이용하여 접근이 가능하다.
2번째 방법 : 클래스명 이용
- static 멤버의 경우 클래스당 하나만 존재하기 때문에 클래스명을 이용해서도 접근이 가능하다.
예를 들자면 다음과 같다.
| class staticSample{ public static int id; } public class rootable { public static void main(String[] args){ staticSample.id=31337; System.out.println(staticSample.id); // id's value=31337 staticSample smp1=new staticSample(); smp1.id=1004; System.out.println(staticSample.id); // id's value=1004 } } | cs |
클래스 staticSample에 static 멤버 id를 선언해줄 경우 클래스명 staticSample을 이용해서 해당 static 멤버에 접근이 가능하며, 객체를 생성하여 해당 객체명인 smp1을 이용해서도 접근이 가능하다.
※ static 활용
1) 전역 변수나 전역 함수를 만들 때 사용
- JAVA의 경우 캡슐화의 원칙 때문에 어떠한 변수나 함수도 클래스 밖에 존재할 수 없으며 클래스의 멤버로 존재해야 한다. 하지만 프로그래밍을 하다보면 가끔 전역 변수나 전역 함수가 필요할 때가 있는데 이를 해결하기 위한 것이 바로 static이다.
- 대표적으로 java.lang.Math 클래스의 경우 다음과 같이 객체 생성 없이 바로 static 멤버를 사용한다.
2) 공유 멤버를 만들고자 할 때 활용
- static으로 선언된 필드나 메서드는 모두 이 클래스의 각 객체들의 공통 멤버가 되며 공유가 된다.
※ static 메소드의 제약 조건
1) static 메소드는 오직 static 멤버만 접근할 수 있다.
- static 메소드는 객체가 생성되기 이전에도 접근이 가능하므로 인스턴스 메소드, 인스턴스 필드를 사용할 수 없다.
- 인스턴스 메소드는 static 멤버를 모두 사용할 수 있다.
2) static 메소드에서는 this 키워드를 사용할 수 없다.
- this 레퍼런스란 호출 당시 실행 중인 객체를 가리키는 것인데, static 메소드는 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 접근이 가능하므로 this 레퍼런스를 사용할 수 없다. static 메소드를 호출하였을 때 생성된 객체가 하나도 존재하지 않을 가능성이 있기 때문이다.
| class StaticSample{ int n; static int m; void f1(int x){ this.n=x; } void f2(int x) { this.m=x; } static void s1(int x) { n=x }; // static 메소드는 instance 필드 사용 불가 static void s2(int x) { this.n=x; } // static 메소드에서 this 사용 불가 } | cs |