자바(Java)의 변수 종류 정리
자바의 변수는 크게 다음 4가지로 분류됨:
- 지역 변수 (Local Variable)
- 멤버 변수 (Member Variable)
- 인스턴스 변수 (Instance Variable)
- 클래스 변수 (Class Variable / static 변수)
- 매개변수 (Parameter Variable)
- 상수 (final 변수)
각 변수는 선언 위치, 생명 주기, 메모리 저장 위치에 따라 다르게 동작함.
1. 지역 변수 (Local Variable)
- 메서드 내부, 생성자 내부, 블록 내부에서 선언된 변수임
- 해당 블록이 실행될 때 생성되고, 블록이 종료되면 소멸됨
- 반드시 초기화 후 사용해야 함
- 메서드 호출 시마다 새롭게 생성됨
- 메모리: 스택(stack) 영역에 저장됨
public void printSum() {
int a = 5; // 지역 변수
int b = 10; // 지역 변수
System.out.println(a + b);
}
2. 멤버 변수 (Member Variable)
클래스 블록 내부에 선언되며, 객체나 클래스의 속성(상태) 을 저장함.
2-1. 인스턴스 변수
- static 키워드가 없는 멤버 변수임
- 객체가 생성될 때 함께 생성되며, 객체마다 고유한 값을 가짐
- 클래스의 인스턴스가 사라지면 소멸됨
- 메모리: 힙(heap) 영역에 저장됨
public class Car {
String color; // 인스턴스 변수
}
2-2. 클래스 변수 (static 변수)
- static 키워드가 붙은 멤버 변수
- 클래스 로딩 시 단 한 번 생성되어 모든 인스턴스가 공유함
- 객체 생성 없이도 접근 가능
- 메모리: 메서드 영역(method area) 에 저장됨
public class Car {
static int totalCars = 0; // 클래스 변수
}
3. 매개변수 (Parameter Variable)
- 메서드나 생성자 호출 시 전달받는 값임
- 메서드 호출 시 생성되고, 호출이 끝나면 소멸됨
- 지역 변수처럼 스택(stack) 영역에 저장됨
- 일반적으로 final 키워드를 붙여 변경을 막는 경우도 많음
public void greet(String name) { // name: 매개변수
System.out.println("Hello, " + name);
}
4. 상수 (final 변수)
- final 키워드를 사용하면 값을 한 번만 초기화할 수 있는 변수가 됨
- 불변성을 가지며, 값을 변경하려 하면 컴파일 에러가 발생함
- static final로 선언하면 클래스 전체에서 공유되는 상수가 됨 (관례상 대문자 사용)
public class Config {
static final int MAX_SIZE = 100; // 상수
}
메모리 영역 정리
변수 종류 | 저장 위치 | 생성 시점 | 소멸 시점 |
지역 변수 | 스택 | 메서드 호출 시 | 메서드 종료 시 |
매개 변수 | 스택 | 메서드 호출 시 | 메서드 종료 시 |
인스턴스 변수 | 힙 | 객체 생성 시 | 객체가 GC 될 때 |
클래스 변수 | 메서드 영역 | 클래스 로딩 시 | 클래스 언로드 시 |
주요 차이점 정리
항목 | 지역 변수 | 인스턴스 변수 | 클래스 변수 |
선언 위치 | 메서드, 블록 내부 | 클래스 내부 | 클래스 내부 |
static 여부 | 없음 | 없음 | static 필수 |
메모리 영역 | 스택 | 힙 | 메서드 영역 |
초기화 필요 여부 | 반드시 초기화 필요 | 자동 초기화됨 | 자동 초기화됨 |
공유 여부 | 불가능 | 객체 간 공유 불가 | 모든 인스턴스가 공유 |
실무에서 자주 사용하는 예시
- 설정값 상수: public static final String BASE_URL = "https://api.example.com";
- 객체마다 다른 값: 인스턴스 변수로 name, age 등 선언
- 로그인 상태 유지: static 변수로 전역 세션 상태 관리 (단, 추천되지 않음)
- 임시 연산 변수: 지역 변수로 sum, i, temp 등 선언
출처 : ChatGPT
'BE > Java' 카테고리의 다른 글
중첩, 내부클래스 (2) | 2025.07.21 |
---|---|
LocalDate.parse(입력문자,포맷); (1) | 2025.05.29 |
date.format() (0) | 2025.05.28 |
DateTimeFormatter.ofPattern (0) | 2025.05.27 |
temporalAdjusters (0) | 2025.05.26 |