목차
🔥 자바 개발자라면 반드시 알아야 할 static 키워드의 모든 것
자바(Java) 프로그래밍을 하다 보면 자주 마주치는 static 키워드.
하지만 의외로 많은 개발자들이 정확한 개념과 용도를 잘 모르고 사용하는 경우가 많습니다.
이 글에서는 static 키워드의 개념, 특징, 사용법, 실무 예시, 주의사항까지 한번에 정리해드립니다.
입문자부터 중급자까지 꼭 읽어야 할 필독 가이드!
1. static 키워드란? 주요 개념과 특징
static은 정적(static)이라는 의미를 갖고 있으며, 클래스에 고정된 멤버(변수나 메서드)를 선언할 때 사용됩니다.
즉, 객체를 생성하지 않고도 사용할 수 있는 자원을 만들 때 사용하는 키워드입니다.
✅ 주요 개념 정리
용어 | 설명 |
Static 변수 (클래스 변수) | 클래스에 하나만 존재하는 변수로, 모든 인스턴스가 공유 |
Static 메서드 (정적 메서드) | 객체 생성 없이 클래스 이름으로 호출 가능한 메서드 |
Static 블록 | 클래스가 메모리에 로드될 때 한 번만 실행되는 코드 블록 |
Static 클래스 | 내부 클래스에 사용 가능하며, 외부 클래스의 인스턴스 없이도 접근 가능 |
✅ 주요 특징
- 클래스 수준의 소속: static으로 선언된 멤버는 객체가 아닌 클래스에 속합니다. 따라서 클래스명.멤버명으로 직접 호출 가능합니다.
- 메모리 효율성: static 멤버는 프로그램 실행 시 메모리에 한 번만 할당되며, 모든 객체가 이를 공유합니다.
- 인스턴스 독립성: 객체 각각의 상태와 무관하게 동작합니다.
쉽게 말해, static은 "객체 없이도 쓸 수 있는 공용 도구"라고 생각하면 됩니다. 예를 들어, 공용 계산기를 떠올려보세요. 누구나 인스턴스를 만들지 않고 바로 사용할 수 있는 도구입니다.
2. static 키워드의 예시와 코드 설명
예시 1: static 변수 사용
public class Counter {
public static int count = 0; // static 변수
public Counter() {
count++; // 객체가 생성될 때마다 count 증가
}
public static void printCount() {
System.out.println("총 객체 수: " + count);
}
}
public class Main {
public static void main(String[] args) {
Counter c1 = new Counter(); // count = 1
Counter c2 = new Counter(); // count = 2
Counter.printCount(); // 출력: 총 객체 수: 2
}
}
- count는 static 변수로, 모든 Counter 객체가 공유합니다.
- 객체 c1, c2가 생성될 때마다 count 값이 증가하며, 이는 클래스 수준에서 관리됩니다.
- printCount()는 static 메서드로, 객체 없이 Counter.printCount()로 호출 가능합니다.
예시 2: static 메서드와 일반 메서드 비교
public class MathUtil {
public static int add(int a, int b) { // static 메서드
return a + b;
}
public int multiply(int a, int b) { // 인스턴스 메서드
return a * b;
}
}
public class Main {
public static void main(String[] args) {
// static 메서드 호출
int sum = MathUtil.add(3, 5); // 객체 생성 없이 호출
System.out.println("합: " + sum); // 출력: 합: 8
// 인스턴스 메서드 호출
MathUtil util = new MathUtil();
int product = util.multiply(3, 5);
System.out.println("곱: " + product); // 출력: 곱: 15
}
}
- add()는 static 메서드로, 객체 없이 바로 호출 가능합니다.
- multiply()는 인스턴스 메서드로, 반드시 객체를 생성해야 호출할 수 있습니다.
3. 실무에서 static 키워드의 활용 사례
실무 예제 1: 유틸리티 클래스
public class MathUtils {
public static int square(int number) {
return number * number;
}
public static double getPi() {
return 3.14159;
}
}
public class Main {
public static void main(String[] args) {
System.out.println(MathUtils.square(5)); // 25
System.out.println(MathUtils.getPi()); // 3.14159
}
}
🔍 실무 적용 포인트
- MathUtils처럼 객체 상태와 무관한 기능성 메서드는 static으로 선언하면 효율적입니다.
- 대표적인 예시로는 java.lang.Math, Collections, Arrays 클래스 등이 있습니다.
실무 예제 2: 싱글톤 패턴
public class Singleton {
private static Singleton instance; // static 변수로 단일 인스턴스 관리
private Singleton() {} // 외부 생성 차단
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
🔍 실무 적용 포인트
- 활용 이유: 데이터베이스 연결 객체처럼 자원을 공유해야 할 때 유용합니다.
4. static 키워드의 장점과 단점: 주의사항
✅ 장점
- 메모리 절약: 클래스당 한 번만 메모리에 올라감
- 간편한 접근: 객체 없이도 접근 가능
- 공유 자원 관리 용이: 전역적으로 사용할 데이터(예: 설정값, 카운터 등)에 적합
❌ 단점 및 주의사항
- 상태 유지가 어려움: 객체 간 독립적인 값이 필요한 경우에는 부적절
- 테스트 어려움: static 요소는 mocking이 어려워 단위 테스트에 제약이 생길 수 있음
- 메모리 해제 어려움: static은 GC(Garbage Collector)가 수거하지 않아 메모리 누수 가능성 있음
- OOP 원칙 위배 소지: 클래스 기반 설계에서 객체 지향성 저해 요소로 작용할 수 있음
TIP: 무조건 static을 사용하는 것보다, 공유 목적이 명확한 경우에만 사용하는 것이 바람직합니다.
✅ 결론: static, 적재적소에 써야 진짜 실력!
static 키워드는 자바에서 매우 유용한 기능이지만, 잘못 사용하면 오히려 코드의 유연성과 유지보수성을 해칠 수 있습니다. 따라서 언제 객체 없이 접근해야 하고, 어떤 값이 모든 객체에 의해 공유되어야 하는지를 명확히 이해하고 사용해야 합니다. 특히 실무에서는 유틸리티 메서드나 설정값 관리, 싱글톤 패턴 구현 등에서 매우 자주 사용되므로, 정확한 이해가 필수입니다.
'이직&취업 > Java 기초 상식' 카테고리의 다른 글
자바의 equals()와 hashCode() 메서드는 어떻게 구현하나요? (33) | 2025.04.09 |
---|---|
ArrayList와 LinkedList의 차이점은 무엇인가요? (29) | 2025.04.08 |
스트림(Stream) API를 어떻게 활용하나요? (27) | 2025.04.07 |
자바에서 NullPointerException은 왜 발생하고 어떻게 해결하나요? (26) | 2025.04.06 |
JAVA 직렬화(Serialization) 란 무엇인가? (14) | 2025.03.29 |