객체 지향 프로그래밍에서 클래스와 객체를 설계하고 관리하는 데 중요
Dog
클래스의 name
필드가 non-static이면, 각 Dog
인스턴스는 서로 다른 이름을 가질 수 있다.Dog myDog = new Dog();
myDog.bark(); // non-static 메소드 호출
객체
마다 별도로 존재한다.Dog
클래스의 name
필드가 non-static이면, 각 Dog
인스턴스는 서로 다른 이름을 가질 수 있다.공유되지 않는다.
- 멤버는 객체 내에 각각
독립된 공간
을 유지하므로 공유되지 않는다.
Non-static 멤버는 클래스의 각 인스턴스에 속한 멤버로, 객체를 생성할 때마다 각 객체에 별도로 할당된다. 이들은 static
키워드 없이 선언되며, instanceField와 instanceMethod는 non-static 멤버이므로, MyClass
의 각 인스턴스는 이들의 자체 복사본을 가지게 된.
javaCopy code
public class MyClass {
// Non-static 필드
int instanceField;
// Non-static 메소드
void instanceMethod() {
// ...
}
}
클래스 단위로 공유: static 멤버는 해당 클래스의 모든 인스턴스에 의해 공유된다. 클래스 당 하나만 존재하기 때문에, 한 인스턴스에서 static 멤버의 값을 변경하면, 그 변경사항이 모든 인스턴스에 영향을 미친다.
메모리 효율성: static 멤버는 프로그램이 시작할 때 한 번만 메모리에 할당되고, 모든 인스턴스에서 공유
되기 때문에 메모리 사용 면에서 더 효율적일 수 있다.
접근 방법: static 멤버는 클래스 이름을 통해 직접 접근할 수 있으므로, 객체를 생성하지 않고도 사용할 수 있다.
Dog.bark(); // static 메소드 호출 => 생성하지 않아도 사용 가능
생명주기: static 멤버는 클래스가 메모리에 로드될 때 생성되고, 프로그램이 종료될 때까지 남아있다. 따라서 애플리케이션의 생명주기와 밀접하게 연결되어 있다.
별도의 공간
에 생성된다.클래스 로딩 시에 멤버가 생성된다.
- 객체가 생성되기 전에 이미 생성되므로 객체를 생성하지 않고도 사용 가능.
- 객체가 사라져도 해당 멤버가 사라지지 않는다.
- 해당 멤버는 프로그램이
종료
될 때, 사라진다.
public class MyClass {
// Static 필드
static int staticField;
// Static 메소드
static void staticMethod() {
// ...
}
}
위 예에서 staticField와 staticMethod는 static 멤버이므로, MyClass
의 모든 인스턴스가 이들을 공유한다. 이 멤버들은 클래스 이름을 통해 직접 접근할 수 있다 (예: MyClass.staticMethod()
).
non-static
으로 선언하는 것이 적합하다.static
으로 선언하는 것이 좋습니다. 예를 들어, 유틸리티 메소드나 상수 값은 보통 static으로 선언된다.static
멤버를 사용하여 메모리를 효율적으로 관리해야 한다.public class MyClass {
int instanceField; // Non-static 필드
static int staticField; // Static 필드
void instanceMethod() {
// 인스턴스 메소드에서는 인스턴스 필드와 static 필드 모두 접근 가능
instanceField = 5;
staticField = 10;
}
static void staticMethod() {
// Static 메소드에서는 static 필드만 직접 접근 가능
// instanceField = 5; // 이 코드는 오류를 발생시킴
staticField = 10;
}
}
public class TestClass {
public static void main(String[] args) {
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
obj1.instanceField = 5;
obj2.instanceField = 10;
// obj1과 obj2는 instanceField에 대해 서로 다른 값을 가짐
System.out.println(obj1.instanceField); // 5 출력
System.out.println(obj2.instanceField); // 10 출력
MyClass.staticField = 15;
// 모든 인스턴스는 staticField에 대해 같은 값을 공유
System.out.println(MyClass.staticField); // 15 출력
System.out.println(obj1.staticField); // 15 출력
System.out.println(obj2.staticField); // 15 출력
}
}