인스턴스 멤버와 클래스 멤버라는 용어를 책에서 읽더라도 부끄럽게도 Class안 필드와 메서려니 하고 디테일에 집중하지 않았습니다. 좀 더 개념적으로 정확한 의미에 대해 가볍게 다시 한 번 정리하고 넘어가겠습니다.
멤버는 영어로 Member = 해석하면 구성원이라고 합니다.우리가 사용하는 멤버의 종류는 크게 2가지로 구분합니다.① 필드 ( Field )② 메서드 ( Method)
인스턴스 메버란 New를 통해 객체를 생성한 후 사용할 수 있는 필드와 메서드를 말합니다.인스턴스 멤버에서도 객체 내부의 인스턴스 멤버에 접근하려면 this를 통해 가능합니다.
public class Test {
//인스턴스 필드
private int three;
public Test( int three ) {
//this를 통해 인스턴스 멤버에 접근할 수 있다. this.three는 위의 인스턴스 필드를 가르킵니다.
this.three = three;
}
//인스턴스 메서드
public int multiply( int a, int b ) {
return a*b;
}
}
객체를 생성하지 않고도 사용할 수 있는 필드와 메서드를 말합니다.
public class Test {
//클래스 필드
public static int ONE = 1;
public static String TWO = "TWO";
public static String FOUR;
// 클래스 메서드
public static int sum( int a , int b ) {
return a + b;
}
}
final 필드는 한번 초기화되면 더는 수정할 수 없는 필드를 말합니다. 만약 외부에서 주입해주는 값으로 초기화해주고 싶다면 생성자를 이용하면 됩니다. 다만 생성자에서도 초기화해주지 않는다면 컴파일 에러가 납니다.
public class Test {
private final int one = 10;
private final int two;
public Test( int two ) {
this.two = two;
}
}
위에서 살펴 본 것처럼 final 필드는 한번 초기화되면 더는 값을 수정할 수 없다고 하였습니다. 그렇다면 final 필드를 상수라고 하면 되지 않을까요? 그렇지 않습니다. 상수란 불변의 값을 말합니다. 위의 final 변수 중 TWO는 생성자로 인해 객체마다 원하는 값으로 세팅할 수 있기 때문에 공용성을 띄지 못합니다. 때문에 모든 클래스가 공유하고 더는 바꿀 수 없는 값인 static final을 상수라고 부릅니다. 상수는 대문자로 쓰는것이 관례입니다. 혼합된 이름이라면 언더바를 사용합니다. 꼭 선언시 초기화 해주어야 하지마 복잡한 값이라면 정적 블록에서 초기화할 수 있습니다.
public class Test {
private static final String MY_NAME = "김석진";
private static final int TWO;
static {
TWO = 100;
}
}
최종적인 메서드로 더이상 오버라이딩(Overriding) 할 수 없는 메서드를 말합니다. 즉 부모 메서드에 final이 붙어있다면 더이상 자식클래스에서 재정의 할 수 없습니다.
public class Test {
public final int sum( int a, int b ) {
return a + b;
}
}
최종적인 클래스로 더이상 상속할 수 없는 클래스가 됩니다.
public final class Test {
public int sum( int a, int b ) {
return a + b;
}
}