본문 바로가기

JAVA

전역 변수, 지역 변수, 클래스 변수 차이를 이해하자!

안녕하세요!😄

이번 글에서는 빠르고 쉽게 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 변수 클래스 내 변수 클래스 변수 포함 로컬 변수와 동일
매개 변수 포함
 

 

 

 

📚참고자료