개요
자바는 기존에 다루었던 내용 처럼 우선 타입에 따른 분류를 할 수 있다.
그 외에 배열, 문자열, 객체 등 가변적으로 크기가 변할 수 있는 변수가 존재한다.
또한 선언 위치에 따라 분류를 할 수 있다.
멤버 변수 (필드, 인스턴스 변수)
클래스 블록 안에서 메소드 밖에 선언된 변수로 객체(인스턴스) 생성 후 사용할 수 있다.
생성된 각 객체마다 독립적인 값을 가진다.
초기화하지 않으면 기본값으로 초기화가 되며, 접근 제한자(private, protected, public)를 사용할 수 있다.
해당 변수들은 힙(Heap) 메모리에 저장된다.
class Person {
// 멤버 변수 (인스턴스 변수)
String name;
int age;
public void introduce() {
System.out.println("이름: " + name + ", 나이: " + age);
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.introduce();
}
}
인스턴스 초기화 후 값을 할당하지 않아 String의 기본값 null과 int의 기본값 0이 출력되었다.
클래스 변수 (정적 변수, static 변수)
static 키워드를 사용해 클래스에 속하는 변수로, 모든 인스턴스가 공유한다.
객체와 무관하게 클래스 로딩 시점에 메모리(Method 영역)에 할당된다.
클래스명으로 직접 접근할 수 있고, 모든 객체가 같은 메모리를 참조한다.
마찬가지로 초기화하지 않으면 기본값으로 초기화된다.
class Counter {
static int count = 0; // 클래스 변수 (공유 변수)
public Counter() {
count++; // 객체 생성 시마다 증가
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
System.out.println(counter.count);
Counter.count += 5;
Counter counter2 = new Counter();
System.out.println(counter2.count);
}
}
- Counter클래스의 인스턴스 counter를 생성하였다.
- 생성자 함수 Counter()을 통해 정적변수 count의 값이 1만큼 증가하였다.
- counter2.count의 값을 출력하면 1인 것을 알 수 있다.
- Counter.count += 5를 통해 해당 클래스 변수에 직접적으로 5만큼 값을 증가시켰다.
- Counter클래스의 인스턴스 counter2를 생성하였다.
- 생성자 함수 Counter()을 통해 정적변수 count의 값이 1만큼 증가하였다.
- counter2.count의 값을 출력하면 7인 것을 알 수 있다.
지역 변수 (로컬 변수)
메소드, 생성자, 블록 안에서 선언된 변수이다.
메소드가 호출될 때 생성되고, 종료되면 사라진다.
초기화되지 않은 상태로 사용할 수 없다.
스택(Stack) 메모리에 저장되며, 초기화되지 않으면 컴파일 에러가 발생한다.
접근 제한자를 사용 할 수 없다.
class Calculator {
public int add(int a, int b) { // a, b는 지역 변수
int sum = a + b; // sum도 지역 변수
return sum;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(10, 20));
}
}
Calculator 클래스의 인스턴스 calc를 통해 클래스 내부 메서드인 add를 실행하였다.
매개변수로 전달받은 a, b와 sum은 모두 지역 변수로 메서드 내부에서 존재한다.
해당 변수들은 모두 스택 메모리에 할당되며, 메서드가 종료된 시점에 할당이 해제된다.
매개변수 (파라미터)
메소드 호출 시 전달되는 값을 받는 변수, 메소드 선언부에서 괄호 안에 정의된다.
메소드가 호출될 때만 생성되고, 호출이 종료되면 사라진다.
값을 전달(복사)받아 사용된다.
정리
📌 요약 – 변수 분류
변수 종류 | 선언 위치 | 메모리 영역 | 초기화 상태 | 생애 주기 | 특징 |
멤버 변수 | 클래스 내, 메소드 밖 | 힙(Heap) | 기본값 | 객체가 존재하는 동안 | 객체마다 독립적 |
클래스 변수 | static으로 선언된 변수 | 메소드(Method) 영역 | 기본값 | 클래스 로딩부터 JVM 종료까지 | 모든 객체가 공유 |
지역 변수 | 메소드, 생성자, 블록 내 | 스택(Stack) | 초기화 필요 | 메소드 실행 중에만 존재 | 초기화 필수 |
매개변수 | 메소드 괄호 안 | 스택(Stack) | 호출 시 값 복사 | 메소드 호출 중에만 존재 | 값 복사로 전달 |
🎯 정리
- 객체의 상태를 저장하려면 멤버 변수(인스턴스 변수)를 사용
- 공유 데이터는 클래스 변수(static 변수)로 관리
- 메소드 내부에서 일시적으로 사용하는 값은 지역 변수로 선언
- 메소드 호출 시 값을 전달할 때는 매개변수(파라미터)를 사용
'웹(WEB) > 자바(JAVA)' 카테고리의 다른 글
[Java] 자바 생성자, this (1) | 2024.12.28 |
---|---|
[Java] 자바 메서드 (0) | 2024.12.28 |
[Java] 자바 JVM 메모리 구조 (1) | 2024.12.28 |
[Java] 자바 배열 (0) | 2024.12.27 |
[Java] 자바 반복문 for, while, do while (0) | 2024.12.27 |