Link Search Menu Expand Document

Class Field

Table of contents

  1. Field Basic
    1. What is Field?
    2. Static Fields
    3. Instance Fields
    4. Local variable
    5. Field Features
  2. Field Initialize
    1. Static & Instance Initialize
    2. How to Initialize Fields
    3. Initialization block
    4. Initialization Order

Field Basic

What is Field?

클래스에 포함된 변수(variable)를 의미

▸ 필드는 객체의 고유데이터, 부품객체, 상태정보를 저장하는 곳

▸ 선언형태는 변수와 비슷하지만 필드를 변수라고 부르지 않음

▸ 변수는 생성자와 메서드에서만 사용되고 생성자와 메서드가 실행이 종료가 되면 자동으로 소멸

▸ 선언된 위치에 따라 구분됨

  1. 클래스 변수(static variable)

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

  3. 지역 변수(local variable)

예제

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

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

}

Static Fields

클래스 변수(static variable) : 클래스 영역에 위치한 변수 중에서 static 키워드를 가지는 변수

▸ 인스턴스를 생성하지 않고도 바로 사용 가능, 공유 변수(shared variable)라고도 함

▸ 해당 클래스의 모든 인스턴스가 공유해야 하는 값을 유지하기 위해 사용

Instance Fields

인스턴스 변수(instance variable) : 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않는 변수

▸ 인스턴스마다 가져야 하는 고유한 값을 유지하기 위해 사용

Local variable

지역 변수(local variable) : 메소드나 생성자, 초기화 블록 내에 위치한 변수

Field Features

변수생성 시기소멸 시기저장 메모리사용 방법
클래스 변수클래스가 메모리에 올라갈 때프로그램이 종료될 때메소드 영역클래스이름.변수이름
인스턴스 변수인스턴스가 생성될 때인스턴스가 소멸할 때힙 영역인스턴스이름.변수이름
지역 변수블록 내에서 변수의 선언문이 실행될 때블록을 벗어날 때스택 영역변수이름

Field Initialize

Static & Instance Initialize

클래스 변수와 인스턴스 변수의 초깃값 표

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

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

★ 따라서 지역 변수와 마찬가지로 적절한 값으로 초기화한 후에 사용하는 것이 좋음

기본 초기값

변수의 타입초깃값
char‘\u0000’
byte, short, int0
long0L
float0.0F
double0.0 또는 0.0D
booleanfalse
배열, 인스턴스 등null

How to Initialize Fields

  1. 명시적 초기화

    지역 변수를 초기화하는 방법과 마찬가지로 필드를 선언과 동시에 초기화

     class Field {
    
         static int classVar = 10; // 클래스 변수의 명시적 초기화
         int instanceVar = 20;     // 인스턴스 변수의 명시적 초기화
    
     }
    
  2. 생성자를 이용한 초기화

    객체의 생성과 동시에 필드를 초기화하는 방법

    생성자를 이용한 초기화는 인스턴스를 생성할 때까지 필드를 초기화할 수 없음

  3. 초기화 블록을 이용한 초기화

    초기화 블록이란 클래스 필드의 초기화만을 담당하는 중괄호({})로 둘러싸인 블록

    생성자보다 먼저 호출되며, static 키워드의 유무에 따라 인스턴트와 클래스로 나뉨

Initialization block

  1. 인스턴스 초기화 블록

    단순히 중괄호({})만을 사용하여 정의

    생성자와 마찬가지로 인스턴스가 생성될 때마다 실행

    하지만 언제나 인스턴스 초기화 블록이 생성자보다 먼저 실행

    생성자와 인스턴트 초기화 블럭은 거의 비슷해서 잘 사용되지 않지만 여러개의 생성자가 있으면 모든 생성자에서 공통으로 사용되는 코드를 작성해서 코드의 중복을 막음

     class Car {
         private String modelName;
         private int modelYear;
    
         { // 인스턴스 초기화 블록
             this.currentSpeed = 0;
         }
     }
    
  2. 클래스 초기화 블록

    인스턴스 초기화 블록에 static 키워드를 추가하여 정의

    클래스 초기화 블록은 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행

    생성자나 인스턴스 초기화 블록으로는 수행할 수 없는 클래스 변수의 초기화를 수행할 때 사용

     class InitBlock {
         static int classVar; // 클래스 변수
         int instanceVar;     // 인스턴스 변수
    
         static { // 클래스 초기화 블록을 이용한 초기화
             classVar = 10;
         }
    
     }
    

Initialization Order

필드의 초기화 순서

여러 번 초기화하면, 제일 마지막으로 초기화한 값이 남음

  1. 클래스 변수 : 기본값 → 명시적 초기화 → 클래스 초기화 블록

  2. 인스턴스 변수 : 기본값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자

예시

class InitBlock {
    static int classVar = 10;         // 클래스 변수의 명시적 초기화
    int instanceVar = 10;             // 인스턴스 변수의 명시적 초기화
    static { classVar = 20; }         // 클래스 초기화 블록을 이용한 초기화
    { instanceVar = 20; }             // 인스턴스 초기화 블록을 이용한 초기화
    InitBlock() { instanceVar = 30; } // 생성자를 이용한 초기화
}

결과값 classVar = 20, instanceVar = 30

이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.