정적 멤버

·2025년 4월 10일

Power Java

목록 보기
21/75

5.3 정적 멤버

-여러 개의 객체가 하나의 변수를 공유해야 되는 경우
=> 정적 멤버 or 클래스 멤버


필드 정의 시 static을 붙이면 정적 멤버가 된다.
메소드 정의 시 static을 붙이면 정적 메소드가 된다.

클래스의 멤버
1) 변수
2) 메소드

다음과 같은 성질을 지니는 1) 2)가 존재한다.
•정적 멤버
: 다른 객체와 공유할 수 있는 멤버
•인스턴스 멤버
: 객체마다 별도로 소유하고 있는 멤버

< 인스턴스 멤버 vs 정적 멤버 >

인스턴스 변수
-동일한 클래스를 이용하여 다양한 객체들이 생성될 때
각각의 객체(인스턴스)들은 자신만의 필드를 가진다.

정적 변수
-변수를 정의할 때 static을 붙이면 된다.
-하나의 클래스에 하나만 만들어지고,
동일한 클래스로 생성된 모든 객체들은 하나의 정적 변수를 공유한다.
사용하려면 클래스 이름 뒤에 점 연산자를 붙이면 된다.
객체가 있다면 객체의 이름을 통해서도 접근이 가능하다.
Ex)
Television obj = new Television();
obj.count = 100;

*필드와 변수는 거의 같은 개념이라고 보면 되지만,
미세하게 차이점이 존재한다.
변수는 대부분의 경우에 사용이 가능한 용어이고,
필드는 클래스 내부에 선언된 변수에 한해서만 지칭한다.
다시 말해 클래스의 속성 같은 역할을 갖는다.

< 정적 변수의 생성 시기 >

  • 객체의 생성과는 상관없이
    자바 가상 기계에 클래스가 적재되는 순간 생성된다.
  • 객체가 사라져도 정적 변수는 소멸되지 않는다.
    => 프로그램이 종료되어야 사라진다.

*반면 인스턴스 변수는 객체가 생성되어야 만들어진다.
객체가 소멸되면 인스턴스 변수도 없어진다.

정적 메소드
-메소드 앞에 static 수식자를 붙여서 만든다.
ex) Math 클래스에 들어 있는 각종 수학 메소드들.
객체를 생성할 필요가 없기 때문에 정적 메소드로 선언한다.

*main() 메소드의 앞에도 static이 붙어 있는 이유는
"객체 생성"과 상관없이 main() 메소드를 호출할 수 있게 하기 위해서이다.

< 정적 변수의 활용 >
-자바에서는 전역 변수의 개념이 없다.
-경우에 따라서는 전역 변수의 개념이 필요한데,
이럴 때 정적 변수를 사용하면
객체들이 모두 공유하는 일종의 전역 변수를 만들 수 있다.
*정적 메소드에서는 인스턴스 멤버를 사용하면 안 된다. (당연한 개념)

X

O

*정적 메소드는 this를 사용할 수 없다. -this는 현재 객체를 가리키는 참조 변수이다.
-> 정적 메소드는 객체가 없을 때도 호출될 수 있기 때문에
애초에 "현재 객체"라는 개념이 없다.

final 키워드
-어떤 필드에 final을 붙이면 상수가 된다.
-static과 final 수식어를 동시에 사용하는 경우가 많다.

=> static을 같이 붙이는 이유는,
상수를 인스턴스 변수로 선언하면 값이 같음에도 각 객체마다 하나씩 만들어지므로 저장 공간이 낭비되기 때문이다.
따라서 클래스 변수로 정의할 것.(=정적 변수)

정적 블록
: 클래스가 메모리에 로드될 때 단 한 번만 실행되는 문장들의 집합.
=정적 초기화 블록
정적 변수들을 초기화하는 용도로 많이 사용된다.

0개의 댓글