개발 일지/Java

[Java] 필드(Field)

미숫가루설탕많이 2022. 12. 27. 22:00

 필드(field)는 '클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.

 

 자바에서 변수는 크게 클래스 변수(class variable, cv), 인스턴스 변수(instance variable, iv) 그리고 지역 변수(local variable, lv)라는 세 가지로 구분된다.

 

 여기서 필드는 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분할 수 있다. static 키워드가 함께 선언된 것은 클래스 변수, 그렇지 않은 것은 인스턴스 변수이다. 그리고 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역 변수라고 한다.

 

class Example { // 클래스 영역
    int instanceVariable;   // 인스턴스 변수
    static int classVariable;   // 클래스 변수(static 변수, 공유변수)
    
    void method() { // 메서드 영역
        int localVariable = 0;  // 지역 변수, {}블록 안에서만 유효
        
    }
}

 

 

 

 

인스턴스 변수(instance variable, iv)


 인스턴스 변수는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 'new 생성자()'를 통해 인스턴스가 생성될 때 만들어진다. 인스턴스 변수는 인스턴스가 생성될 때 만들어지므로 인스턴스 변수의 값을 읽어오거나 저장하려면 인스턴스를 먼저 생성해야 한다.

 

 클래스를 통해 만들어진 인스턴스는 힙 메모리의 독립적인 공간에 저장되고, 동일한 클래스로부터 생성되었지만 객체의 고유한 개별성을 가진다. 따라서, 각각의 인스턴스마다 고유의 값을 가져야 할 때는 인스턴스 변수로 선언한다.

 

 

 

 

클래스 변수(class variable, cv)


 클래스 변수는 인스턴스 변수에 static 키워드만 붙여주면 된다. 인스턴스 변수는 각각 고유한 저장 공간을 갖지만 클래스 변수는 모든 인스턴스가 공통된 저장 공간을 공유한다. 따라서, 한 클래스로부터 생성되는 모든 인스턴스들이 특정한 값을 공유해야 하는 경우에 클래스 변수를 선언한다.

 

 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 '클래스명.클래스변수명'을 통해 사용이 가능하다. 상단 코드를 예로 들면, 'Example.classVariable'로 클래스 변수를 사용할 수 있다. 이것은 메모리 구조에서 메서드처럼 클래스 변수 또한 클래스 영역에 저장되어 그 값을 공유하기 때문에 가능한 것이다.

 

 클래스가 로딩될 때 생성되어 종료될 때까지 유지되는 클래스 변수는 public 키워드를 붙이면 같은 프로그램 내에서 어디서든 접근할 수 있는 전역 변수가 된다.

 

 

 

 

지역 변수(local variable, lv)


 지역 변수는 메서드 내에서 선언되며 메서드 내에서만 사용할 수 있는 변수이다.

 

 멤버 변수(인스턴스 변수, 클래스 변수)와는 다르게 지역 변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없다. 힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되지 않는 반면, 스택 메모리에 저장되는 지역 변수는 한동안 사용되지 않는 경우 가상 머신에 의해 자동으로 삭제된다.

 

 

 

 

초기값


 필드 변수와 지역 변수의 주요한 한 가지 차이점은 초기값에 있다.

 

 지역 변수는 직접 초기화하지 않으면 값을 출력할 때 오류가 발생하는 반면, 필드 변수는 직접적으로 초기화를 실행하지 않더라도 강제로 초기화가 이뤄진다.

 

 이것 또한 메모리의 저장 위치와 긴밀한 연관성을 갖고 있는데, 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언 시 반드시 초기화를 실행해줘야 한다.

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

[Java] 메서드(Method)  (0) 2022.12.27
[Java] static 키워드  (0) 2022.12.27
[Java] 객체(Object)  (0) 2022.12.27
[Java] 클래스(Class)  (0) 2022.12.27
[Java] 객체 지향 프로그래밍(OOP)  (0) 2022.12.27