static 키워드로 선언된 필드와 메소드를 의미
클래스가 메모리에 로딩될 때 자동으로 생성
모든 객체가 공유함
객체 생성 없이 사용 가능
클래스 변수 (Static Field)
클래스 메소드 (Static Method)
public class Car {
static int totalCars = 0; // 클래스 변수
static void showTotalCars() { // 클래스 메소드
System.out.println("전체 자동차 수: " + totalCars);
}
}
Car.totalCars = 5;
Car.showTotalCars(); // 전체 자동차 수: 5
클래스 이름으로 직접 접근
인스턴스 없이 사용 가능
static 없이 선언된 필드와 메소드
객체가 생성될 때마다 별도로 메모리에 생성
객체마다 독립적인 값과 동작을 가짐
객체를 통해서만 접근 가능
인스턴스 변수 (Field)
인스턴스 메소드
public class Car {
String model; // 인스턴스 변수
void drive() { // 인스턴스 메소드
System.out.println(model + "가 운행됩니다");
}
}
Car myCar = new Car();
myCar.model = "소나타";
myCar.drive(); // 소나타가 운행됩니다
객체를 생성하고 그 참조변수를 통해 접근
구분 |
클래스 멤버 |
인스턴스 멤버 |
---|---|---|
키워드 |
static |
없음 |
생성 시점 |
클래스 로딩 시 |
객체 생성 시 |
접근 방법 |
클래스명.변수 또는 메소드 |
객체명.변수 또는 메소드 |
메모리 |
클래스당 1개 |
객체당 각각 생성 |
공유 여부 |
모든 객체가 공유 |
각 객체가 독립적으로 소유 |
사용 예 |
Math.pow(), System.out 등 |
String.length(), 사용자 정의 등 |
public class Counter {
static int count = 0; // 클래스 변수
int id; // 인스턴스 변수
public Counter() {
count++;
id = count;
}
void printInfo() {
System.out.println("ID: " + id + ", Total: " + count);
}
static void printTotal() {
System.out.println("총 객체 수: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
c1.printInfo(); // ID: 1, Total: 2
c2.printInfo(); // ID: 2, Total: 2
Counter.printTotal(); // 총 객체 수: 2
}
}
클래스 메소드에서는 인스턴스 멤버에 직접 접근할 수 없음
public class Test {
int number = 10;
static void show() {
// System.out.println(number); // 오류: static 메소드에서 인스턴스 변수 접근 불가
}
}
인스턴스 멤버를 사용하려면 객체를 생성하고 접근해야 함
항목 |
클래스 멤버 |
인스턴스 멤버 |
---|---|---|
키워드 |
static |
없음 |
접근 방식 |
클래스명으로 직접 접근 |
객체를 통해 접근 |
메모리 구조 |
클래스당 하나 공유 |
객체별로 각각 존재 |
대표적 사용 예 |
상수, 공용 기능 (Math, System) 등 |
객체 고유의 속성이나 동작 |