TIL 20-04-08
Updated:
06-5 인스턴스 멤버와 정적 멤버
핵심 키워드
- 클래스에 선언된 필드와 메소드가 모두 객체 내부에 포함되는 것은 아니다. 포함되지 않고 클래스에 그대로 남아 있는 것도 있다.
- 인스턴스 멤버는 객체마다 가지고 있는 멤버, 정적 멤버는 클래스에 고정된 객체들이 공유하는 멤버
인스턴스 멤버와 this
- 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다. 각각 인스턴트 필드와 인스턴드 메소드라고 부른다.
인스턴스 멤버 선언
public class Car{
//필드
int gas;
//메소드
void setSpeed(int speed) { ... }
}
this
- 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용 가능. 객체는 자신을 this라고 함.
- 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 필드임을 명시하고자 할 때 사용.
Car(String model) {
this.model = model;
}
void setModel(String model) {
this.model = model;
}
정적 멤버와 static
- 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
정적 멤버 선언
*필드와 메소드 선언 시 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.minus(10, 5);
정적 메소드 선언 시 주의할 점
- 이들 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가
- 객체 자신의 참조인 this 키워드도 사용 불가
//컴파일 에러 예시
public class ClassName {
//인스턴스 필드와 메소드
int field1;
void method1() { ... }
//정적 필드와 메소드
static int field2;
static void method2() { ... }
//정적 메소드
static void Method3 {
this.field1 = 10; //(x)
this.method1(); //(x)
field2 = 10; //(o)
method2(); //(o)
}
}
- 정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조 변수로 접근해야 함.
static void Method3() {
ClassName obj = new ClassName;
obj.field1 = 10;
obj.method1();
}
인스턴스 멤버와 정적 멤버 선언 판단 기준
필드 선언
- 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드
- 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드
- (예시) Calculator 클래스에서 원의 넓이나 둘레를 구할 때 필요한 파이는 변하지 않는 공용 데이터이므로 정적 필드로 선언, Calculator별로 색깔이 다르다면 color는 인스턴스 필드로 선언
public class Calculator {
String color; //계산기별로 색깔이 다를 수 있다.
static double pi = 3.14; //계산기에서 사용하는 파이 값은 동일하다.
}
메소드 선언
- (예시) Calculator 클래스의 덧셈, 뺄셈 기능은 외부에서 주어진 매개값을 가지고 수행하므로 정적 메소드로 선언, 인스턴스 필드인 색깔을 변경하는 메소드는 인스턴스 메소드로 선언
public class Calculator {
String color; //인스턴스 필드
void setColor(String color) { this.color = color; } //인스턴스 메소드
static int plus(int x, int y) { return x + y ; } //정적 필드
static int minus(inx x, int y) { return x - y ; : //정적 필드