늦은 프로그래밍 이야기

필드, 메소드의 구분 / Block / Scope 본문

내일배움캠프/Java 심화

필드, 메소드의 구분 / Block / Scope

한정규 2022. 11. 30. 19:17

필드의 구분

 - 클래스에 포함된 변수(Variable)를 의미.

 - 선언된 위치에 따라 다음과 같이 구분.

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

 - 클래스 변수와 인스턴스 변수는 초기화를 하지 않아도 기본값이 존재.

 - 지역 변수는 초기화하지 않으면 사용할 수 없다.

변수의 타입 기본값
char '\u0000'
byte, short, int 0
long 0L
float 0.0F
double 0.0 또는 0.0D
boolean false
배열, 인스턴스 등 null

클래스 변수 (static variable)

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

 - 생성시기 : 클래스가 메모리에 올라갈 때

 - 소멸시기 : 프로그램이 종료될 때

 - 저장 메모리 : Method Area

 - 사용방법 : 클래스이름.변수이름

 

인스턴스 변수 (instance variable)

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

 - 생성시기 : 인스턴스가 생성될 때

 - 소멸시기 : 인스턴스가 소멸할 때

 - 저장 메모리 : Heap Area

 - 사용방법 : 인스턴스이름.변수이름

 

지역변수 (local variable)

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

 - 생성시기 : 블록 내에서 변수의 선언문이 실행될 때

 - 소멸시기 : 블록을 벗어날 때

 - 저장 메모리 : Stack Area

 - 사용방법 : 변수이름


메소드의 구분

 - 어떠한 작업을 수행하기 위한 명령문의 집합

 - static 키워드의 유무에 따라 다음과 같이 구분.

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

클래스 메소드 (static method)

 - 클래스 변수와 마찬가지로 인스턴스를 생성하지 않고도 바로 사용가능.

 - 클래스 메소드는 메소드 내부에서 인스턴스 변수를 사용할 수 없음.

 - 메소드 내부에서 인스턴스 변수나 인스턴스 메소드를 사용하지 않는 메소드를 클래스 메소드로 정의.


Block

필드의 초기화

 - 필드는 초기화하지 않아도 변수의 타입에 맞는 기본값으로 자동 초기화.

 - 다음과 같은 방법들로 초기화

  • 명시적 초기화
  • 생성자를 이용한 초기화
  • 초기화 블록을 이용한 초기화

 

초기화 블록 (initialization block)

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

 - 생성자보다 먼저 호출되며, static 키워드의 유무에 따라 다음과 같이 구분

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

 

인스턴스 초기화 블록

 - 중괄호{}만을 사용하여 정의.

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

 - 인스턴스 초기화 블록이 생성자보다 먼저 실행.

 

클래스 초기화 블록

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

 - 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행.

 - 클래스 변수의 초기화를 수행할 때 사용.

 

필드의 초기화 순서

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

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


변수의 Scope, Static

Scope

 - 프로그램 상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.

 - 변수가 선언된 블럭이 그 변수의 사용범위.

public class VariableScope {
    int globalScope = 10;               // 인스턴스 변수
    
    public void scopeTest(int value) {  // 매개변수
    	int localscope = 10;            // 지역변수
        System.out.println(globalScope);
        System.out.println(localScope);
        System.out.println(value);
    }
    
    public static void main(String[] args) {
    	System.out.println(globalScope);  // 에러
        System.out.println(localScope);   // 에러
        System.out.println(value);        // 에러
}

 - 클래스 변수 globalScope의 사용 범위는 클래스 전체이다.

 - 매개변수 int value는 메소드 선언부에 존재하므로 사용 범위는 해당 메소드 블럭 내이다.

 - 메소드 블럭 내의 localScope의 사용 범위는 메소드 블럭 내이다.

 

Static

 - static 메소드에서는 static이 붙지 않은 필드를 사용할 수 없다.

 - static 필드는 static 메소드, static이 붙지 않은 메소드 둘 다 사용가능.

public class VariableScopeExam {
    int globalScope = 10; 
    static int staticVal = 7;

    public void scopeTest(int value){
        int localScope = 20;        
    }

    public static void main(String[] args) {
        System.out.println(staticVal);      //사용가능 
        
        ValableScopeExam v1 = new ValableScopeExam();
        ValableScopeExam v2 = new ValableScopeExam();
        v1.golbalScope = 20;
        v2.golbalScope = 30; 

        System.out.println(v1.golbalScope);  //20 이 출력된다. 
        System.out.println(v2.golbalScope);  //30이 출력된다. 

        v1.staticVal = 10;
        v2.staticVal = 20; 

        System.out.println(v1.statVal);  //20 이 출력된다. 
        System.out.println(v2.statVal);  //20 이 출력된다. 
        
        System.out.println(VariableScopeExam.staticVal);
        // 클래스 변수는 클래스 이름을 직접 사용하는 것이 가능.
    }
}

 - static하지 않은 필드를 static 메소드에서 호출할 때는 인스턴스를 생성.

 - static 필드의 값은 인스턴스를 호출하지 않아도 사용가능.

 - static 필드의 값을 저장할 수 있는 공간이 하나 밖에 없으므로 마지막에 입력한 20이 출력된다.


'내일배움캠프 > Java 심화' 카테고리의 다른 글

Thread  (0) 2022.12.02
추상클래스 vs 인터페이스  (0) 2022.12.01
Mutable, Immutable  (0) 2022.12.01
Wrapper 클래스  (0) 2022.11.30
JVM 구조  (0) 2022.11.30
Comments