What is static?
- 클래스의 인스턴스가 아닌 클래스에 속하며 클래스의 변수, 메서드 등을 공유하는 데 사용됨. 이를 통해 해당 클래스로 만들어지는 객체 사이에서 중복되는 메서드, 속성을 효율적으로 정의할 때 씀
- 정적 변수 (Static Variables)
static
키워드를 사용하여 클래스 수준에서 변수를 선언할 수 있음. 이러한 변수는 모든 객체 인스턴스가 공유하며, 클래스의 인스턴스화와 관계없이 클래스 이름으로 직접 접근할 수 있음. 이를 통해 클래스 수준에서 데이터를 공유하거나 상태를 유지할 수 있음
public class MyClass{
public static int staticVariable = 10;
}
- 정적 메서드 (Static Methods)
static
키워드를 사용하여 정적 메서드를 정의할 수 있음. 정적 메서드는 클래스 수준에서 호출되며 객체 인스턴스를 필요로하지 않음. 주로 유틸리티 메서드나 도우미 함수를 만들 때 사용
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
package programmers;
public class Person {
String name;
int IQ;
int str;
private static final String GUDOC = "leesfact";
public Person(String name, int IQ, int str) {
this.name = name;
this.IQ = IQ;
this.str = str;
}
public Person() {
this.name = "leesfact";
this.IQ = 156;
this.str = 999;
}
public void levelup() {
this.IQ += 1;
this.str += 1;
System.out.println(this.name + "의 지능과 힘이 증가했습니다! " + this.IQ + "/" + this.str);
}
private static void(Person a , Person b){
System.out.println(a.name + "&" + b.name + "이 대화를 시작했다!");
}
public static void main(String[] args) {
Person a = new Person();
a.levelup();
Person b = new Person("홍철",999, 0);
b.levelup();
Person.talk(a,b);
System.out.println(Person.GUDOC);
}
}
static의 단점
단점 | 설명 |
---|
메모리 관리 | 스태틱 변수는 프로그램 실행 중 메모리 상주, 메모리 사용량 증가, 큰 데이터 구조체 사용 시 메모리 낭비 가능 |
스레드 안전성 | 여러 스레드에서 스태틱 변수에 동시 접근 시 스레드 안전성 문제 발생 가능, 동기화 부재 시 예기치 않은 결과 발생 가능 |
테스트 어려움 | 스태틱 메서드는 객체 지향 모델과 어울리지 않아 테스트 어려움, 모의 객체(Mock objects)를 활용한 테스트 어려움 |
객체 지향 원칙 위배 | 스태틱 변수와 메서드는 객체 지향 설계 원칙 위배 가능, 데이터와 메서드 분리 경향 증가 |
유연성 감소 | 스태틱 변수와 메서드는 상속과 다형성을 제한할 수 있으며, 서브클래스에서 스태틱 멤버 오버라이드 및 확장 어려움 |
GC 회수 불가능 | 스태틱 변수와 메서드는 Method Area에 위치하며, 가비지 컬렉터(GC)가 메모리 회수를 수행하지 않습니다. |