인스턴스 필드 (오브젝트 필드)
인스턴스 필드는 클래스의 각 객체마다 별도로 유지되는 변수입니다. 즉, 클래스의 각 인스턴스는 자체의 인스턴스 필드 값을 가집니다.
- 정의: 클래스 내에서 static 키워드 없이 선언된 필드.
- 메모리: 각 객체마다 별도로 저장됩니다.
- 접근: 인스턴스를 통해 접근합니다.
스태틱 필드 (클래스 필드)
정적 필드(스태틱 필드)는 클래스에 속하는 변수로, 해당 클래스의 모든 객체가 공유합니다. 정적 필드(스태틱 필드)는 클래스가 메모리에 로드될 때 한 번 초기화됩니다.
- 정의: 클래스 내에서 static 키워드와 함께 선언된 필드.
- 메모리: 클래스 로더에 의해 메모리에 한 번만 로드됩니다.
- 접근: 클래스 이름으로 접근하며, 인스턴스를 통해서도 접근할 수 있습니다.
public class Car {
// 정적 필드: 클래스에 속하며 모든 인스턴스가 공유
public static int numberOfCars = 0;
// 인스턴스 필드: 각 객체에 속하며 독립적
private String model;
private int year;
// 생성자: 객체가 생성될 때 호출
public Car(String model, int year) {
this.model = model;
this.year = year;
numberOfCars++; // 새로운 객체가 생성될 때마다 정적 필드를 증가시킴
}
// 인스턴스 메서드: 인스턴스 필드에 접근
public String getModel() {
return model;
}
public int getYear() {
return year;
}
// 정적 메서드: 정적 필드에 접근
public static int getNumberOfCars() {
return numberOfCars;
}
public static void main(String[] args) {
// 정적 메서드 호출: 클래스 이름을 통해 직접 접근
System.out.println(Car.getNumberOfCars()); // 출력: 0
// 새로운 인스턴스 생성
Car car1 = new Car("Toyota", 2020);
Car car2 = new Car("Honda", 2019);
// 정적 메서드 호출: 객체를 통해서도 접근 가능
System.out.println(Car.getNumberOfCars()); // 출력: 2
// 인스턴스 메서드 호출: 각 객체의 인스턴스 필드에 접근
System.out.println(car1.getModel()); // 출력: Toyota
System.out.println(car2.getModel()); // 출력: Honda
}
}
주요 차이점
- 소속:
- 인스턴스 필드: 각 객체에 속합니다.
- 정적 필드: 클래스에 속합니다.
- 메모리 할당:
- 인스턴스 필드: 각 객체가 생성될 때마다 별도로 할당됩니다.
- 정적 필드: 클래스가 처음 로드될 때 한 번만 할당됩니다.
- 공유:
- 인스턴스 필드: 객체마다 독립적입니다.
- 정적 필드: 모든 객체가 공유합니다.
- 접근 방법:
- 인스턴스 필드: 객체를 통해 접근합니다.
- 정적 필드: 클래스 이름을 통해 직접 접근할 수 있으며, 객체를 통해서도 접근 가능합니다.
- 요약
- 인스턴스 필드는 각 객체에 속하며, 객체마다 별도로 존재합니다.
- 정적 필드는 클래스에 속하며, 클래스의 모든 인스턴스가 공유합니다.
오브젝트 메서드 (Instance Method)
오브젝트 메서드는 클래스의 인스턴스(객체)에 속하는 메서드입니다. 이 메서드는 인스턴스의 필드(멤버 변수)에 접근할 수 있고, 인스턴스별로 다른 동작을 수행할 수 있습니다. 오브젝트 메서드는 객체가 생성된 후에 호출할 수 있습니다.
특징:
- 소속: 클래스의 인스턴스에 속합니다.
- 호출 방법: 객체를 통해 호출됩니다.
- 액세스: 인스턴스 변수와 다른 인스턴스 메서드에 접근할 수 있습니다.
- 키워드: this 키워드를 사용하여 현재 인스턴스를 참조할 수 있습니다.
스태틱 메서드 (Static Method)
스태틱 메서드는 클래스 자체에 속하는 메서드입니다. 이 스태틱 메서드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다. 일반적으로 유틸리티 함수나 인스턴스 독립적인 작업을 수행할 때 사용됩니다.
특징:
- 소속: 클래스 자체에 속합니다.
- 호출 방법: 클래스 이름을 통해 호출됩니다.
- 액세스: 인스턴스 변수나 인스턴스 메서드에 접근할 수 없습니다. 대신 스태틱 변수와 다른 스태틱 메서드에만 접근할 수 있습니다.
- 키워드: this 키워드를 사용할 수 없습니다.
주요 차이점
- 소속:
- 오브젝트 메서드: 클래스의 인스턴스에 속합니다.
- 스태틱 메서드: 클래스 자체에 속합니다.
- 호출 방법:
- 오브젝트 메서드: 객체를 통해 호출됩니다.
- 스태틱 메서드: 클래스 이름을 통해 호출됩니다.
- 액세스:
- 오브젝트 메서드: 인스턴스 변수와 메서드에 접근할 수 있습니다.
- 스태틱 메서드: 인스턴스 변수와 메서드에 접근할 수 없고, 스태틱 변수와 메서드에만 접근할 수 있습니다.
- 키워드:
- 오브젝트 메서드: this 키워드를 사용할 수 있습니다.
- 스태틱 메서드: this 키워드를 사용할 수 없습니다.
사용 시기
- 오브젝트 메서드: 인스턴스별로 다른 동작을 수행해야 하거나, 인스턴스 변수에 접근해야 할 때 사용합니다.
- 스태틱 메서드: 인스턴스와 독립적으로 동작해야 하거나, 유틸리티 성격의 메서드를 작성할 때 사용합니다.
오브젝트 메서드 = 인스턴스 메서드 , 오브젝트 필드 = 인스턴스 필드
스태틱 메서드 = 클래스 메서드, 스태틱 필드 = 클래스 필드
'Java Study' 카테고리의 다른 글
동일성(Identity)과 동등성(Equality) (0) | 2024.07.16 |
---|---|
캐시(Cache)와 캐싱(Caching) (0) | 2024.07.16 |
java 런타임 데이터 에리어 (0) | 2024.07.15 |
this 키워드와 super 키워드 (0) | 2024.07.15 |
접근 제어자(access modifier) (0) | 2024.07.15 |