티스토리 뷰

인스턴스 멤버

 

인스턴스 멤버는 객체(인스턴스)를 생성한 뒤 사용할 수 있는 필드와 메소드이다. 인스턴스 필드와 메소드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다.

 

public class Student {
	
    // field
    String name;
    int grade;
    
    // method
    void setName(String name) { ... }
    void setGrade(int grade) { ... }
    
}

 

Student 클래스의 필드 name과 grade, 메소드 setName()과 setGrade()를 사용하기 위해서는 Student 클래스의 인스턴스를 생성해야 한다. 

Student student1 = new Student();
student1.name = "밤부";
student1.setGrade = 50;

 

new 연산자를 통해 인스턴스를 생성한 뒤, 인스턴스 필드는 객체마다 따로 존재하고(힙 영역), 인스턴스 메소드는 메소드 영역에 저장되어 같은 클래스의 인스턴스끼리 공유한다. 

 


정적 멤버와 static

 

정적 멤버는 객체가 아닌 클래스에 고정(static)된 멤버이다. 따라서 객체를 생성하지 않고도 static 필드나 메소드를 사용할 수 있다. 

 

스태틱 필드의 선언 기준

객체마다 각기 달리 가지고 있어야 할 데이터라면 인스턴스 필드로, 객체마다 동일한, 공통적인 데이터라면 정적 필드로 선언하는 것이 좋다.

 

스태틱 메소드의 선언 기준

객체마다 다른 값을 가지는 인스턴스 필드를 이용하거나 건드린다면 인스턴스 메소드로, 인스턴스 필드와 무관하게 파라미터 등을 이용하여 실행한다면 정적 메소드로 선언하는 것이 좋다.

public class Phone {
	
    String company;
    
    // static field
    static int count = 0;	// 초기값을 줘도 된다.
    
	String getCompany() { ... }
    
    // static method
    static int getNumber() { ... }
    
}

정적 멤버는 클래스에 고정된 멤버이기 때문에, 클래스 로더에 의해 클래스 바이트 코드를 메소드 영역에 올려놓을 때 함께 올라간다. 따라서 객체 생성 없이 사용할 수 있다.

System.out.println(Phone.count);
System.out.println(Phone.getCount());

정적 초기화 블록

 

정적 필드는 필드 선언을 하면서 초기화를 해도 되고 안해도 된다. 그러나 초기화를 하지 않고, 계산이 필요하거나 시간 정보를 받는 등 상황에 따라 초기화를 해야 하는 경우가 있다. 보통 인스턴스 필드는 생성자를 통해 초기화를 하지만, 정적 필드는 객체 생성과 무관하게 메모리로 로드되기 때문에 생성자에서 정적 필드의 초기화를 할 수 없다. 정적 필드의 초기화는 정적 블록(static block)에서 실행된다.

 

public class DoorLock {
	
    static int masterKey;
    
    static {
    	masterKey = 0000000000;
    }
}

정적 블록은 클래스 내부에 여러 개가 선언되면 선언된 순서대로 실행된다.


정적 메소드와 블록 사용 시 제한사항

정적 메소드와 블록은 객체가 없어도 실행되므로, 객체에 종속적인 인스턴스 필드를 사용할 수 없다. 아래 코드처럼 정적 메소드 setCompany() 내부에서 인스턴스 필드인 company를 사용하려고 하면, static context에서 Phone.this를 참조할 수 없다는 에러 메시지를 띄운다.

 

정적 메소드에서 인스턴스 멤버를 사용하려면 객체를 생성한 뒤 참조 변수로 접근해야 한다.

 

'개발 > Java' 카테고리의 다른 글

[Java] 싱글톤 (Singleton)  (0) 2022.03.27
[Java] Lambda Expression(람다식) - 1  (0) 2022.03.21
[Java] JVM의 메모리 구조  (0) 2022.03.09
[Java] @Annotation에 대해서 알아보자  (2) 2021.12.01
댓글