Static 키워드

J/Java 2014. 3. 18. 12:42

1. 클래스를 설계 할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것에 static을 붙인다.

- 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적이기 때문에 서로 다른 값을 유지한다.

경우에 따라서는 각 인스턴스들이 공통적으로 같은 유지되어야 하느 경우 static을 붙인다.

2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다.

- static이 붙은 멤버젼수(클래스 변수)는 클래스가 메모리에 올라갈 때 이외 자동적으로 생성되기 때문이다.

3. static이 붙은 메서드(함수)에서는 인스턴스 변수를 사용할 수 없다.

- static이 메서드는 인스턴스 생성 없이 호출 가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에...

static이 붙은 메서드(클래스 메서드)를 호출할 때 인스턴스가 생성되어 있을 수도 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스 변수의 사용을 허용하지 않는다.

(반대로, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다.

인스턴스 변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.)

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

- 메서드의 작업 내용 중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다.

반대로 인스턴스 변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다.

메서드 호출 시간이 짧아지기 때문에 효율이 높아진다.

(static을 안 붙인 메서드는 실행시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)

5. 클래스 설계 시 static의 사용 지침

- 먼저 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는 지 살펴보고 있으면, static을 붙여준다.

- 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려한다.

 

추가 사항 정적 내부 클래스 예제

...// staticㅡㅇ로 선언된 변수만 정적 내부 클래스 안에서 쓸 수 있다.

static class StaticNestedClass{ // 정적 내부 클래스 ... }

class Inner{ // 비정적 내부 클래스 }

정적 내부 클래스 쓰기 위한 객체 생성

outer.StaticNestedClass n = new Outer.StaticNestedClass(); // outer 밖에서 생성

StaticNestedClass n = new StaticNestedClass(); // outer 안에서 생성

 

// 예제

class Outer{

staic int a = 1;

int b = 2;

static void f(){

System.out.println("I'm f()");

}

void a(){

System.out.println("I'm g()");

}

static class StaticNestedClass{

int c = 11;

static int d = 22;

 

void h(){

System.out.println("나는 정적 내부 클래스다.");

System.out.println(a);

// System.out.println(b); static변수가 아니므로 에러

Outer o = new Outer();

System.out.println(o.b); // 객체 생성해서 쓰면 된다.

System.out.println(c);

System.out.println(d); // 멤버 변수가 static이라도 상관없다.

System.out.println(this.d); // static의 영향이 미치지 않음.

// System.out.println(Outer.this.a); // Outer 멤버 참조 시 this 사용불가

// System.out.println(Outer.this.b);

f();

// g(); static 메소드가 아니므로 에러

static void i(){

System.out.println("I'm i()");

// System.out.println(this.a); // static 메소드에서 this 사용 불가

}

}

}

}

class Test {

public static void main(String[] args){

Outer.StaticNestedClass n = new Outer.StaticNestedClass(); // Outer 객체 없이 생성 가능

n.h();

}

설정

트랙백

댓글