인스턴스 멤버는 객체에 소속된 멤버, 객체를 생성해야 사용할 수 있는 멤버이다.
앞에서 사용한 필드 , 메서드 는 인스턴스 멤버에 해당한다.
인스턴스 멤버를 외부 클래스에서 사용하려면, 클래스 객체를 생성하고 참조 변수로 접근해야 한다.
ClassName referVal = new ClassName();
referVal.method1();
메서드는 메서드 영역에 저장되어있고 공유되지만, 객체 없이는 사용하지 못하도록 제한되어있다.
객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능한 멤버
public class 클래스 {
static 타입 필드; // 정적 필드 선언
static 리턴타입 메서드() { ... } // 정적 메서드 선언
}
정적 필드 : 공용적인 필드는 정적 필드로 선언하는것이 좋다.
public class Calculator {
static double pi = 3.14;
}
정적 메서드 : 인스턴스 필드를 사용하지 않는 메서드는 정적 메서드로 선언하는 것이 좋다
public class Calculator {
static int plus(int x, int y) { return x + y; }
}
클래스 외부에서 클래스 이름으로 접근해서 사용이 가능하다.
/* Calculator 클래스 외부 */
double area = 5 * 5 * Calculator.pi;
int add = Calculator(1 + 2);
필드 선언과 동시에 초기값을 설정하는 것이 좋지만,
복잡한 초기화 작업이 필요하다면 정적 블록을 사용한다.
static String name;
static {
name = firstName + " " + lastName;
}
정적 메서드, 정적 블록에서 인스턴스 멤버를 사용하려면
객체를 생성하고 참조 변수로 접근해야 한다.
public class ClassName {
static void method() {
ClassName refer = new ClassName();
refer.instanceFieldA = 10;
refer.instanceMethodA();
}
}
인스턴스 필드, 정적 필드는 값을 변경할 수 있다.
final 필드는 읽기전용 필드이다.
final 필드의 초기값은 필드 선언시 지정할 수도 있고
생성자에서 초기값을 지정할 수도 있다.
public class User {
/* 선언 시 지정 */
final String nation = "Korean";
/* 생성자에서 지정 */
final String dob;
User(String dob) {
this.dob = dob;
}
}
원주율 등 불변 값들을 상수 필드에 저장한다.
객체마다 따로 저장할 필요가 없고, 값을 변경할 필요도 없으므로
static 필드인 동시에 final 필드이다.
static final double pi = 3.14;
상수에 접근하려면 정적 필드처럼 접근한다.