static 이해하기

SEUNGJUN·2024년 9월 3일

static은 객체 지향 프로그래밍에서 클래스와 관련된 멤버(메서드, 필드 등)를 정의하는 데 사용되는 키워드이다. static을 사용하는 것은 클래스 레벨에서 동작하는 것과 인스턴스 레벨에서 동작하는 것을 구분하는 데 중요하다.

static

1. 클래스 레벨의 멤버

  • static 멤버는 클래스 자체에 속하며, 클래스의 인스턴스(객체)와는 독립적으로 존재한다. 이는 모든 인스턴스가 공유하는 데이터나 메서드로 볼 수 있다.

  • 클래스가 메모리에 로드될 때, static 멤버는 초기화되고, 클래스의 모든 인스턴스가 같은 static 멤버를 공유한다.

2. 인스턴스 없이 호출

  • static 메서드는 클래스의 인스턴스를 생성하지 않고도 호출할 수 있습니다. 즉, static 메서드는 ClassName.method() 형식으로 호출할 수 있다.

  • 예를 들어, Math.sqrt(4)는 Math 클래스의 static 메서드인 sqrt를 호출하는 예시다.

3. 인스턴스 상태 접근 불가

  • static 메서드는 클래스의 인스턴스 상태(인스턴스 변수나 메서드)에 접근할 수 없다. static 메서드는 오직 클래스의 static 멤버만 접근할 수 있다.

  • 예를 들어, 인스턴스 변수 this.value에 접근하려는 static 메서드는 컴파일 에러를 발생시킵니다.

4. 유틸리티 및 헬퍼 메서드

  • static 메서드는 일반적으로 객체의 상태와 관계없이 기능을 제공하는 유틸리티나 헬퍼 메서드에 사용된다. 예를 들어, 수학적 계산, 문자열 조작 등의 작업에 적합하다.

5. 클래스 변수와 메서드

  • static 필드는 클래스 레벨에서 공통으로 사용하는 데이터를 저장할 때 사용된다. 모든 인스턴스가 동일한 값을 공유한다.

  • static 메서드는 공통적인 동작이나 연산을 수행하는 데 유용하며, 특정 인스턴스에 종속되지 않는다.

2. static 사용 예시

1. 클래스 레벨에서 공유되는 데이터

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

2. 인스턴스와 독립적인 유틸리티 메서드

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 멤버: 클래스 자체에 속하고 인스턴스와 독립적으로 존재. 클래스 로드 시 초기화되며 모든 인스턴스가 공유.

  • 인스턴스 멤버: 특정 인스턴스에 속하며 해당 인스턴스의 상태와 관련된 데이터나 동작을 정의.

static을 사용해야 하는 상황

1. 인스턴스 상태에 의존하지 않는 메서드

  • 메서드가 클래스 인스턴스의 상태나 데이터를 사용하지 않고, 오직 입력된 매개변수만을 사용하여 작업을 수행하는 경우.

  • 예: 유틸리티 함수, 계산 함수 등.

2. 클래스 레벨의 데이터와 동작

  • 클래스 전체에서 공유되는 데이터나 동작을 정의할 때.

  • 예: 클래스 전체에 걸쳐 공유되는 상수나 설정 값.

3. 팩토리 메서드

  • 클래스의 인스턴스를 생성하는데 도움을 주는 메서드. 특히 다양한 방식으로 인스턴스를 생성할 수 있는 경우.

  • 예: newInstance, fromJSON 등의 메서드.

4. 헬퍼 메서드

  • 클래스 인스턴스와 관련이 없는 헬퍼 기능. 다른 인스턴스 메서드에서 호출될 필요가 없는 경우.

  • 예: 데이터 형식 변환, 데이터 검증 등.

static을 사용하지 말아야 하는 상황

1. 인스턴스 상태에 의존하는 메서드

  • 메서드가 클래스 인스턴스의 상태(필드)나 데이터에 의존하거나, 인스턴스의 다른 메서드를 호출해야 하는 경우.

  • 예: 인스턴스 변수에 접근하거나 인스턴스 메서드를 사용하는 경우.

2. 다형성 및 상속

  • 메서드가 다형성을 사용하거나 상속 계층에서 오버라이딩될 필요가 있는 경우.

  • 예: 추상 클래스나 인터페이스에서 정의된 메서드.

3. 상태를 가지는 객체

  • 객체가 특정 상태를 유지해야 하고, 상태에 따라 동작이 달라지는 경우.

  • 예: 사용자 세션, 데이터베이스 연결 관리 등.

4. 인스턴스 메서드와의 상호작용

  • 클래스 인스턴스의 메서드와 상호작용이 필요한 경우. 예를 들어, static 메서드가 인스턴스 메서드를 호출해야 하는 경우는 적합하지 않는다.

예시

1. static 메서드 예시

class MathUtils {
  public static add(a: number, b: number): number {
    return a + b;
  }
}
// 사용
const sum = MathUtils.add(2, 3); // 5

2. static 메서드를 사용하지 말아야 할 예시

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 메서드는 클래스 인스턴스와 무관하게 동작하고, 클래스 수준에서 공통적으로 사용될 수 있는 메서드나 필드에 적합하다.

  • 인스턴스 메서드는 클래스 인스턴스의 상태를 활용하거나, 특정 인스턴스에 종속적인 동작을 구현할 때 사용한다.

profile
RECORD DEVELOPER

0개의 댓글