안녕하십니까. 오늘은 제가 강의를 들으며 헷갈렸던 static에 대해 알아보겠습니다.
자바를 공부하다 보면 static 키워드가 붙은 변수나 메서드를 자주 보게 되는데, 이게 뭐가 특별한지 왜 사용되는지 제대로 이해하는 것이 중요합니다. static의 특징과 활용법을 하나씩 꼼꼼하게 정리해 보도록 하겠습니다.
1. Static 변수 (Static Variable) – 클래스 변수
먼저, static 변수는 클래스에 속하는 변수입니다. 보통 클래스는 여러 개의 객체를 만들 수 있는데, static 변수는 그런 객체들과는 독립적으로 클래스에 딱 한 번만 생성됩니다. 즉, 모든 객체가 하나의 static 변수를 공유하는 구조입니다. 예를 들어 count라는 변수를 static으로 선언하면 이 변수는 같은 클래스를 사용하는 모든 객체가 공유합니다. 한 객체에서 값을 변경하면 다른 객체에서도 바뀐 값을 보게 됩니다.
public class MyClass {
static int count = 0; // static 변수
public MyClass() {
count++; // 객체가 생성될 때마다 count 증가
}
}
2. Static 메서드 (Static Method) – 객체 없이도 호출할 수 있는 메서드
이제 static 메서드를 살펴보겠습니다. static 메서드는 클래스에 속하는 메서드로, 객체 없이 호출할 수 있습니다. 그래서 클래스명으로 바로 호출이 가능합니다. 단, 주의할 점은 static 메서드는 객체의 상태와 관련이 없는 메서드여야 한다는 것입니다. static 메서드는 인스턴스 변수나 인스턴스 메서드를 직접 사용할 수 없습니다.
보통 유틸리티 메서드를 만들 때 주로 사용합니다. 인스턴스의 상태와 상관없이 어떤 값을 계산하거나 공통된 작업을 수행할 때 유용합니다.
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
위 예제의 add 메서드는 MathUtils.add(5, 10)처럼 객체를 만들지 않고도 호출할 수 있습니다.
3. Static 블록 (Static Block) – 클래스가 로드될 때 한 번만 실행되는 블록
static 블록은 클래스가 메모리에 로드될 때 딱 한 번 실행되는 초기화 블록입니다. 클래스 로딩 시점에 설정이나 초기화가 필요할 때 유용합니다. static 블록이 여러 개 있으면 작성된 순서대로 실행되므로 참고하시기 바랍니다.
public class Example {
static int count;
static {
count = 10; // static 변수 초기화
System.out.println("Static block initialized.");
}
}
위 예제에서 Example 클래스가 로드되면 static 블록이 자동으로 실행되며 count 변수가 초기화됩니다.
4. Static 클래스 (Static Nested Class) – 독립적으로 사용할 수 있는 내부 클래스
자바에서는 클래스 안에 또 다른 클래스를 정의할 수 있습니다. 이때 내부 클래스에 static을 붙이면 외부 클래스의 인스턴스와 독립적으로 동작하는 내부 클래스를 만들 수 있습니다. 주로 외부 클래스와 밀접한 관련이 있지만, 독립적으로도 사용할 수 있을 때 유용하게 쓰입니다.
public class OuterClass {
static class InnerStaticClass {
public void display() {
System.out.println("Static Inner Class");
}
}
}
이 경우 InnerStaticClass는 OuterClass의 인스턴스와 관계없이 독립적으로 사용할 수 있습니다. 외부 클래스의 인스턴스 없이도 OuterClass.InnerStaticClass inner = new OuterClass.InnerStaticClass();처럼 생성할 수 있습니다.
5. Static Import – 클래스명 없이 편하게 쓰기
static 멤버가 많은 클래스가 있을 때, import static 구문을 사용하면 클래스명 없이 간편하게 사용할 수 있는 기능이 있습니다. 자주 쓰는 메서드나 상수를 편리하게 쓰기 위해 활용할 수 있습니다.
import static java.lang.Math.PI;
import static java.lang.Math.sqrt;
public class Test {
public static void main(String[] args) {
System.out.println(PI); // Math.PI 대신 PI만 사용 가능
System.out.println(sqrt(4)); // Math.sqrt 대신 sqrt만 사용 가능
}
}
이렇게 PI와 sqrt를 Math 클래스명 없이도 사용할 수 있습니다.
'Sparta > java' 카테고리의 다른 글
[Spring 4기] Ch2 계산기 과제 트러블슈팅 (0) | 2024.11.14 |
---|---|
IntelliJ 단축키 모음 (0) | 2024.11.12 |
java 코드 리팩토링 (0) | 2024.11.10 |
인수(Argument)와 매개변수(Parameter) (0) | 2024.11.07 |
메서드(Method) vs 함수(Function)의 차이 (0) | 2024.11.07 |