안녕하세요!😄
이번 글에서는 빠르고 쉽게 JAVA의 각 변수들의 차이를 이해하고 넘어가려고 합니다!
전역변수, 지역변수, 로컬변수, 맴버변수, 클래스 변수, 인스턴스 변수, 매개변수 ... 등
의미는 대강은 알고 있더라도 차이를 설명해보려면 비슷한 개념들이 많아서 참 많이 헷갈리는 것 같습니다.🥹
때문에 이번 기회에 저도 해당 변수들의 개념을 이해하고 확실하게 정리하기 위해 글을 작성하고 넘어가려고 합니다!
전역변수 VS 지역 변수
전역 변수
- 클래스의 모든곳에서 사용가능한 변수 입니다.
- 클래스 내부에 static을 사용하여 생성하여 사용할 수 있습니다.
- 클래스가 생성될 때 함께 생성되며, 때문에 추가적인 인스턴스를 생성하지 않고도 사용 가능합니다.
- 클래스 내부는 물론 접근제어자에 따라 같은 프로그램, 패키지 내 어디에서든 접근할 수 있는 변수가 됩니다.
지역 변수
public class Zoo {
void testMethod() {
int animalCount = 0; // 지역 변수
}
}
- 메소드 내부에서만 생성되고 사용 가능한 변수 입니다.
- 해당 메소드가 종료될 때 함께 소멸됩니다.
- 로컬 변수로도 불립니다.
- 이는 매개 변수도 포함됩니다.
- 메소드 호출 시 넘겨받은 인자 값으로 지역변수와 생명 주기가 동일합니다.
- 때문에 매개변수도 지역변수에 속한다고 생각하여도 좋을 것 같습니다.
매개변수의 예
public class Zoo {
void testMethod(int animalCount) {
animalCount = 0; // 매개 변수
}
}
맴버 변수 (클래스 변수 VS 인스턴스 변수)
멤버 변수(member variable) 는 특정 객체와 연결된 변수의 하나이며, 해당 변수의 모든 메소드(멤버 함수)에 접근이 가능하다.
우선 위키 백과에는 위와 같이 나와있는데 해당 말이 헷갈리고 어려운 것 같습니다.
좀 더 쉽게 풀어서 이야기 해보자면,
- 자바에선 클래스 영역에 선언된 변수로, 클래스변수와 인스턴스변수를 통틀어 칭합니다.
- 객체가 가지고 있는 기능과 속성을 맴버로 칭하는데,
- 기능은 "메소드" 로 정의하고,
- 속성은 "맴버 변수"로 정의할 수 있습니다.
- 이 역시도 어려우신 분들은 자바에서 메소드 밖에 선언된 변수로 이해하면 좋을 것 같습니다.
클래스 변수
public class Zoo {
static int animalCount = 0; // 클래스 변수
}
class Test {
void testMethod() {
Zoo.animalCount++; // 생성하지 않고 바로 사용가능
}
}
- 해당 클래스에 모든 인스턴스에서 공유 되어 사용 가능한 값입니다.
- 객체가 아닌 클래스의 상태를 나타내는 값입니다.
- 객체를 생성하지 않고 사용이 가능합니다.
- 전역 변수의 성질을 가지고 있습니다.
인스턴스 변수
public class Zoo {
int animalCount = 0; // 인스턴스 변수
}
class Test {
void testMethod() {
Zoo animalCount = new Zoo(); // 인스턴스를 생성해야지만 사용 가능.
animalCount++;
}
}
- 인스턴스(객체)의 상태를 나타낼 수 있는 값입니다.
- 객체를 생성할 때마다 새로운 인스턴스 변수가 메모리에 할당됩니다.
- 때문에, 객체(인스턴스)를 생성 해야지만 사용할 수 있습니다.
🤔 맴버변수 VS 전역변수
그렇다면 마지막으로 아까 클래스 변수 == 전역변수로 볼 수 있다고 하였는데,
과연 맴버변수와 전역변수의 차이가 무엇일까요?
- 가끔 몇몇 곳에선 두 가지 용어를 혼용하여 동의어처럼 사용하기도 합니다.
- 하지만 맴버 변수의 경우 앞서 설명드린 클래스와 인스턴스 변수 두가지를 모두 포함하는 개념인데,
- 먼저, 클래스 변수는 클래스 전체 범위(모든 인스턴스)에서 접근이 가능하여 전역변수와 동일한 개념이지만,
- 인스턴스 변수는 각 인스턴스 별로 다른 변수 값을 가지게 되므로 전역변수의 개념과는 다르다고 볼 수 있습니다.
- 때문에 결과적으로는 실제 두 개념이 다르다는 것도 꼭 인지를 하고 있어야 합니다.
정리해 보자면.
비 고 | 맴버 변수 | 전역 변수 | 지역 변수 | |
클래스 변수 | 인스턴스 변수 | |||
범 위 | 접근 제어자에 따라 전체 어플리케이션 |
클래스 내부 | 접근 제어자에 따라 전체 어플리케이션 |
메소드 내부 |
초기화 시점 | 클래스 로딩 시 | 객체(인스턴스) 생성 시 | 클래스 로딩 시 | 메소드 호출 시 |
소멸 시점 | 클래스 소멸 시 | 객체(인스턴스) 소멸 시 | 클래스 소멸 시 | 메소드 종료 시 |
예 시 | static int count; (클래스 내부 메서드 밖) |
int count; (클래스 내부 메서드 밖) |
static int count; (클래스 내부 메서드 밖) |
int count; (메서드 내부) |
기 타 | 클래스 내 static 변수 | 클래스 내 변수 | 클래스 변수 포함 | 로컬 변수와 동일 매개 변수 포함 |
📚참고자료
'JAVA' 카테고리의 다른 글
Redisson Lock을 사용해서 동시성 문제를 해결해보자! (1) | 2025.01.19 |
---|---|
JAVA 람다(Lambda)를 사용할 때 장단점 (0) | 2024.08.13 |
UUID가 겹치면 어떻게 하지? (중복을 최소화 해보자!) (2) | 2024.03.11 |