본문 바로가기

Java

[Java] 지역 변수, 인스턴스 필드, 정적 필드 차이점

자바에서 지역 변수, 인스턴스 필드(변수), 정적 필드(변수)는 모두 변수이지만,

각각의 선언 위치, 저장 방식, 수명사용 목적이 다르다.

이들의 차이점과 사용하는 경우를 정확히 이해하는 것은 자바 프로그래밍에서 중요한 개념이다.

 

지역 변수(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