정적 맴버와 인스턴스의 맴버의 차이점을 막연하게 알고 있었지만 새로이 공부하면서 알게된 사실들을 정리해보았다.
Static
과 non-static
의 큰 차이는 클래스 맴버가 클래스 자체에 속하는지 아니면 클래스의 인스턴스(객체) 에 속하는지에 대한 것이다.static
으로 선언된 맴버(변수, 메소드)는 클래스 자체에 속한다. 즉, 객체가 아닌 클래스 레벨에서 관리가 된다.
모든 객체가 동일한 static
맴버를 공유한다. 객체마다 따로 복사되지 않는다.
static
맴버는 클래스 이름을 통해 객체 생성 없이 바로 접근할 수 있다.
non-static
맴버는 클래스의 인스턴스(객체)에 속한다. 즉, 객체가 생성되어야만 해당 맴버를 사용할 수 있다.non-static
맴버를 갖는다. 즉, 객체마다 독립된 맴버 값을 가진다.속성 | static 맴버 | non-static 맴버 |
---|---|---|
소속 : | 클래스 | 객체 |
메모리 할당 : | 클래스 로딩 시 할당 | 객체 생성 시 할당 |
접근 방법 : | 클래스 이름으로 접근 가능 | 객체를 통해 접근 가능 |
값 공유 여부 : | 모든 객체가 동일한 값 공유 | 각 객체마다 별도로 값 유지 |
객체 생성 여부 필요 : | 필요 없음 | 필요 |
class Car {
// static 변수 : 모든 객체가 공유하는 변수
static int numberOfCars = 0;
// non-static 변수 : 각 객체마다 고유한 변수
String model;
// 생성자
public Car(String model) {
this.model = model; // 각 객체에 고유한 모델 이름 할당
numberOfCars++; // static 변수 : Car 객체가 생성될 때마다 증가
}
// static 메소드 : 클래스 레벨에서 호출 가능 (객체의 생성이 필요 없음)
public static int getNumberOfCars() {
return numberOfCars;
}
// non-static 메소드 : 객체 레벨에서 호출해야 함 (객체 생성이 필요)
public void displayModel() {
System.out.println("Car model : " + this.model);
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성 전에도 static 변수에 접근 가능
System.out.println("Number of cars : " + Car.getNumberOfCars()); // 0 출력
// 첫 번째 객체 생성
Car car1 = new Car("Toyota");
car1.displayModel(); // Car model : Toyota 출력
System.out.println("Number of cars : " + Car.getNumberOfCars()); // 1 출력
// 두 번째 객체 생성
Car car2 = new Car("Honda");
car2.displayModel(); // Car model : Honda 출력
// 세 번째 객체 생성
Car car3 = new Car("Ford");
car3.displayModel(); // Car model : Ford 출력
System.out.println("Number of cars : " + Car.getNumberOfCars()); // 3 출력
static int numberOfCars
:Car 클래스의 이 변수는 Car 클래스 전체에 대해 하나만 존재하는 변수이다. 즉, 모든 Car 객체가 이 변수를 공유하게 된다.
static int getNumberOfCars()
:이 메소드는 객체 생성 없이 클래스 이름으로 호출 할 수 있다. numberOfCars
는 모든 Car 객체가 공유하는 값이므로, 이 값을 리턴하게 된다.
String model
:void displayModel()
:
static
변수와 메소드는 객체가 없어도 클래스 이름을 통해 직접 접근할 수 있다.
-> 맴버는 클래스에 속하고, 객체 간에 공유되며, 클래스 이름으로도 접근할 수 있다는 사실을 알게 되었다.
non-static
변수와 메소드는 객체를 생성해야만 접근할 수 있으며, 각 객체마다 독립적으로 관리된다.
-> 맴버는 객체에 속하고, 각 객체마다 고유하며, 객체를 통해서만 접근할 수 있다는 사실을 알게 되었다.