Java

지역변수, 전역변수, 인스턴스 변수, 클래스 변수

하나의 클래스는 필드, 생성자, 메소드로 구성된다.

field (필드)

Java에서 field는 클래스 영역 안에 선언한 변수(variable)이다.

 

필드는 다른 말로 멤버 변수(member variable)나 전역 변수(global variable)라고 불린다.

 

변수라는 말처럼 필드는 어떠한 (객체)데이터를 저장하기 위한 역할을 담당한다.

 

메소드 안에 선언되는 변수는 지역 변수(local variable) 라고 부른다.

 

변수는 선언위치에 따라 지역변수(Local variable)와 전역변수(Global variables)로 나뉘어 진다.

 

지역변수(Local variables)

  • 선언 위치 : 클래스 영역 이외의 영역( 메소드, 생성자, 초기화 블럭 내부)
  • 생성시기 : 변수 선언문이 수행 되었을 때
  • 특징:
    • 특정한 구역(메소드, 생성자, 초기화 블록(( ), { })에 생성되어 그 지역에서만 사용할 수 있는 변수를 의미한다.
    • 매개변수(parameter) 또한 메소드 내에 정의되는 지역변수이다.
    • 지역 변수는 메모리상의 스택(stack) 영역에 저장된다.
    • 지역변수는 변수가 선언된 블록 내에서만 유효하고, 블록이 종료되면 메모리에서 사라져 사용할 수 없게된다. (for문 while문도 동일)
    • 지역변수들은 해당 블록을 벗어나면 소멸하게 되기때문에, 메소드에 선언된 변수가 있다면 그 지역변수는 메소드가 호출될 때마다 매번 새롭게 할당된다.
class Example{

    void method(int a, int b)
    {
        //a, b도 지역변수 == 매개변수
        //매개변수 -> 전달인자
        int sum = a + b;
        int local_int = 0;  //지역변수는 { }안에 생성되며 { }를 벗어나면
    }                       // method() 라는 메소드가 끝나는 시점에 바로 삭제

}

전역변수(Global variable)

 

클래스 영역(메소드 밖)에 선언된 변수를 의미한다.


프로그램이 실행되면 메모리 공간에 데이터를 저장한다.

 

전역 변수는 프로그램의 어디에나 접근할 수 있으며, 프로그램이 종료되어야만 메모리 영역에서 사라진다.

  • 클래스변수: 다른 클래스에서도 호출이 가능
  • 객체변수: 같은 클래스내에서 호출가능
class Card {

    // 인스턴스 변수
    String kind; // 무늬
    int number;  // 숫자

    // 클래스 변수
    // 폭과 넓이는 공통적으로 같은 값을 유지해야한다.
    static int width = 100;  // 폭
    static int height = 200; // 넓이
}

 

 

인스턴스 변수 (instance variable) (= 객체 변수)

  • 선언위치 : 클래스 영역
  • 생성 시기 : 인스턴스가 생성 되었을때
  • 특징:
    • 같은 클래스내에서 호출 가능하다.
    • 인스턴스 변수는 클래스영역 내에 선언되며 클래스의 인스턴스(객체)를 생성할 때 만들어진다.
    • 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스(객체)를 생성해야한다. 즉, 객체화를 시켜서 호출해야지만 사용이 가능하다
    • 각 인스턴스(객체)마다 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
    • 고유한 상태를 유지해야하는 경우, 인스턴스 변수로 선언한다.

클래스 변수 (class variable) (= static변수)

  • 선언 위치 : 클래스 영역
  • 선언 방법 : 인스턴스 변수 앞에 static
  • 생성 시기 : 클래스가 메모리에 올라갈 때
  • 특징:
    • 다른 클래스에서도 호출이 가능하다.
    • 클래스 변수는 모든 인스턴스(객체)가 공통된 저장공간(변수)을 공유하게 된다. 그래서 클래스 변수를 공유 변수(shared variable)라고도 부르기도 한다.
    • 변수 앞에 static 키워드를 붙여 선언하고, 객체화를 시키지 않고도 사용이 가능하다.
    • 인스턴스(객체)를 생성하지 않고 언제라도 바로 사용할 수 있다는 특징이 있으며 '클래스이름.클래스변수' 와 같은 형식으로 사용할 수 있다.
    • 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우, 클래스 변수로 선언해야 한다.
    • 클래스가 메모리에 로딩(Loading) 될때, 생성되어 프로그램이 종료때 까지 유지되며 public을 앞에 붙이면 같은 프로그램내에서 어디서나 접근할수 잇는 전역변수(global variable)의 성격을 갖는다.

참고)

독립적인 저장공간이란, 객체가만들어지면서 새로운 해쉬값을 가지게되는데 그것을 칭하는것이다.

클래스 변수(static 변수)는 같은 해쉬값 놀이터에서 놀고,

인스턴스 변수(객체 변수)는 새로운 해쉬값 놀이터를 계속 만들어논다.

 


 

간단 정리

1. 지역변수와 전역변수의 구분은 선언한 위치에 따라다르다.

2. 전역변수는 어디서나 호출 가능하고 지역변수는 Method(함수) 안에 서식한다.

3. 전역변수 종류는 두가지로 인스턴스 변수(객체 변수), 클래스 변수(static 변수)가 있다

4. 인스턴스 변수(객체 변수)는 같은 클래스에서만 자유롭게 사용가능하고, 클래스 변수(static)는 다른 클래스에서도 사용이 가능하다.

5. 클래스 변수는 해쉬값이 같고, 객체 변수는 객체 선언마다 다른 해쉬값이 생성된다.

'Java' 카테고리의 다른 글

final 키워드  (0) 2020.10.30
static(정적) 키워드  (0) 2020.10.30
기본자료형 & 참조자료형  (0) 2020.10.01
Call by value. VS Call by reference.  (0) 2020.10.01
Java - 컴파일 과정  (0) 2020.09.30