static이란?
static은 클래스(Class)에 속하는 멤버를 의미한다. 객체마다 생성되는 것이 아니라 클래스에 하나만 생성되어 모든 객체가 함께 공유한다.
즉, static 변수는 객체를 여러 개 생성해도 하나만 존재하므로 공유 자원이 된다.
객체를 통해 접근할 수도 있지만, 실제로는 객체의 것이 아니라 클래스의 것이다.
인스턴스 변수
static이 없는 변수는 인스턴스 변수이다. 객체를 생성할 때마다 각각의 객체가 자신만의 변수를 가진다.
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age = 20;
p1.name = "홍길동";
p2.age = 30;
p2.name = "이순신";
System.out.println(p1.name); // 홍길동
System.out.println(p2.name); // 이순신
}
}
class Person {
int age;
String name;
}
각 객체가 name과 age를 따로 가지고 있으므로 서로 영향을 주지 않는다.
static 변수
static을 붙이면 해당 변수는 클래스에 하나만 생성된다.
모든 객체가 같은 변수를 공유하기 때문에, 한 객체에서 값을 변경하면 다른 객체에서도 변경된 값이 보인다.
static 메서드는 static 멤버만 접근할 수 있다.
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age = 20;
p1.name = "홍길동";
p2.age = 30;
p2.name = "이순신";
System.out.println(p1.name); //이순신
System.out.println(p2.name); //이순신
}
}
class Person {
int age;
static String name;
}
name은 하나만 존재하므로 p2가 "이순신"으로 변경하면 p1에서도 같은 값이 출력된다.
객체마다 다른 값을 가져야 하는 변수에는 static을 사용하지 않는 것이 좋다.
기본적으로 자바에서는 static을 잘 사용하지 않는다.
static을 사용하는 이유
static은 객체마다 가질 필요가 없는 데이터나 기능을 클래스에 하나만 두기 위해 사용한다.
모든 객체가 같은 값을 사용하거나, 객체를 생성하지 않고도 사용할 기능이라면 static을 붙이는 것이 편리하다.
예를 들어 humanAvgAge는 사람의 평균 나이로, 모든 사람이 공통으로 사용하는 값이므로 static으로 선언하는 것이 적합하다.
static 변수와 메서드는 객체보다 클래스 이름으로 접근하는 것이 권장된다.
public class Main {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
p1.age = 20;
p2.age = 30;
p1.introduce();
p2.introduce();
p1.printHumanAvgAge();
p2.printHumanAvgAge();
Person.humanAvgAge = 50; // static은 클래스를 통해 바로 접근 가능
}
}
class Person {
int age;
static int humanAvgAge = 40;
void introduce() {
System.out.println("제 나이는 " + this.age + "살 입니다.");
}
void printHumanAvgAge() {
System.out.println("인류 평균 나이는 " + humanAvgAge + "살 입니다.");
}
}
위 코드에서 humanAvgAge는 객체마다 존재하는 값이 아니라 클래스에 하나만 존재하므로 모든 Person 객체가 같은 값을 사용한다.
static 메서드
객체의 정보가 필요 없는 메서드는 static으로 선언하는 것이 좋다.
예를 들어 printHumanAvgAge()는 객체마다 다른 age를 사용하는 것이 아니라 공통 변수인 humanAvgAge만 사용하므로 static 메서드로 선언할 수 있다.
static void printHumanAvgAge() {
System.out.println("인류 평균 나이는 " + humanAvgAge + "살 입니다.");
}
그러면 객체를 생성하지 않고도 클래스 이름으로 바로 호출할 수 있다.
Person.printHumanAvgAge();
반면 introduce()처럼 객체마다 다른 age를 사용하는 메서드는 static으로 선언할 수 없다.
기억하자. static은 non-static을 사용할 수 없다. 반대는 가능하다.
'알고리즘 > Java' 카테고리의 다른 글
| [Java] 상속 / 구성 (0) | 2026.07.14 |
|---|---|
| [Java] 리스트(List) / 맵(Map) (0) | 2026.07.14 |
| [Java] 함수 (0) | 2026.07.13 |
| [Java] 클래스 (0) | 2026.07.13 |
| [Java] 배열의 복사 (0) | 2026.07.13 |
댓글