인스턴스 멤버와 정적 멤버
인스턴스 멤버란?
객체(인스턴스)를 생성한 후 사용할 수 있는 non static 필드와 non static 메서드를 말한다.
인스턴스 필드, 인스턴스 메서드라고 부른다.
얘네는 객체 없이 사용할 수 없다.
객체 외부에서 사용하려면 무조건 객체를 생성하고 도트 연산자로 접근해야한다.
객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
this는 주로 생성자와 메서드의 매개 변수 이름이 필드와 같은 경우, 인스턴스 필드임을 명시할 때 사용된다.
public class Person {
//필드
String name;
int age;
//생성자
public Person() { }
public Person(String name) {
this(name, 20);
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//메서드
private setName(String name) {
this.name = name;
}
}
정적 멤버
정적(static)은 '고정된' 이란 의미를 가지고 있다.
정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고도 사용할 수 있는 필드와 메서드를 말한다.
각각 정적 필드, 정적 메서드라고 부른다.
객체(인스턴스)에 소속되지 않고 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.
정적 필드와 정적 메서드는 클래스 로더가 클래스(.class 바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스 로딩이 끝나면 바로 사용할 수 있다.
그렇기 때문에 같은 클래스여도 객체 생성이 필요한 인스턴스 필드나 인스턴스 메서드를 객체 생성 없이 사용할 수 없고
객체 자신을 가리키는 this를 내부에 사용하면 안된다.
정적 멤버 선언
static 키워드를 붙이면 된다.
public class 클래스 {
//정적 필드
static 타입 필드명 [= 초기값];
//정적 메서드
static 리턴타입 메서드명 ([매개변수 선언]) {
}
}
정적 필드와 정적 메서드는 클래스 로더가 클래스(.class 바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스 로딩이 끝나면 바로 사용할 수 있다.
필드를 인스턴스 필드로 선언할 것인가, 정적 필드로 선언할 것인가?
객체마다 가지고 있어야 할 데이터(name, age 등)라면 인스턴스 필드로 선언.
공용적인 데이터(파이값 등)라면 정적 필드로 선언.
메서드를 인스턴스 메서드로 선언할 것인가, 정적 메서드로 선언할 것인가?
인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메서드로 선언.
인스턴스 필드를 이용하지 않는다면 정적 메서드로 선언. (ex) Calculator 클래스의 덧셈, 뺄셈 기능)