[Java] static 과 non-static 의 차이

백엔ㄷ현·2024년 10월 8일
0


정적 맴버와 인스턴스의 맴버의 차이점을 막연하게 알고 있었지만 새로이 공부하면서 알게된 사실들을 정리해보았다.

Staticnon-static 의 큰 차이는 클래스 맴버가 클래스 자체에 속하는지 아니면 클래스의 인스턴스(객체) 에 속하는지에 대한 것이다.

1. Static (정적) 맴버 :

  • 클래스에 속함 :

    static 으로 선언된 맴버(변수, 메소드)는 클래스 자체에 속한다. 즉, 객체가 아닌 클래스 레벨에서 관리가 된다.

  • 공유 :

    모든 객체가 동일한 static 맴버를 공유한다. 객체마다 따로 복사되지 않는다.

  • 객체의 생성 없이 사용 :

    static 맴버는 클래스 이름을 통해 객체 생성 없이 바로 접근할 수 있다.

2. non-Static (인스턴스) 맴버 :

  • 인스턴스에 속함 :

    non-static 맴버는 클래스의 인스턴스(객체)에 속한다. 즉, 객체가 생성되어야만 해당 맴버를 사용할 수 있다.
  • 개별 관리 :

    각 객체는 고유한 non-static 맴버를 갖는다. 즉, 객체마다 독립된 맴버 값을 가진다.

3. 차이점 요약

속성static 맴버non-static 맴버
소속 :클래스객체
메모리 할당 :클래스 로딩 시 할당객체 생성 시 할당
접근 방법 :클래스 이름으로 접근 가능객체를 통해 접근 가능
값 공유 여부 :모든 객체가 동일한 값 공유각 객체마다 별도로 값 유지
객체 생성 여부 필요 :필요 없음필요

4. 예시 코드

Car.java

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);
	}
}

Main.java

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 출력

5. 콘솔 출력

6. 코드 설명

  • static 변수와 메소드 :

    • static int numberOfCars :

      Car 클래스의 이 변수는 Car 클래스 전체에 대해 하나만 존재하는 변수이다. 즉, 모든 Car 객체가 이 변수를 공유하게 된다.

    • static int getNumberOfCars() :

      이 메소드는 객체 생성 없이 클래스 이름으로 호출 할 수 있다. numberOfCars 는 모든 Car 객체가 공유하는 값이므로, 이 값을 리턴하게 된다.

  • non-static 변수와 메소드 :

    • String model :

      이 변수는 각 Car 객체마다 고유하게 존재한다. 즉, car1 과 car2 는 서로 다른 model 값을 가지게 된다.
    • void displayModel() :

      이 메소드는 각 객체에 속한 모델 이름을 출력한다. 객체마다 다른 model 을 가지고 있기 때문에 객체에 따라 다른 결과를 출력한다.


7. 알게된 점과 느낀점

  • static 변수와 메소드는 객체가 없어도 클래스 이름을 통해 직접 접근할 수 있다.

    -> 맴버는 클래스에 속하고, 객체 간에 공유되며, 클래스 이름으로도 접근할 수 있다는 사실을 알게 되었다.
  • non-static 변수와 메소드는 객체를 생성해야만 접근할 수 있으며, 각 객체마다 독립적으로 관리된다.

    -> 맴버는 객체에 속하고, 각 객체마다 고유하며, 객체를 통해서만 접근할 수 있다는 사실을 알게 되었다.
profile
매일매일 공부한 내용과 코드 기록하겠습니다

0개의 댓글