[JAVA] 클래스변수(class variable/Static Field), 인스턴수변수(instance variable/Non-Static Field)

JAVA 클래스변수(class variable), 인스턴수변수(instance variable)

java에서의 클래스는 변수와 메서드를 그룹핑해서 가지고있는 묶음이다. 

클래스는 일종의 설계도와 같은 역할을 한다.

JAVA 클래스는 선언위치에 따른 변수의 종류가 존재한다.

class안에 정의된 변수를 멤버변수라고하며 멤버변수는 클래스변수와 인스턴수변수 2가지로 나누어진다.



인스턴스변수(instance variable) = 각각의 클래스가 가지고있는 변수(개별적인 속성)

-클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다. 그렇게 때문에 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다.
인스턴스 생성방법 => 클래스명 변수명 = new 클래스명();

-인스턴스는 서로 독립적인 저장공간 즉 각각의 메모리 공간을 생성해서 각각의 서로 다른 값을 갖는다. 인스턴스마다 고유한 상태를 유지해야하는 경우 인스턴스변수로 선언한다.

인스턴스변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다. 다른 폴더에 있는 메소드의 경우 파일을 import해줘야 사용이 가능하다. main메서드 밖에서 선언된 메서드는 다른 클래스에서도 클래스이름.메서드명으로 사용이 가능하다. 또한 매개변수도 전달 가능하다.


클래스 변수(class variable) =공유변수라고도 하며 공통속성을 가지는 변수 (고정값으로 사용)

-클래스 영역에 선언되며 클래스가 메모리에 올라갈때 생성된다. static 클래스(클래스 변수)의경우 저장공간을 만들지 않더라도 컴파일러 과정중에 자동으로 저장공간을 만들어주지만 메모리 공간이 1개이기때문에 값을 1개만 저장가능하다.

-클래스 변수는 인스턴스 변수와 달리 new연산자를 사용하여 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있으며 참수변수명.클래스변수 또는 클래스이름.클래스변수 와 같은 형식으로 사용한다. 또한 public을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근이 가능하다.

-클래스 변수 선언시에는 static을 변수명 앞에 작성한다.(필수)

-인스턴스마다 독립적인 저장공간을 갖는 인스턴스 변수와 달리 클래스변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다.  모든 클래스에서 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 클래스변수를 선언해야한다.

-클래스 변수(static으로 선언된 변수) 값을 변경하면 해당 클래스 변수를 참조하고있는 모든 인스턴스에 존재하는 클래스 변수 값은 변경된다.
    
- static으로 정의된 변수의 값 그러니까 class변수내에 선언된 값을 직접 바꾸는것이아닌 밖에서 재선언하여 값을 변경하면 static을 사용하고있는 모든 인스턴스들의 해당 변수 값이 변경된다. static으로 정의된 변수는 공통 메모리 공간을 공유하고 있기 때문이다.

- 인스턴스에 따라서 변하지 않는 값이 필요한 경우(고정값)

-인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우





1. 인스턴스 변수는 클래스 멤버에 접근 할 수 있다. (static을 사용하여 작성된 클래스 메소드(변수)는 컴파일과 동시에 메모리가 생성되어 바로 접근이 가능하다. new연산자를 사용해 메모리 공간을 만들필요x)

2. 클래스 변수는 인스턴스 멤버에 접근 할 수 없다.( 클래스메소드와 달리 인스턴스 메소드(변수)는 new연산자를 사용하여 각각의 개별적인 메모리공간을 생성해야하므로 접근이 불가능하다.)


간단히 요약하면 각각의 상태와 서로다른 결과값을 얻거나 저장하고자할때는 인스턴스 변수를 사용해야하며
그렇지 않은경우 클래스 변수를 사용한다.

댓글