목차
- 클래스에서의 변수
1-1. 전역변수(클래스변수, 인스턴스변수)
1-2. 지역변수 - 변수별 초기화 순서
1. 클래스에서의 변수
- 클래스에서의 변수는 크게 전역변수-지역변수로 나뉜다.
class { 전역변수
method() { 지역변수 }
}
변수 | 생성시기 | 소멸시기 |
클래스변수 | 프로그램 시작 시 static | 프로그램 종료 시 |
멤버변수 (인스턴스변수) |
인스턴스 생성 시 heap | 참조하지 않을 시 (GC 소관) |
지역변수 | 메소드 호출 시 | 메소드 종료 시 |
1-1. 전역변수
public class GlobalVariable {
static클래스변수
인스턴스변수==멤버변수
}
- 클래스 영역에 작성하는 변수를 필드라고 한다.
- 필드 == 멤버변수(클래스가 가지는 멤버라는 의미) == 전역변수(클래스 전역에서 사용할 수 있는 변수라는 의미)
A. 클래스변수 *static field*
private static int staticNum;
- static 키워드를 가지고 필드에 선언하는 변수를 말한다.
- static 정적 메모리 영역에 생성된다.
B. 멤버변수(인스턴스변수) *non-static field*
private int globalNum;
- 인스턴스 생성 시점에 사용 가능한 변수라는 의미이다.
static 키워드 없이필드에 선언한다.- heap 동적 메모리 영역에 생성된다.
- 더 이상 참조하지 않을 때 가비지 컬렉터(GC, garbage collector)가 삭제시킨다.
public class KindsOfVariable {
private int globalNum;
private static int staticNum;
public void testMethodA(int num) {
int localNum;
System.out.println(num); //매개변수
// System.out.println(localNum); //지역변수
System.out.println(globalNum);
System.out.println(staticNum);
}
public void testMethodB() {
// System.out.println(localNum);
System.out.println(globalNum);
System.out.println(staticNum);
}
}
1-2. 지역변수
public void methodA(매개변수) {
지역변수
}
- 메소드 영역에서 작성하는 변수를 지역변수라고 한다.
- 메소드, 생성자, 초기화 블럭 내부에서 선언하는 변수이다. 지역변수는 해당 지역(블럭 내)에서만 사용 가능하다.
❗ 지역변수는 선언 외에 다시 사용하기 위해서는 반드시 초기화가 되어야 한다.
int localNum;System.out.println(localNum);컴파일 에러 The local variable localNum may not have been initialized
- 반면, 매개변수는 호출 시 testMethod(10);처럼 값이 담기기 때문에 초기화가 필요하지 않다.
- 여기서 메소드명 옆 소괄호 () 안에 선언하는 변수를 매개변수라고 한다. 따라서 매개변수도 일종의 지역변수이다.
- 지역변수와 매개변수 모두 메소드 호출 시 stack을 할당 받아 stack에 생성된다.
- 메소드는 stack 저장 방식을 따르므로 메소드 호출 시에 생겼다가 사라진다.
stack | heap | static |
testMethod (num, localNum) main 메소드 |
해당사항 없음 | 해당사항 없음 |
2. 변수별 초기화 순서
2-1. 전역변수 초기화 순서
- 앞서 static 필드가 클래스변수, non-static 필드가 인스턴스변수이며, 이들은 전역변수라고 정리했다.
- 클래스 변수와 인스턴스 변수는 각각 아래와 같은 초기화 순서를 따른다.
❗ 최종적으로는 생성자를 통한 코드가 유효하게 된다.
클래스변수 | ||||
JVM기본값 | 명시적초기값 | 정적초기화블럭 | 인스턴스초기화블럭 | 생성자 |
인스턴스변수 | ||||
JVM기본값 | 명시적초기값 | 인스턴스초기화블럭 | 생성자 |
A. JVM 기본값
private int num;
private static int num2;
- 이렇게 선언만 하면 JVM 기본값이 heap 영역에 할당된다.
B. 명시적 초기값
private int num=10;
private static int num2=10;
- 명시적으로 초기값을 작성한 경우는 명시된 값을 담는다.
C. 정적 초기화 블럭 *static field*
static {
초기화 내용 작성
}
- 클래스가 로드될 때 딱 한 번 동작한다.
- 정적 필드==static field==클래스 변수를 초기화한다.
- 인스턴스 변수를 초기화하지 못한다. 정적 초기화 블럭은 프로그램 시작 시에만 다녀가므로, 프로그램 동작 중 생겨나는 인스턴스 변수에 대해서는 작동할 수 없는 것이다.
private String name = "갤럭시";
private int price = 1000000;
private static String brand = "삼송";
static {
name = "아이뽕";인스턴스 변수이기 때문에 초기화되지 못한다.
price = 1000000;인스턴스 변수이기 때문에 초기화되지 못한다.
brand = "사과";
}
- 이처럼 인스턴스 변수를 static 초기화 블럭 내부에 작성할 경우 컴파일 에러가 발생한다: Cannot make a static reference to the non-static field name
D. 인스턴스 초기화 블럭
{
초기화 내용 작성
}
E. 생성자
Product.class
public Product() {
}
Application.class
Product productA = new Product();
System.out.println(product.getInformation());
- 기본 생성자일 때는 인스턴스 초기화 블럭에서 선언한 값이 최종 데이터가 된다.
Product.class
public Product(String name, int price, String brand) {
this.name = name;
this.price = price;
Product.brand = brand;
}
Application.class
Product productB = new Product("대륙폰", 300000, "샤땡땡");
System.out.println(productB.getInformation());
- 매개변수 있는 생성자일 때는 매개변수 있는 생성자에서 지정한 값이 최종이다.
- 보편적으로 많이 사용하는 초기화 방법은 생성자를 통한 초기화이다.
- 특수한 경우 명시적으로 부여하거나 테스트를 위해 초기화 블럭을 사용해 볼 수 있다.
✅ 클래스에서 사용되는 변수의 종류별 특징을 이해할 수 있다.
✅ 초기화블럭에 대해 이해할 수 있다.
'Java' 카테고리의 다른 글
[JAVA/수업 과제 practice] 객체배열 Lv. 1~2 (0) | 2022.01.03 |
---|---|
[JAVA] 7. 객체배열 (0) | 2022.01.03 |
[JAVA/수업 과제 practice] 배열 | 다차원 배열 Lv. 3~4 (0) | 2022.01.02 |
[자바의 정석] Ch 5. 배열 예제 응용 학습 (0) | 2022.01.02 |
[자바의 정석] Ch 5. 배열 연습문제 풀이 (0) | 2022.01.01 |