Java의 기본 문법 중 static에 대해 알아보자
static의 원래 위치는 전역 변수라고 생각하면 편하다.
Class 는 객체를 생성해야 비용이 발생하는데, static은 선언하는 순간부터 비용이 발생한다.
따라서, 객체 생성과 관계 없이 static 변수, 함수를 호출할 수 있다.
대신 static은 1번만 불러진다.
class Tiger{
int num2 = 10;
static int num1 = 10;
static void f1() {
}
}
public class hello {
public static void main(String[] args) {
System.out.println(Tiger.num1);
Tiger.f1();
// 객체 생성과 관계 없이 static 변수, 함수를 호출할 수 있으므로,
// Tiger 객체가 생성되지 않은 시점이지만 num1을 호출하는 것이 가능하다 !
Tiger t1 = new Tiger();
Tiger t2 = new Tiger();
}
}
Java에서는 기본적으로 public static void main(String[] args) {}
함수를 우선적으로 실행한다. 왜 그럴까?
위에서 말한 것처럼
static을 사용하면 선언하는 순간부터, 객체 생성과 관계 없이 static 변수, 함수를 호출할 수 있다.
즉, Main class에 대한 객체를 생성하지 않아도 알아서 실행되는 것이다 !!
class Tiger {
void f1() {
// 자신의 이름으로 class 사용이 가능하다
Tiger t = new Tiger();
}
}
// hello는 객체가 생성되기 전부터 실행된다.
// 객체 생성 전에 실행되도록 하기 위해서 main에 static을 사용한다.
public class hello {
// static이 없으면 main에서 호출할 수가 없다.
static int num = 10;
static void f1() {
System.out.println(1);
}
void f2() {
System.out.println(2);
}
// static 함수 안에서는 static 멤버만 호출할 수 있다.
public static void main(String[] args) {
f1();
System.out.println(num);
hello h = new hello();
// 객체가 만들어졌으므로, static이 아니어도 호출할 수 있다.
h.f2();
}
}
class Tiger {
static int a = 0;
int b = 0;
Tiger() {
a++;
b++;
}
}
public class hello {
public static void main(String[] args) {
Tiger t1 = new Tiger();
Tiger t2 = new Tiger();
Tiger t3 = new Tiger();
System.out.println(t1.a + " " + t1.b); // 3 1
// a는 static 이기때문에 호출할 때마다 만들어져서 3번 더해지고, b는 t1에만 해당되므로 1번 더해졌다.
}
}
Tiger t1 = new Tiger();
코드가 실행되기 전에,
이미 static 변수와 함수들이 호출되므로, int a = 0
이 실행된다.
t1객체의 a를 호출하였지만,
객체가 한번 생성될때마다 static인 a++이 실행되고 더해지므로
총 3번의 객체가 생성되는 동안 a++이 3번 실행되어 a는 3이된다.