정적멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메서드를 말한다.
각각 정적필드, 정적 메서드라고 부른다. 정적멤버는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고 한다.
정적멤버선언
public class 클래스 {
//정적필드
static 타입 필드 [=초기값];
//정적 메서드
static 리턴타입 메서드 (매개변수선언, ..) {..}
}
정적필드와 정적메서드는 클래스에 고정된 멤버로이므로 클래스로더가 클래스(바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 바로 사용할 수 있다.
▷인스턴스필드 vs 정적필드
필드를 선언할때, 인스턴스 필드로 선언할 것인지 정적필드로 선언할 거인지 판단해야한다. 판단기준은 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언하는 것이 좋다.
정적 메서드는 객체들의 존재 여부에 관계없이 쓸 수 있는 메서드이다. 정적 멤버들은 객체가 아닌 클래스에 속해 있으며, 클래스는 jvm구동시 classArea(methodArea) 영역에 바로 배치되기 때문에 객체의 존재 여부에 관계없이 쓸 수 있다,
객체변수는 하나의 객체 안에서 다수의 객체 메서드가 공유하는 변수이고, 클래스변수는 전역변수로서 프로그램 어디서든 접근 가능한 공유변수이다.
메서드의 경우, 인스턴스 메서드를 선언할 것인지, 아니면 정적메서드를 선언할 것인지의 판단 기준으로는 인스턴스 메서드를 이용한다면 인스턴스 메서드를 실행하고, 인스턴스 필드를 이용하지 않는다면 정적 메서드를 선언한다.
정적멤버 사용
클래스.필드;
클래스.메서드(매개값,..);
클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근한다.
static
제어자 | 대상 | 의미 |
static | 멤버변수 | -모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. -클래스변수는 인스턴스를 생성하지 않고도 사용가능하다. -클래스가 메모리에 로드될 때 생성된다. |
메서드 | -인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다. -static 메서드내에서는 인스턴스멤버들을 직접 사용할 수 없다. |
class StaticTest{
static int width = 200; //클래스변수(static변수)
static int height = 120; //클래스변수(static변수)
static {
//static 변수의 복잡한 초기화 수행
}
static int max(int a, int b){ //클래스메서드(static 메서드)
return a > b ? a : b;
}
}
위의 코드를 보면 static이 앞에 붙어 있으면 클래스변수가 되고 붙어있지않으면 인스턴스 변수라고 할 수 있다.
static 변수의 복잡한 초기화를 수행할 시에는 static 클래스 초기화 블럭을 사용한다. 메서드 앞에 stastic을 붙히면 static메서드라고 하며 iv 인스턴스변수, 인스턴스 메서드를 사용할 수 없다.
위의 표에서 static 제어자의 의미를 보면 static 메서드내에서는 인스턴스 멤버들을 직접 사용할 수 없다고 되어있는 것을 볼 수 있다.
인스턴스 멤버들을 사용할 수 없는 이유는 인스턴스변수는 객체를 만들고 나서 사용할 수 있기 때문에 static 메서드내에서는 사용이 불가능하다.
'java' 카테고리의 다른 글
java_6_패키지 (0) | 2021.11.02 |
---|---|
java_6_final (0) | 2021.11.02 |
java_17 스레드 (0) | 2021.11.01 |
SOLID 객체지향설계 (0) | 2021.10.31 |
java_16객체입출력보조스트림 ( ObjectOutputStream & ObjectInputSteam) (0) | 2021.10.29 |