인스턴스 멤버
- 객체 마다 가지고 있는 멤버
인스턴스 필드: 힙 영역의 객체 마다 가지고 있는 멤버, 객체마다 다른 데이터를 저장
인스턴스 메소드: 객체가 있어야 호출 가능한 메소드, 클래스 코드(메소드 영역)에 위치하지만, 이해하기 쉽도록 객체 마다 가지고 있는 메소드라고 생각해도 됨
정적 멤버
- 객체와 상관없는 멤버, 클래스 코드(메소드 영역)에 위치
정적 필드 및 상수: 객체 없이 클래스만으로도 사용 가능한 필드
정적 메소드: 객체가 없이 클래스만으로도 호출 가능한 메소드
인스턴스 멤버와 this
인스턴스 멤버
- 객체를 생성한 후 사용할 수 있는 필드와 메소드
public class Car {
int gas;
void setSpeed(int speed) { ... }
}
Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);
Car yourCar = new Car();
yourCar.gas = 20;
yourCar.setSpeed(80);

this
- 객체 내에서 인스턴스 멤버에 접근하기 위해 사용
- 생성자와 메소드의 매개변수 이름이 필드와 동일할 경우 필드임을 지정하기 위해 주로 사용
Car(String model) {
this.model = model;
}
void setModel(String model) {
this.model = model;
}
정적 멤버와 static
정적 멤버
- 클래스에 고정된 멤버로서 객체 생성하지 않고 사용할 수 있는 필드와 메소드
public class 클래스 {
static 타입 필드 [= 초기값];
static 리턴 타입 메소드(매개변수 선언, ...) {...}
}

정적 멤버 사용
클래스.필드;
클래스.메소드(매개값, ...);
public class Calculator{
static double pi = 3.14159;
static int plus(int x, int y) {...}
static int minus(int x, int y) {...}
}
double result1 = 10*10*Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minis(10,5);
정적 메소드 선언 시 주의할 점
- 정적 메소드 선언 시 그 내부에 인스턴스 필드 및 메소드 사용 불가
- 정적 메소드 선언 시 그 객체 자신 참조인 this 키워드 사용 불가
public class ClassName{
int field1;
void method1() {...}
static int field2;
static void method2() {...}
static void method3(){
this.field1 = 10;
this.method1();
field2 = 10;
method2();
}
}
- 정적 메소드에서 인스턴스 멤버 사용하려는 경우
객체 우선 생성 후 참조 변수로 접근
static void method3(){
ClassName obj = new ClassName();
obj.field1 = 10;
obj.method1();
}
정리
- 인스턴스 멤버: 객체를 생성한 후 사용할 수 있는 필드와 메소드
인스턴스 필드, 인스턴스 메소드
- this: 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있음
주로 생성자와 메소드의 매개변수 이름이 필드와 동일한 경우, 인스턴스 멤버만 필드임을 명시
- 정적멤버: 클래스에 고정된 멤버로서 객체 생성하지 않고 사용할 수 있는 필드와 메소드
- static: 정적 멤버를 선언할 때 사용하는 키워드