처음 자바를 시작하면 보게되는 코드
public class Main {
public static void main(String[] args) {
}
}
여기서 static은 무엇을 의미하는 것일까
- 변수와 메소드의 키워드이다.
- static 키워드를 사용하면 클래스에 종속되기 때문에, 클래스가 메모리에 올라갈 때 생성이 된다.
때문에 인스턴스(객체)를 생성하지 않고 바로 클래스에서 사용할 수 있다.
예시를 통해 알아보자.
class Car{
String name; // non-static 변수
static String color; // static 변수
}
위와 같이 color에만 static 키워드를 부여했다. 그러면 어떤 식으로 활용이 될까
public class Main {
public static void main(String[] args) {
Car.color = "흰색";
System.out.println(Car.color); // "흰색" 출력
Car.name = "소나타"; // error
System.out.println(Car.name); // error
}
}
class Car {
String name;
static String color;
}
그러면 다음과 같은 오류가 발생할 것이다.
Main.java:7:8
java: non-static variable name cannot be referenced from a static context
non static 키워드를 가진 변수는 static 메소드인 main에서 활용될 수 없다.
non static을 활용하기 위해서는 객체 즉 인스턴스를 선언해야 활용할 수 있다.
반대로 static 키워드를 가진 변수는 이미 클래스에 종속되어 그 값이 메모리에 올라갔기 때문에 별도로 인스턴스를 생성하지 않고 바로 변수를 호출이 가능하다.
public class Main {
public static void main(String[] args) {
Car.color = "흰색";
System.out.println(Car.color);
Car carOne = new Car();
carOne.name = "소나타";
System.out.println(carOne.name); // "소나타" 출력
}
}
class Car {
String name;
static String color;
}
위와 같이 non-static 키워드를 가진 name 변수는 carOne이라는 인스턴스를 선언하고 해당 인스턴스의 변수에 "소나타"라는 값을 저장하여 활용된다.
non-static은 인스턴스 키워드로 이해하고 static은 class 키워드로 생각하면 이해가 쉬울 것이라 생각한다.
static 변수는 이미 Car 클래스 안에 저장이 되어있기 때문에 다음과 같이 활용할 수도 있다.
public class Main {
public static void main(String[] args) {
Car.color = "흰색";
System.out.println(Car.color);
Car carOne = new Car();
carOne.name = "소나타";
System.out.println(carOne.name);
System.out.println(carOne.color);
// 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
}
}
class Car {
String name;
static String color;
}
carOne은 Car 클래스를 틀로하여 만들어졌기 때문에 이미 Car라는 클래스에 color의 값이 저장되어 있으므로 carOne 인스턴스에서 static 변수인 color를 지정하지 않더라도 이미 클래스에 저장된 값이 출력된다.
static은 전역적 키워드 , non-static은 지역적 키워드라고 이해하자.
메소드도 마찬가지다.
public class Main {
public static void main(String[] args) {
Car.color = "흰색";
Car.printColor(); // "흰색 출력"
Car.printName(); // error
}
}
class Car {
String name;
static String color;
void printName(){
System.out.println(name);
}
static void printColor(){
System.out.println(color);
}
non-static 키워드를 가진 printName 메소드는 변수와 마찬가지로 인스턴스를 선언하지 않으면 바로 활용될 수 없다.
public class Main {
public static void main(String[] args) {
Car.color = "흰색";
Car carOne = new Car();
carOne.name = "투싼";
System.out.println(carOne.name);
System.out.println(carOne.color);
// 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
System.out.println("\n");
Car carTwo = new Car();
carTwo.name = "소나타";
System.out.println(carTwo.name);
System.out.println(carTwo.color);
// 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
}
}
class Car {
String name;
static String color;
void printName(){
System.out.println(name);
}
static void printColor(){
System.out.println(color);
}
}
위와 같이 인스턴스를 여러 개 선언하더라도 고정된 변수나 메소드를 활용한다면 static 키워드를 지정하는 것이 좋다.
정리하자면
- static 변수, 메소드는 별도로 인스턴스를 선언하지 않고 바로 활용될 수 있다.
- 모든 인스턴스에서 공통된 값을 유지해야 할 때 static 키워드를 가진 변수, 함수를 사용.
- static 키워드를 가진 메소드(함수)에서는 non-static 키워드를 사용할 수 없다.
(non-static은 인스턴스를 생성해야만 존재한다)
반대로 non-static 변수나 메소드에서는 static이 붙은 변수나 메소드를 호출해서 활용할 수 있다.
(static 키워드를 가졌다면 이미 메모리에 존재하기 때문)