
static은 객체 지향 프로그래밍에서 클래스와 관련된 멤버(메서드, 필드 등)를 정의하는 데 사용되는 키워드이다.static을 사용하는 것은 클래스 레벨에서 동작하는 것과 인스턴스 레벨에서 동작하는 것을 구분하는 데 중요하다.
static 멤버는 클래스 자체에 속하며, 클래스의 인스턴스(객체)와는 독립적으로 존재한다. 이는 모든 인스턴스가 공유하는 데이터나 메서드로 볼 수 있다.
클래스가 메모리에 로드될 때, static 멤버는 초기화되고, 클래스의 모든 인스턴스가 같은 static 멤버를 공유한다.
static 메서드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다. 즉, static 메서드는 ClassName.method() 형식으로 호출할 수 있다.
예를 들어, Math.sqrt(4)는 Math 클래스의 static 메서드인 sqrt를 호출하는 예시다.
static 메서드는 클래스의 인스턴스 상태(인스턴스 변수나 메서드)에 접근할 수 없다. static 메서드는 오직 클래스의 static 멤버만 접근할 수 있다.
예를 들어, 인스턴스 변수 this.value에 접근하려는 static 메서드는 컴파일 에러를 발생시킵니다.
static 메서드는 일반적으로 객체의 상태와 관계없이 기능을 제공하는 유틸리티나 헬퍼 메서드에 사용된다. 예를 들어, 수학적 계산, 문자열 조작 등의 작업에 적합하다.static 필드는 클래스 레벨에서 공통으로 사용하는 데이터를 저장할 때 사용된다. 모든 인스턴스가 동일한 값을 공유한다.
static 메서드는 공통적인 동작이나 연산을 수행하는 데 유용하며, 특정 인스턴스에 종속되지 않는다.
static 사용 예시class Counter {
private static count: number = 0;
public static increment(): void {
this.count++;
}
public static getCount(): number {
return this.count;
}
}
// 사용
Counter.increment();
console.log(Counter.getCount()); // 1
class MathUtils {
public static add(a: number, b: number): number {
return a + b;
}
public static multiply(a: number, b: number): number {
return a * b;
}
}
// 사용
console.log(MathUtils.add(2, 3)); // 5
console.log(MathUtils.multiply(4, 5)); // 20
static 멤버: 클래스 자체에 속하고 인스턴스와 독립적으로 존재. 클래스 로드 시 초기화되며 모든 인스턴스가 공유.
인스턴스 멤버: 특정 인스턴스에 속하며 해당 인스턴스의 상태와 관련된 데이터나 동작을 정의.
메서드가 클래스 인스턴스의 상태나 데이터를 사용하지 않고, 오직 입력된 매개변수만을 사용하여 작업을 수행하는 경우.
예: 유틸리티 함수, 계산 함수 등.
클래스 전체에서 공유되는 데이터나 동작을 정의할 때.
예: 클래스 전체에 걸쳐 공유되는 상수나 설정 값.
클래스의 인스턴스를 생성하는데 도움을 주는 메서드. 특히 다양한 방식으로 인스턴스를 생성할 수 있는 경우.
예: newInstance, fromJSON 등의 메서드.
클래스 인스턴스와 관련이 없는 헬퍼 기능. 다른 인스턴스 메서드에서 호출될 필요가 없는 경우.
예: 데이터 형식 변환, 데이터 검증 등.
메서드가 클래스 인스턴스의 상태(필드)나 데이터에 의존하거나, 인스턴스의 다른 메서드를 호출해야 하는 경우.
예: 인스턴스 변수에 접근하거나 인스턴스 메서드를 사용하는 경우.
메서드가 다형성을 사용하거나 상속 계층에서 오버라이딩될 필요가 있는 경우.
예: 추상 클래스나 인터페이스에서 정의된 메서드.
객체가 특정 상태를 유지해야 하고, 상태에 따라 동작이 달라지는 경우.
예: 사용자 세션, 데이터베이스 연결 관리 등.
class MathUtils {
public static add(a: number, b: number): number {
return a + b;
}
}
// 사용
const sum = MathUtils.add(2, 3); // 5
class Counter {
private count: number = 0;
public increment(): void {
this.count++;
}
public getCount(): number {
return this.count;
}
}
// 사용
const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 1
이 경우 increment와 getCount는 인스턴스의 상태를 사용하므로 static으로 정의할 수 없다.
static 메서드는 클래스 인스턴스와 무관하게 동작하고, 클래스 수준에서 공통적으로 사용될 수 있는 메서드나 필드에 적합하다.
인스턴스 메서드는 클래스 인스턴스의 상태를 활용하거나, 특정 인스턴스에 종속적인 동작을 구현할 때 사용한다.