static 멤버

Develope/Java 2020. 5. 11. 00:36
반응형

※ non-static 멤버와 static 멤버

멤버 변수를 분류하라고 한다면 non-static 멤버와 static 멤버로 분류할 수가 있다.

여기서 static 멤버란 객체를 생성하지 않고도 사용할 수 있는 멤버를 말한다.


그렇다면 이와 반대인 non-stiatic 멤버는?

예상한대로, 객체를 생성해야지만 사용할 수 있는 멤버이다. 


※ 특징

1) static 멤버

 - 클래스당 하나만 생성

 - 객체 내부가 아닌 별도의 공간에 생성되어 동일한 클래스의 모든 객체들이 공유 (=일종의 전역변수같은 개념)

 - 프로그램이 실행되자마자 생성되기 때문에 객체가 생성되기 전에도 static 멤버는 사용이 가능하며, 프로그램 종료까지 접근 가능

 - 클래스당 하나씩 생긴다고 하여 클래스 멤버라고도 부름.


2) non-static 멤버

 - 객체당 하나씩 생성

 - 객체마다 자신의 고유한 멤버 공간을 가지며 공유하지 않음

 - 객체가 사라지면 non-static 멤버도 함께 사라지며 더 이상 접근이 불가능함

 - 각 객체마다 하나씩 생긴다고 하여 인스턴스 멤버라고도 부름.



※ static 멤버 사용

1번째 방법 : 객체명 이용

 - static 멤버 또한 멤버이기 때문에 일반적인 멤버 변수 사용법처럼 객체명을 이용하여 접근이 가능하다.

객체.static필드

객체.static메소드


2번째 방법 : 클래스명 이용

 - static 멤버의 경우 클래스당 하나만 존재하기 때문에 클래스명을 이용해서도 접근이 가능하다.

클래스명.static멤버


예를 들자면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 멤버를 사용한다.

int n = Math.abs(-5);


2) 공유 멤버를 만들고자 할 때 활용

 - static으로 선언된 필드나 메서드는 모두 이 클래스의 각 객체들의 공통 멤버가 되며 공유가 된다.


※ static 메소드의 제약 조건

1) static 메소드는 오직 static 멤버만 접근할 수 있다.

 - static 메소드는 객체가 생성되기 이전에도 접근이 가능하므로 인스턴스 메소드, 인스턴스 필드를 사용할 수 없다.

 - 인스턴스 메소드는 static 멤버를 모두 사용할 수 있다.


2) static 메소드에서는 this 키워드를 사용할 수 없다.

 - this 레퍼런스란 호출 당시 실행 중인 객체를 가리키는 것인데, static 메소드는 객체가 생성되지 않은 상황에서도 클래스 이름을 이용하여 접근이 가능하므로 this 레퍼런스를 사용할 수 없다. static 메소드를 호출하였을 때 생성된 객체가 하나도 존재하지 않을 가능성이 있기 때문이다.

1
2
3
4
5
6
7
8
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


반응형

'Develope > Java' 카테고리의 다른 글

끝말잇기 게임  (0) 2020.05.14
final  (0) 2020.05.11
접근 지정자  (0) 2020.05.10
가비지와 가비지 컬렉션  (0) 2020.05.10
생성자(constructor)  (0) 2020.05.09
블로그 이미지

rootable

,