Java Programing

9.Static 변수

자바게 2020. 3. 30. 20:46

 static 변수란 정적 변수라고도 합니다. static 변수는 자바뿐만 아니라 다른 언어에서도 비슷한 개념으로 사용하고 있는 변수로서 자바에서는 다른 멤버 변수처럼 클래스 내부에 선언합니다. 변수를 선언할 때 다음과 같이 자료형 앞에 static 예약어를 사용합니다.

 

static 예약어의 선언

static 변수는 클래스 내부에 선언하지만, 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되는 변수가 아닙니다.

static 변수는 프로그램이 실행되어 메모리에 올라갔을 때 딱 한 번 메모리 공간이 할당됩니다. 그리고 그 값은 모든 인스턴스가 공유합니다.

 

static 의 기능을 활용해보기위한 실습입니다.

static 변수(serialNum)를 하나 선언합니다. 학생이 생성될 때 마다 이 변수 값이 증가합니다.

그런데 주의할 점은 static 변수를 그냥 바로 학번으로 사용하면 안됩니다.

왜냐하면 static 변수는 모든 인스턴스가 공유하는 변수이므로 이 변수를 바로 학번으로 사용하면 모든 학생이 동일한 학번 값을 가지게 되기 때문입니다. 학번은 학생의 고유 번호이므로 학생의 멤버 변수로 선언해 주고, 학생이 한 명 생성될 때마다 증가한 serialNum 값을 studentID에 대입해 주면 이 문제를 해결할 수 있습니다. Student 클래스에 생성자를 추가하고 생성자에서 serialNum 값을 증가시키고 증가된 값을 studentID 변수에 대입합니다.

학생 인스턴스 생성후 학번 출력결과 학번이 차례로 들어간것이 확인 됨

학생 인스턴스를 생성할 때마다 serialNum 변수의 값은 증가합니다. 그리고 새로 생성되는 학생마다 가지는 studentID 변수에 증가한 serialNum 값을 복사해 주었으므로, 두 학생의 학번은 다릅니다.

이처럼  static 변수는 같은 클래스에서 생성된 인스턴스들이 같은 값을 공유할 수 있으므로, 인스턴스 간에 공통으로 사용할 값이 필요한 경우 유용하게 사용할 수 있습니다.

 

클래스 메소드.

일반 멤버 변수를 윟나 메소드가 존재하듯이 static변수를 위한 메소드도 있습니다.

이런메소드를 static메소드 또는 클래스 메소드 라고 합니다.

 

직접 serialNum을 변경하는대신 메소드를 사용하여 값을 호출하거나 설정

이제 외부 클래스에서 serialNum 값을 사용하려면 get() 메소드를 호출하고 serialNum변수 값을 변경하려면 set()메소드를 사용해야 합니다. 

 

클래스 메소드를 사용하기위해 메소드를 클래스이름으로 직접 호출

8행과 13행 코드는 serialNum을 직접 참조하지 않고 getSerialNum()메소드를 호출하여 참조합니다. static 메소드 또한 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 호출할 수 있습니다.

 

변수 유효 범위

 

지역변수 - stack 메모리

멤버변수 - heap 메모리

static 변수 - 데이터 영역

 

싱글톤 패턴- 인스턴스를 단 하나만 생성하는 디자인패턴이다.