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를 써서 얻을 수 있는 이점은 다음과 같다.
객체를 생성하지 않고도 변수를 사용할 수 있다. 예컨데, foo.i와 같은 활용이 가능하다. 이는 메서드에도 동일하게 적용된다.
객체를 생성하지 않고도 변수와 메서드를 사용할 수 있으므로 빠르게 작동한다. 또한 편하다.
static 키워드를 쓸 경우 아래의 사항을 주의해야 한다.
static 메서드는 일반 멤버변수를 사용할 수 없다. 조금만 생각해 보면 당연히 그래야 함을 알 수 있다. static 키워드가 붙으면 인스턴스가 만들어지기 전에 호출가능하다. 그러나 static이 붙지 않은 멤버변수는 인스턴스가 만들어지기 전엔 존재하지 않는다. 존재하지 않는 변수를 사용할 수 없으니 당연히 일반 멤버변수를 사용할 수 없다. 만약 static 메서드에서 일반 멤버변수를 호출하면 컴파일 실패한다.
static를 쓸 경우 얻을 수 있는 장점이 분명히 존재하므로 아래와 같은 경우에는 static를 고려해 보자.
클래스간 함께 공유해서 사용해야 하는 멤버변수들
인스턴스 변수를 사용하지 않는 메서드들
C/C++
C 프로그래밍 언어는 static, auto, register, extern 4개의 storage class - 여기에서 객체의 클래스가 아닌 집합의 의미를 가진다 - 를 가진다.
static global variable
소스파일의 최상의 레벨에서 함수외부에 선언되는 static 변수.
프로그램이 시작할 때 할당되고 종료할 때까지 유지된다.
static으로 선언된 변수는 선언된 소스코드 파일에 고정되므로, 다른 파일에서 동일한 이름의 static 변수가 선언될 수 있다. 물론 이들 변수는 파일별로 독립적으로 사용된다.
static local variable
함수안에서 선언되는 static 변수로 automatic local variables (자동지역변수)와 같은 scope를 가진다.
함수가 호출될때 할당되고 함수가 반환할때 소멸된다.
static 변수값 초기화. static으로 선언된 변수들은 고유의 값으로 초기화된다.
|| 데이터형 || 초기화 값 || 비고 ||
int
0
char
\0
pointer
NULL
float
0.0
double
0.0
bool
0
C의 경우 C99에서 지원
static member variable
C++에서는 멤버변수를 static 멤버변수로 지정할 수 있다. static 으로 선언된 멤버변수는 모든 클래스 인스턴스가 서로 공유한다.
static method
C++은 메서드를 static로 선언하는게 가능하다. static로 선언한 메서드는 클래스의 인스턴스가 없어도 사용할 수 있다.
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와 비슷하다
static는 일반 멤버변수를 사용할 수 없다.
static는 클래스 인스턴스 없이 호출할 수 있다. 반면 일반 멤버변수는 인스턴스가 만들어져야 할당된다. 없는 멤버변수를 사용할 수 없지 않겠는가 ?
일반 메서드는 static 멤버변수를 사용할 수 있다. static 멤버변수는 이미 존재하고 있기 때문에, 사용하는데 문제가 없다.
static를 이용할 경우의 장점역시 Java와 비슷하다.
c 에서 static 함수
C에서 함수가 static로 선언되면, 해당 파일의 내부에서만 호출이 가능하고 다른 파일에서는 호출할 수가 없다. 예컨데, private 처럼 작동한다.
이런 static의 특징은 여러 명이 협업하는 큰 규모의 프로젝트에서 원할한 협업이 가능하도록 해준다. 만약 어떤 함수를 static으로 선언하지 않았다면 이 함수가 변경됐을 때, 이 함수를 사용하는 모든 파일을 추적해서 변경해야 한다.
때문에, 공용으로 사용할 함수가 아니라면 static 함수로 사용해서 private 영역에서만 사용하도록 하는게 나중을 위해서 좋다.
static
Java
C/C++
c 에서 static 함수
Recent Posts
Archive Posts
Tags