늦은 프로그래밍 이야기
필드, 메소드의 구분 / Block / Scope 본문
필드의 구분
- 클래스에 포함된 변수(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 |