1. 인스턴스 멤버

인스턴스 멤버라고 불리는 녀석들은 클래스와 같은 객체를 생성했을 때, 함께 따라오는 '필드'와 '메소드'를 말합니다.

 

때문에 일반적인 '필드'와 '메소드'를 '인스턴스 필드'와 '인스턴스 메소드'라고 불러도 상관없습니다.

 

 

인스턴스 멤버가 갖고있는 특징은, [ 객체가 생성된 후 사용할 수 있다 ]라는 것입니다.

 

즉, Car라는 클래스가 존재하고, 여기에 'name'이라는 필드와 'go()'라는 메소드가 존재한다고 가정하면,

 

Car bmw = new Car(); 

 

라는 코드를 통해 객체를 생성한 후

 

bmw.name 또는 bmw.go() 라는 형태를 통해 접근이 가능하다는 특징을 갖고있습니다.

 

또한 [ Car benz = new Car(); ]라는 녀석을 통해 새로운 객체를 만들었다면, 당연하게도 benz가 참고하고있는 객체의 인스턴스 멤버는 bmw가 참조하는 인스턴스 멤버와 서로 다를수 있습니다.

 

 

 

2. 정적 멤버

일반적으로 'Static'이라는 녀석이 붙은 '필드'와 '메소드'를 정적 멤버라고 부릅니다.

 

public class Car {

    static String name;

    static void go() {...}

}

 

위와같은 클래스가 존재한다면, static으로 선언된 name과 go라는 필드와 메소드는 '정적멤버'입니다.

 

이 녀석들의 특징은 '객체'에 소속된 녀석들이 아닌, 클래스라는 녀석에 소속된 녀석들입니다.

 

즉, 위의 Car라는 클래스에 소속된 녀석이기 때문에 Car라는 클래스를 사용하는 모든 객체들은 동일한 필드와 메소드를 공유한다는 의미입니다.

 

또한, Static으로 선언된 녀석들은 앞서 [ JVM의 메모리 관리 ]부분에서 말씀드린것처럼 '클래스로더'가 코드를 읽는 과정에서 [메소드영역]에 올라가기 때문에 프로그램의 시작지점부터 호출될 수 있으며, 어디서든 호출이 가능하다는 특징을 갖고있습니다.

 

 

 

 

더보기

추가적으로 Class내에서 정적멤버를 초기화하는 방식은 두 가지가 있습니다.

1) 기본

public static Car {

    static String name;

}

 

2) 블록방식

public static Car {

    static String name;

 

    static {

        name = "The Name is BMW!";

    }

}

 

 

아래 블록방식은 클래스 로더가 static으로 선언된 부분을 읽어 수행한다는 것을 응용한 것으로 불 수 있습니다.

따라서 static으로 선언된 name이 먼저 메소드 영역에 올라가고, 이 후 static {...} 부분을 클래스로더가 실행하여 name이라는 값을 수정하게되도록 만들어주는 형태입니다.

+ Recent posts