자바에서 지역 변수, 인스턴스 필드(변수), 정적 필드(변수)는 모두 변수이지만,
각각의 선언 위치, 저장 방식, 수명 및 사용 목적이 다르다.
이들의 차이점과 사용하는 경우를 정확히 이해하는 것은 자바 프로그래밍에서 중요한 개념이다.
지역 변수(Local Variable)
- 선언 위치: 메서드, 생성자 또는 블록 내에서 선언된다.
- 저장 위치: 스택(Stack) 영역에 저장된다.
- 수명: 메서드나 블록이 실행될 때 생성되고, 메서드나 블록이 종료되면 메모리에서 사라진다.
- 기본값: 지역 변수는 자동으로 초기화되지 않기 때문에 값을 명시적으로 할당해야 한다. 할당하지 않고 사용하면 컴파일 에러가 발생한다.
- 접근 방법: 선언된 메서드나 블록 내에서만 접근할 수 있다.
사용 목적
- 지역 변수는 특정 메서드나 블록 내에서만 필요한 일시적인 데이터를 저장할 때 사용된다.
- 이 변수는 메서드가 호출될 때마다 새로 생성되고, 메서드가 끝나면 소멸된다.
코드 예시)
public class Example {
public void calculate(int a, int b) {
int sum = a + b; // 지역 변수
System.out.println("합계: " + sum);
}
}
- sum은 지역 변수로, 메서드가 호출될 때 생성되고, 메서드가 종료되면 소멸된다.
인스턴스 필드(변수, Instance Field)
- 선언 위치: 클래스 내부에 선언되며, static 키워드 없이 선언된 필드이다.
- 저장 위치: 힙(Heap) 영역에 저장된다. 객체가 생성될 때 그 객체의 필드로 힙에 할당된다.
- 수명: 객체가 생성될 때 함께 생성되고, 객체가 더 이상 사용되지 않으면 가비지 컬렉터에 의해 제거된다.
- 기본값: 인스턴스 필드는 기본형 타입의 경우 자동으로 기본값으로 초기화된다. 예를 들어, int는 0, boolean은 false, 참조형은 null로 초기화된다.
- 접근 방법: 객체를 통해 접근할 수 있다. 즉, 필드는 특정 객체에 속하므로, 객체가 필요하다.
사용 목적
- 인스턴스 필드는 각 객체마다 고유한 상태를 유지해야 할 때 사용된다.
- 객체마다 독립적인 값을 가지며, 다른 객체와 값을 공유하지 않는다.
코드 예시)
public class Car {
int speed; // 인스턴스 필드
public Car(int speed) {
this.speed = speed;
}
public void displaySpeed() {
System.out.println("현재 속도: " + speed);
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car(100); // car1의 speed는 100
Car car2 = new Car(150); // car2의 speed는 150
car1.displaySpeed(); // 출력: 현재 속도: 100
car2.displaySpeed(); // 출력: 현재 속도: 150
}
}
- speed는 인스턴스 필드로, 각 Car 객체마다 고유의 speed 값을 가진다.
- car1과 car2는 각각 독립적인 speed 값을 가지므로 서로 간섭하지 않는다.
정적 필드(변수, Static Field)
- 선언 위치: 클래스 내부에 선언되며, static 키워드를 사용하여 선언된 필드이다.
- 저장 위치: 메소드(Method) 영역에 저장된다. 클래스가 메모리에 로드될 때 한 번만 생성된다.
- 수명: 프로그램이 실행되는 동안 클래스가 로드되면 생성되고, JVM이 종료될 때까지 유지된다.
- 기본값: 인스턴스 필드처럼 기본형 타입의 경우 자동으로 기본값으로 초기화된다.
- 접근 방법: 클래스명으로 직접 접근할 수 있으며, 객체를 통해서도 접근할 수 있다. 하지만 객체를 통해 접근하는 것은 일반적으로 권장되지 않는다.
사용 목적
- 정적 필드는 모든 객체가 공유해야 할 데이터를 저장할 때 사용된다.
- 클래스 수준에서 관리되는 필드이기 때문에 객체 간에 데이터를 공유하거나, 객체를 생성하지 않고도 사용하고 싶은 데이터가 있을 때 유용하다.
코드 예시)
public class Car {
static int totalCars; // 정적 필드 (모든 객체가 공유)
public Car() {
totalCars++; // 자동차 객체가 생성될 때마다 증가
}
public static void displayTotalCars() {
System.out.println("총 자동차 수: " + totalCars);
}
}
public class Main {
public static void main(String[] args) {
Car car1 = new Car();
Car car2 = new Car();
Car.displayTotalCars(); // 출력: 총 자동차 수: 2
}
}
- totalCars는 정적 필드로, 모든 Car 객체가 이 필드를 공유한다.
- car1과 car2 객체가 생성될 때마다 totalCars 값이 증가하며, 클래스 이름을 통해 직접 접근할 수 있다.
요약 비교
특징 | 지역 변수(Local Variable) | 인스턴스 필드(Instance Field) | 정적 필드(Static Field) |
선언 위치 | 메서드, 생성자 또는 블록 내부 | 클래스 내부, static 없이 선언 | 클래스 내부, static 키워드 사용 |
저장 위치 | 스택(Stack) | 힙(Heap) | 메소드(Method) 영역 |
수명 | 메서드나 블록이 실행되는 동안 | 객체가 존재하는 동안 | 클래스가 메모리에 있는 동안 |
기본값 초기화 | 자동 초기화되지 않음 | 자동으로 기본값으로 초기화 | 자동으로 기본값으로 초기화 |
접근 방법 | 메서드나 블록 내에서만 접근 가능 | 객체를 통해 접근 | 클래스명으로 직접 접근 가능 |
사용 목적 | 메서드 내에서 일시적인 데이터 저장 | 객체마다 고유한 상태 저장 | 모든 객체가 공유하는 값 관리 |
공유 여부 | 각 호출마다 독립적 | 각 호출마다 독립적 | 모든 객체가 동일한 필드를 공유 |
정리
- 지역 변수
- 특정 메서드나 블록에서만 필요한 임시 데이터를 저장할 때 사용된다.
- 메서드가 호출될 때마다 새롭게 생성되고, 종료되면 사라진다.
- 인스턴스 필드
- 각 객체가 고유한 상태를 가질 필요가 있을 때 사용된다.
- 예를 들어, 자동차 객체의 속도나 색상처럼 객체별로 다른 값을 저장해야 할 때 적합하다.
- 정적 필드
- 모든 객체가 공유해야 하는 정보나 클래스 자체에서 관리해야 하는 데이터를 저장할 때 사용된다.
- 예를 들어, 전체 자동차 생산 대수처럼 전역적인 데이터를 관리할 때 유용하다.
'Java' 카테고리의 다른 글
[Java] JVM 메모리 구조 탐구 (0) | 2024.10.09 |
---|---|
[Java] Jshell 을 아시나요? (1) | 2024.09.26 |
[Java 복습] 타입 매개변수 제한 (0) | 2024.05.10 |
[Java] 지네릭 타입의 형변환 (0) | 2024.05.10 |
[Java] 와일드 카드, 지네릭 메서드 (0) | 2024.05.10 |