본문 바로가기

Java

java - Scope

Scope

 

< Separation of fields >

클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미합니다.

클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분됩니다.

 

1. 클래스 변수(static variable)

2. 인스턴스 변수(instance variable)

3. 지역 변수(local variable)

class Car {
    static int modelOutput; // 클래스 변수
    String modelName;       // 인스턴스 변수

    void method() {
 	     int something = 10; // 지역 변수
    }
}

클래스 변수와 인스턴스 변수는 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화될 것입니다.

하지만 지역 변수는 사용하기 전에 초기화하지 않으면, 자바 컴파일러가 오류를 발생시킵니다.

 

자바에서 클래스 변수와 인스턴스 변수의 초깃값은 다음과 같습니다.

type of variable initial value
char '\u0000'
byte, short, int 0
long 0L
float 0.0F
double 0.0 or 0.0D
boolean false
array, instance null

 

< class variable, instance variable >

클래스 영역에 위치한 변수 중에서 static 키워드를 가지는 변수를 클래스 변수(static variable)라고 합니다.

그리고 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않는 변수는 인스턴스 변수(instance variable)라고 합니다.

또한, 메소드나 생성자, 초기화 블록 내에 위치한 변수를 지역 변수(local variable)라고 합니다.

이렇게 선언된 위치에 따라 구분되는 변수는 생성 및 소멸 시기, 저장되는 메모리 공간과 사용 방법까지도 서로 다릅니다.

variable time of creation Extiction time storage memory How to use
class variable when a class is
loaded into memory
program exit method area class name.variable name
instance variable when the instance is 
created
instance is
destroyed
heap area instance name.variable name
local variable statement of a variable within block is executed leaving a block stack area variable name

클래스 변수는 인스턴스를 생성하지 않고도 바로 사용할 수 있습니다.

따라서 이러한 클래스 변수를 공유 변수(shared variable)라고도 합니다.

 

이러한 클래스 변수는 해당 클래스의 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용됩니다.

반면에 인스턴스 변수는 인스턴스마다 가져야 하는 고유한 값을 유지하기 위해 사용됩니다.

 

< example >

class Field {
    static int classVar = 10; // 클래스 변수 선언
    int instanceVar = 20;     // 인스턴스 변수 선언
}

public class Member01 {

    public static void main(String[] args) {

        int var = 30;                   // 지역 변수 선언
        
        System.out.println(var + "\n"); // 지역 변수 참조 30
        
        Field myField1 = new Field();   // 인스턴스 생성
        Field myField2 = new Field();   // 인스턴스 생성

        System.out.println(Field.classVar); // 클래스 변수 참조 10
        System.out.println(myField1.classVar); //10
        System.out.println(myField2.classVar + "\n"); //10

        myField1.classVar = 100;            // 클래스 변수의 값을 변경

        System.out.println(Field.classVar); // 클래스 변수 참조  //100
        System.out.println(myField1.classVar); //100
        System.out.println(myField2.classVar + "\n"); //100

        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조 //20
        System.out.println(myField2.instanceVar + "\n"); //20

        myField1.instanceVar = 200;               // 인스턴스 변수의 값을 변경

        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조 //200
        System.out.println(myField2.instanceVar); //20
    }
}

'Java' 카테고리의 다른 글

java - overriding  (0) 2023.03.13
java - overloading  (0) 2023.03.13
java - Parameters  (0) 2023.03.13
java - Constructors  (0) 2023.03.13
java - Methods  (1) 2023.03.13