Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
  • 2011/3/4일 작성

static

static 키워드는 정적 변수 (static variable)를 선언하기 위해서 사용하는 키워드다. 정적변수는 정적으로 할당되는 변수라고 보통 설명하는데, 이거 동어반복 같다. 프로그램이 실행될때 만들어지는 변수 즉 프로그램 전체에 고정되어 있는 변수라고 설명하는게 나을 것 같다. 프로그램 전체에 고정되어 있기 때문에 정적 변수는 프로그램의 생성과 함께 할당되고 프로그램의 종료시에 해제 된다.

Java

Java는 객체지향(:12) 프로그래밍 언어로 모든 것을 객체로 본다. 만약 어떤 객체를 사용하고 싶다면 객체의 인스턴스를 만들어서 사용해야 한다. 이때 인스턴스는 다른 인스턴스와 완전히 독립적이므로 다른 인스턴스와 데이터를 공유할 수 없다.

그러나 때때로 객체의 멤버변수를 모든 인스턴스에서 공유해서 사용해야 하는 경우가 있다. 이때 static키워드를 붙여준다. static이 붙은 멤버 변수는 인스턴스를 생성하지 않아도 사용할 수 있다. 클래스 인스턴스가 만들어지기 전에 자동적으로 만들어지기 때문이다. 이미 메모리에 올라간 데이터이기 때문에 인스턴스에 상관없이 공용으로 접근할 수 있다.

아래의 예를 보자
import java.util.*;

class foo
{
    static int i;
    void increment()
    {
        i++;
    }
    void Print()
    {
        System.out.println(i);
    }
}
public class myStatic
{
    public static void main(String[] args)
    {
        foo a = new foo();
        foo b = new foo();
        a.Print();
        b.Print();
        a.increment();
        a.increment();
        a.Print();
        b.Print();
    }
}
결과를 보면 static 멤버인 i를 인스턴스에 관계없이 함께 사용하는 것을 알 수 있다.
# java myStatic 
0
0
2
2

static를 써서 얻을 수 있는 이점은 다음과 같다.
  1. 객체를 생성하지 않고도 변수를 사용할 수 있다. 예컨데, foo.i와 같은 활용이 가능하다. 이는 메서드에도 동일하게 적용된다.
  2. 객체를 생성하지 않고도 변수와 메서드를 사용할 수 있으므로 빠르게 작동한다. 또한 편하다.
static 키워드를 쓸 경우 아래의 사항을 주의해야 한다.
  1. static 메서드는 일반 멤버변수를 사용할 수 없다. 조금만 생각해 보면 당연히 그래야 함을 알 수 있다. static 키워드가 붙으면 인스턴스가 만들어지기 전에 호출가능하다. 그러나 static이 붙지 않은 멤버변수는 인스턴스가 만들어지기 전엔 존재하지 않는다. 존재하지 않는 변수를 사용할 수 없으니 당연히 일반 멤버변수를 사용할 수 없다. 만약 static 메서드에서 일반 멤버변수를 호출하면 컴파일 실패한다.
static를 쓸 경우 얻을 수 있는 장점이 분명히 존재하므로 아래와 같은 경우에는 static를 고려해 보자.
  1. 클래스간 함께 공유해서 사용해야 하는 멤버변수들
  2. 인스턴스 변수를 사용하지 않는 메서드들

C/C++

C 프로그래밍 언어는 static, auto, register, extern 4개의 storage class - 여기에서 객체의 클래스가 아닌 집합의 의미를 가진다 - 를 가진다.
  1. static global variable
    • 소스파일의 최상의 레벨에서 함수외부에 선언되는 static 변수.
    • 프로그램이 시작할 때 할당되고 종료할 때까지 유지된다.
    • static으로 선언된 변수는 선언된 소스코드 파일에 고정되므로, 다른 파일에서 동일한 이름의 static 변수가 선언될 수 있다. 물론 이들 변수는 파일별로 독립적으로 사용된다.
  2. static local variable
    • 함수안에서 선언되는 static 변수로 automatic local variables (자동지역변수)와 같은 scope를 가진다.
    • 함수가 호출될때 할당되고 함수가 반환할때 소멸된다.
  3. static 변수값 초기화. static으로 선언된 변수들은 고유의 값으로 초기화된다.
|| 데이터형 || 초기화 값 || 비고 ||
int 0
char \0
pointer NULL
float 0.0
double 0.0
bool 0 C의 경우 C99에서 지원
  1. static member variable
    • C++에서는 멤버변수를 static 멤버변수로 지정할 수 있다. static 으로 선언된 멤버변수는 모든 클래스 인스턴스가 서로 공유한다.
  2. static method
    • C++은 메서드를 static로 선언하는게 가능하다. static로 선언한 메서드는 클래스의 인스턴스가 없어도 사용할 수 있다.
  3. C에서 static 멤버의 사용 예
    #include <stdio.h>
    #include <stdbool.h>
    
    void showstat(int i)
    {
        static int nStatic;
    
        nStatic += i;
        printf("nStatic is %d\n", nStatic);
    }
    
    int main()
    {
        for(int i = 0; i < 10; i++)
        {
            showstat(i);
        }
    }

    C++에서 static 멤버의 사용 예
    #include <iostream>
    
    using namespace std;
    
    class myCount
    {
    public:
        static int count;
        void increment()
        {
            count++;
        }
        static void print()
        {
            cout << count << endl;
        }
    };
    
    int myCount::count = 0;
    
    int main()
    {
        myCount a, b;
    
        a.increment();
        b.increment();
        a.print();
        b.print();
    
        myCount.print(); // 인스턴스 없이 호출
    }
    c++에서 static 메서드를 사용할 때는 다음의 사항을 주의해야 한다. Java와 비슷하다
    1. static는 일반 멤버변수를 사용할 수 없다.
    static는 클래스 인스턴스 없이 호출할 수 있다. 반면 일반 멤버변수는 인스턴스가 만들어져야 할당된다. 없는 멤버변수를 사용할 수 없지 않겠는가 ?
    1. 일반 메서드는 static 멤버변수를 사용할 수 있다. static 멤버변수는 이미 존재하고 있기 때문에, 사용하는데 문제가 없다.
    static를 이용할 경우의 장점역시 Java와 비슷하다.

    c 에서 static 함수

    C에서 함수가 static로 선언되면, 해당 파일의 내부에서만 호출이 가능하고 다른 파일에서는 호출할 수가 없다. 예컨데, private 처럼 작동한다.

    이런 static의 특징은 여러 명이 협업하는 큰 규모의 프로젝트에서 원할한 협업이 가능하도록 해준다. 만약 어떤 함수를 static으로 선언하지 않았다면 이 함수가 변경됐을 때, 이 함수를 사용하는 모든 파일을 추적해서 변경해야 한다.

    때문에, 공용으로 사용할 함수가 아니라면 static 함수로 사용해서 private 영역에서만 사용하도록 하는게 나중을 위해서 좋다.