클래스의 필드, 메소드, 초기화 블럭

JUNG GYUWON·2023년 9월 27일
0

Java

목록 보기
5/18

필드

필드의 구분

  • 클래스 변수 (static variable)
  • 인스턴스 변수 (instance variable)
  • 지역변수 (local variable)
class Car {

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

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

클래스 변수와 인스턴스 변수는 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화가 되지만 지역변수는 사용하기 전에 초기화를 하지 않으면 컴파일러가 오류를 발생시킨다

클래스 변수

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

생성시기: 클래스가 메모리에 올라갈 때 생성됨
소멸시기: 프로그램이 종료될 때 소멸됨
저장영역: 메소드영역
사용방법: 클래스이름.변수이름

인스턴스 변수

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

생성시기: 인스턴스가 생성될 때
소멸시기: 인스턴스가 소멸할 때
저장영역: 힙 영역
사용방법: 인스턴스이름.변수이름

지역변수

메소드, 생성자, 초기화 블록 내부에 위치한 변수

생성시기: 블록내에서 변수의 선언문이 실행될때
소멸시기: 블록을 벗어날 때
저장영역: 스택영역
사용방법: 변수이름


메소드

메소드의 구분

  • 클래스 메소드 (static method)
  • 인스턴스 메소드 (instance method)
class Car {

    boolean door;                       // 인스턴스 변수
    void openDoor() {                   // 인스턴스 메소드
        door = true;
    }

    static void toggleDoor(boolean d) { // 클래스 메소드
        return !d;
    }
}

클래스 메소드

static 키워드를 가지는 메소드

클래스 메소드는 인스턴스를 생성하지 않고 사용할 수 있기 때문에 내부에서 인스턴스 변수를 사용할 수 없다

생성시기: 클래스가 메모리에 올라갈 때 생성됨
저장영역: 메소드영역
사용방법: 클래스이름.메소드이름

인스턴스 메소드

static 키워드를 가지지 않는 메소드

생성시기: 객체가 생성될 때 생성됨
저장영역: 힙 영역
사용방법: 인스턴스이름.메소드이름


초기화 블럭

초기화를 하는 방법에는 아래와 같이 3가지 방법이 있다
1. 명시적 초기화
2. 생성자를 이용한 초기화
3. 초기화 블록을 이용한 초기화

명시적 초기화와 생성자를 이용한 초기화는 다 알고 초기화 블록에 대해서 알아보자

초기화 블럭

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

초기화 블럭은 인스턴스가 생성될 때 생성자보다 먼저 호출되며 static 유무에 따라 아래와 같이 구별된다

  • 인스턴스 초기화 블럭
  • 클래스 초기화 블럭

인스턴스 초기화 블럭

생성자와 비슷해서 거의 사용하지 않는다

클래스 초기화 블럭

클래스 초기화 블럭은 인스턴스 초기화 블럭에 static 키워드를 추가하여 정의한다

클래스 초기화 블럭도 역시 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행된다

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

class InitBlock {

    static int classVar; // 클래스 변수
    int instanceVar;     // 인스턴스 변수

    static { // 클래스 초기화 블럭
        classVar = 10;
    }
}

public class Member04 {
    public static void main(String[] args) {
        System.out.println(InitBlock.classVar); // 클래스 변수에 접근
    }
}

이렇게 초기화를 할 수 있는 방법은 여러가지이고 결국 마지막에 초기화 한 값만 남는다
그러면 초기화 순서가 어떻게 되는지 중요하겠네?

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

profile
반가워요😎

0개의 댓글