Java에는 static 키워드를 통해 정적 변수와 메서드를 선언합니다.
public class Printer {
private static final Printer INSTANCE = new Printer(); // 정적 변수
private Printer() { ... }
public static Printer getInstance() { return INSTANCE; } // 정적 메서드
public void print() { ... }
}
정적 변수 == 클래스 변수
[Java] 변수 종류에서 다루었던 클래스 변수 내용과 같습니다.
정적 메서드
인스턴스 생성 없이 클래스로 호출이 가능합니다. 여러 인스턴스들의 데이터와 관계없이 동일한 로직을 사용해야 할 때 정의를 해줍니다.
주의사항
- 정적 메서드에서는 정적 필드, 정적 메서드만 사용 가능하다.
- this 키워드를 사용할 수 없다.
- 메서드 오버라이딩이 불가능하다.
1,2번 사항은 정적 메서드이기 때문에 가질 수 밖에 없는 특징입니다.
3번 사항은, 정적 메서드는 인스턴스가 아닌 클래스 수준에서 정의되는 메서드이기 때문에(클래스 자체에 연결되어 있기 때문에) 상속의 영향을 받지 않고 독립적으로 동작합니다. 정적 메서드는 가려짐(Hiding)이라는 개념을 가집니다. 이는 서브클래스가 동일한 시그니처를 가진 정적 메서드를 정의하면, 슈퍼 클래스의 정적 메서드가 가려지고 서브 클래스의 정적 메서드가 호출됩니다. 하지만, 이는 오버라이딩이 아닌 메서드를 가려서 다른 동작을 수행하는 것입니다.
클래스 수준에서 정의 VS 인스턴스 수준에서 정의
클래스 수준에서의 정의란 클래스 자체에 속하는 정의를 의미합니다. 이는 해당 클래스의 모든 인스턴스에 공통적으로 적용되는 정의입니다. 클래스 수준에서의 정의는 클래스가 로드되고, 메모리에 적재될 때 초기화되며, 클래스의 라이프 사이클과 밀접한 관련이 있습니다. 정적 변수, 정적 메서드, 내부 클래스 등이 이에 해당합니다.
인스턴스 수준에서의 정의란 클래스의 인스턴스에 속하는 정의를 의미합니다. 이는 개별 인스턴스마다 독립적으로 적용되는 정의입니다. 인스턴스 수준에서의 정의는 인스턴스가 생성될 때마다 초기화되며, 인스턴스의 라이프 사이클과 밀접한 관련이 있습니다. 인스턴스 변수, 인스턴스 메서드 등이 이에 해당합니다.
'Develop > JAVA' 카테고리의 다른 글
[JAVA] 제네릭 타입 (0) | 2023.07.07 |
---|---|
[JAVA] 변수 종류 (0) | 2023.07.06 |