static에 대한 고찰

2017. 5. 11. 17:34programing/java

반응형

자바에서는 객체를 사용해야 할때 반드시 new 키워드로 인스턴스화 시켜줘야 쓸 수 있다. 

이 부분에 대한 이해가 부족해서 C/C++에서 JAVA로 넘어오기가 굉장히 힘들었다. 

static 키워드에 대해 정리하면서 그간의 이해되지 않았던 부분에 대해 마무리하고자 한다.

 

출처: http://rockdrumy.tistory.com

 

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

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

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

 

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

- static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 static영역에 공간이 할당된다.

 

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

- static 메소드는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에 static이 붙은 메서드를 호출할 때 인스턴스가 생성되어 있을 수도 있고, 그렇지 않을 수도 있어서 static이 붙은 메소드에서 인스턴스 변수의 사용을 허용하지 않는다. 반대로, 인스턴스변수나 인스턴스 메소드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.

 

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

- 메소드의 작업내용중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 메소드 호출시간이 짧아지기 때문에 효율이 높아진다.

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

 

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

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

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

 
일반적으로 인스턴스변수와 관련된 작업을 하는 메소드는 인스턴스 메소드이고 static변수(class 변수인..)와 관련된 작업을 하는 메소드는 클래스 메소드(static이 붙은 메소드)라고 보면 된다.


==================================================================================================================================================

static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 됩니다인스턴스 생성 없이 바로 사용이 가능한 것이죠이런 특성 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다자바 프로그램에서는 공통 로직이 들어가는 유틸 기능을 static 으로 작성하곤 합니다이런 static 은 남발해서는 안되며 공통으로 값을 유지하고 싶을 때만 사용합니다.

 

¤ static 변수와 인스턴스 변수의 차이

 

 static 의 사용법을 알기 위해 static 변수(클래스 변수와 인스턴스 변수의 차이점을 알아 보도록 하겠습니다아래 소스는 클래스 내부에 static 변수로 값을 관리할 때 어떻게 되는지 쉽게 알 수 있는 예제입니다.

 

Card 라는 클래스에는 넓이와 높이값을 저장하는 static int 변수가 있습니다. Card 클래스의 인스턴스를 c1, c2 두 개를 생성해서 c1 에 넓이와 높이 값을 변경합니다. static 변수가 아니라면 메모리에 별도의 영역이 생겼기 때문에 두 인스턴스간에 영향을 주지 않을 겁니다그런데 결과는 c1 과 c2 의 넓이높이 값이 동일하게 변경됩니다그것은 c1 과 c2 가 공통된 변수를 참고하고 있기 때문입니다.

 

자바(Java) static 문법에 대해서 알아 봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class StaticSample {
 
    public static void main(String args[]) {
         
        System.out.println("==> 카드 값 변경전");
        System.out.println("Card.width = " + Card.width);
        System.out.println("Card.height = " + Card.height);
 
        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;
 
        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;
         
        System.out.println("==> 인스턴스 C1, C2");
        System.out.println("c1 Width/Height : " + c1.width + "/" + c1.height + ")");
        System.out.println("c2 Width/Height : " + c2.width + "/" + c2.height + ")");
         
        System.out.println("==> 인스턴스 C1 만 변경했 을 때");
         
        c1.width = 50;
        c1.height = 80;
        System.out.println("c1 Width/Height : " + c1.width + "/" + c1.height + ")");
        System.out.println("c2 Width/Height : " + c2.width + "/" + c2.height + ")");
    }
}
 
class Card {
    String kind; // 카드 종류
    int number; // 카드 숫자
    static int width = 100; // 카드 넓이
    static int height = 250; // 카드 높이
}
1
2
3
4
5
6
7
8
9
10
// 결과
==> 카드 값 변경전
Card.width = 100
Card.height = 250
==> 인스턴스 C1, C2
c1 Width/Height : 100/250)
c2 Width/Height : 100/250)
==> 인스턴스 C1 만 변경했 을 때
c1 Width/Height : 50/80)
c2 Width/Height : 50/80)

 

¤ static 함수와 인스턴스 함수의 차이

 

 static 함수와 인스턴스 함수의 차이는 함수 앞에 static 키워드가 붙고 변수와 마찬가지로 메모리에 이미 생성이 되어 있습니다그래서 호출할 때 차이가 납니다인스턴스 함수는 인스턴스를 new 연산자로 생성해서 함수를 호출해야 되지만 static 함수는 클래스 이름만으로 호출이 가능합니다아래 그림처럼 가 붙은 함수들이 static 함수 입니다 

자바(Java) static 문법에 대해서 알아 봅니다.

 

 만약 클래스 내부에 static 함수가 static 변수가 아닌 것들을 사용하게 된다면 에러가 납니다아래 그림처럼 static 변수만 static 함수에서 사용이 가능합니다그것은 인스턴스가 생성되기 전에 아직 생성되지 않은 변수를 참조하기 때문입니다.

자바(Java) static 문법에 대해서 알아 봅니다.

 

 그래서 아래 소스는 내부에 있는 변수는 사용하지 못하고 인수로 넘겨 받은 데이터로 계산을 해서 넘겨주는 것입니다이런 이유 때문에 조금이라도 성능을 올리기 위해 자주 사용하는 유틸 소스에 많이 이용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class StaticSample02 {
 
    public static void main(String args[]) {
         
        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;
 
        System.out.println("==> 인스턴스 함수 호출");
        System.out.println("totalWidth() : " + c1.totalWidth());
         
        System.out.println("==> static 함수 호출 ");
        System.out.println("totalWidth() : " + Card.totalWidth(10, 20));
    }
}
 
class Card {
    String kind; // 카드 종류
    int number; // 카드 숫자
    int width = 10; // 카드 넓이
    int height =  25; // 카드 높이
     
    public int getNumber() {
        return number;
    }
    public int totalWidth() {
        return width * height;
    }
    public static int totalWidth(int width, int height) {
        return width * height;
    }
}
1
2
3
4
5
//결과
==> 인스턴스 함수 호출
totalWidth() : 250
==> static 함수 호출
totalWidth() : 200


반응형

'programing > java' 카테고리의 다른 글

싱글톤 패턴 정리  (0) 2018.03.19
maven에 대해..  (0) 2018.03.19
Node.js vs Java 구조적 차이  (0) 2017.11.30
초보 개발자에게 권장하는 객체지향 모델링 공부 방법  (0) 2017.05.11
자바 설치  (0) 2017.05.11