변수(Variable)란
값을 저장하기 위해 이름을 붙인 메모리 공간이다.
Java에서 변수는 단순히 값만 저장하는 게 아니라
에 따라 서로 다른 규칙과 이름을 가진다.
Java의 모든 변수는 아래 3가지 중 하나로 분류된다.
변수
├─ 필드 (Field)
├─ 지역 변수 (Local Variable)
└─ 매개 변수 (Parameter)
class User {
// 인스턴트 필드 선언
public Long id = 1;
private String username; // 초기화 하지 않으면 null
protected String password;
String address;
// 정적(static) 필드 선언
static int count;
}
필드(Field)는 클래스 내부에 존재하며 메서드 밖에서 선언된다.
필드에 선언되는 변수는
접근제어자[public, private, protected, default]를 사용할 수 있다.
클래스 영역에 선언되며 접근제어자 범위 내에서 클래스의 메서드들에서 사용 가능하다.
또한, 필드는 초기화하지 않으면 JVM이 객체 생성 시점에 기본값으로 초기화한다.
인스턴스 필드는 new 연산자를 통해 객체 생성 시 메모리에 생성되며
객체가 소멸할 때 함께 소멸한다.
하지만, static 필드는 클래스 로딩 시 메모리에 생성되며
프로그램 종료 시까지 유지된다.
public void test() {
// 지역 변수 선언
int x = 10;
int y;
}
지역 변수(Local Variable)는 메서드 내부 또는 {} 블록 내부에서 선언된다.
지역 변수를 사용할 때는 다음과 같은 주의 사항이 있다.
지역 변수는 사용하기 전 반드시 초기화를 해야한다.
public void test() {
int x;
// 메서드 밖에서는 지역 변수 접근 불가 → 컴파일 에러
System.out.println(x);
}
접근 제한자 사용 불가
public void test() {
private int x; // 에러 발생
}
메서드, 생성자. 제어문 실행 시 메모리에 생성되고
메서드, 생성자, 제어문이 종료 시 함께 소멸된다.
class User {
// 필드
// 메서드
public void test() {
int x = 1;
}
// 에러 발생
System.out.println(x);
}
void test(int value) {}
매개 변수(Parameter)는 메서드 선언부에 선언하며 메서드 호출 시 값을 전달받는다.
매개 변수는 메서드 호출 시 값이 전달되므로 초기화가 불필요하며
메서드 내부에서만 사용이 가능하다.
매개 변수는 메서드 시그니처(Method Signature)에 포함된다.
메서드 시그니처(Method Signature)
메서드 이름 + 매개변수 타입 목록으로 구성된다.
반환 타입, 접근제어자, static은 포함하지 않는다.
class User {
// 필드 선언
String username;
}
인스턴스 필드(Instance Field)는 new 연산자를 통해 객체가 생성될 때
객체마다 각각 생성되는 변수이다.
주로 "인스턴스 변수"라고도 불린다.
class User {
// 정적 필드 선언
static String company;
}
static 필드는 클래스가 JVM0에 로딩될 때 생성되며
객체 생성과 무관하게 클래스당 하나만 존재하고
해당 클래스의 모든 객체가 static 변수를 공유한다.
static 키워드를 사용하는 정적 필드는 다음 글에서 자세히 다룬다.
멤버(Member)는 클래스를 구성하는 요소 전체를 의미한다.
클래스 멤버
├
├────── 필드
├
├────── 메서드
├
└────── 생성자
즉, 정리하면 다음과 같이 나타낼 수 있다
| 표현 | 의미 |
|---|---|
| 멤버 변수 | 필드 |
| 인스턴스 멤버 | 인스턴스 필드 + 인스턴스 메서드 |
| static 멤버 | static 필드 + static 메서드 |