TypeScript - 정적 메서드와 속성

안녕하세요, 미래의 코딩 마법사 여러분! 오늘은 TypeScript의 마법적인 세계로 접수하겠습니다. 특히 정적 메서드와 속성에 대해 집중적으로 다룰게요. 프로그래밍 초보자라면 걱정 마세요 - 이 흥미로운 여정에서 친절한 안내자로서 여러분을 안내할 거예요. 가상의魔杖(키보드)을 손에 들고, TypeScript의 마법을 부르러 가보겠습니다!

TypeScript - Static Methods and Properties

정적 메서드와 속성이란?

정밀하게 다루기 전에, 프로그래밍의 세계에서 "정적(static)"이 무엇을 의미하는지 이해해 보겠습니다. 클래스를 객체를 만드는 설계도로 생각해 보세요. 그런데 설계도 자체에 특별한 기능을 가지고 있을 수 있다면 어떨까요? 그 기능이 바로 정적 메서드와 속성입니다!

정적 속성

정적 속성의 기본

정적 속성은 클래스 자신에 속하는 공유 속성입니다. 개별 인스턴스가 아니라 클래스 자체에 속합니다. 간단한 예제를 보겠습니다:

class Wizard {
static schoolName: string = "Hogwarts";
name: string;

constructor(name: string) {
this.name = name;
}
}

console.log(Wizard.schoolName); // 출력: Hogwarts

const harry = new Wizard("Harry Potter");
console.log(harry.name); // 출력: Harry Potter
// console.log(harry.schoolName); // 이 경우 오류가 발생합니다!

이 예제에서 schoolName은 정적 속성입니다. 클래스 이름(Wizard.schoolName)을 사용하여 접근하는 것을 주의해 보세요.

정적 속성을 사용하는 이유

  1. 공유 데이터: 클래스의 모든 인스턴스가 동일한 데이터를 공유하고 싶을 때.
  2. 상수: 변경되지 않고 클래스와 관련된 값을 저장할 때.
  3. 구성: 클래스 전체 설정을 저장할 때.

보다 실질적인 예제를 보겠습니다:

class MathUtils {
static PI: number = 3.14159;
static E: number = 2.71828;
}

console.log(MathUtils.PI); // 출력: 3.14159
console.log(MathUtils.E);  // 출력: 2.71828

여기서 PIE는 변하지 않는 수학 상수이므로, MathUtils 클래스의 정적 속성으로 만드는 것이 적절합니다.

정적 메서드

정적 메서드 이해

정적 메서드는 클래스 자신에 속하는 함수로, 클래스 인스턴스가 아니라 클래스 자체에 속합니다. 인스턴스 데이터에 접근할 필요 없는 유틸리티 함수에 적합합니다.

예제를 보겠습니다:

class Calculator {
static add(a: number, b: number): number {
return a + b;
}

static multiply(a: number, b: number): number {
return a * b;
}
}

console.log(Calculator.add(5, 3));      // 출력: 8
console.log(Calculator.multiply(4, 2)); // 출력: 8

이 예제에서 addmultiply는 정적 메서드입니다. Calculator 클래스를 직접 호출하여 인스턴스를 생성하지 않고도 사용할 수 있습니다.

정적 메서드를 사용할 때

  1. 유틸리티 함수: 인스턴스 데이터가 필요하지 않은 연산을 할 때.
  2. 공장 메서드: 클래스의 인스턴스를 생성하고 반환할 때.
  3. 상태 독립적 연산: 동일한 입력에 대해 항상 동일한 출력을 생성하는 함수.

보다 복잡한 예제를 보겠습니다:

class StringUtils {
static capitalize(str: string): string {
return str.charAt(0).toUpperCase() + str.slice(1);
}

static reverse(str: string): string {
return str.split('').reverse().join('');
}

static countVowels(str: string): number {
return (str.match(/[aeiou]/gi) || []).length;
}
}

console.log(StringUtils.capitalize("hello")); // 출력: Hello
console.log(StringUtils.reverse("world"));    // 출력: dlrow
console.log(StringUtils.countVowels("beautiful")); // 출력: 5

StringUtils 클래스는 여러 문자열 조작 메서드를 제공합니다. 이 메서드들은 인스턴스 데이터가 필요하지 않으므로 정적 메서드로 적합합니다.

정적 속성과 메서드의 결합

정적 속성과 메서드는 함께 잘 작동합니다. 예제를 보겠습니다:

class Config {
static apiUrl: string = "https://api.example.com";
static apiKey: string = "abc123";

static getHeaders(): object {
return {
"Authorization": `Bearer ${this.apiKey}`,
"Content-Type": "application/json"
};
}

static async fetchData(endpoint: string): Promise<any> {
const response = await fetch(`${this.apiUrl}/${endpoint}`, {
headers: this.getHeaders()
});
return response.json();
}
}

// 사용법
Config.fetchData("users").then(data => console.log(data));

이 예제에서 Config 클래스는 정적 속성(apiUrlapiKey)과 정적 메서드(getHeadersfetchData)를 가지고 있습니다. fetchData 메서드는 정적 속성과 getHeaders 메서드를 사용하여 API 요청을 수행합니다.

정적 메서드와 속성: 빠른 참조

정적 메서드와 속성에 대한 주요 포인트를 요약한 표입니다:

기능 정적 비정적
속해 있는 곳 클래스 인스턴스
접근 방법 ClassName.member instanceName.member
this 접근 없음 (클래스를 참조) 있음 (인스턴스를 참조)
적합한 경우 유틸리티 함수, 공유 데이터 인스턴스 특정 동작과 데이터
메모리 사용 클래스 당 하나의 사본 인스턴스 당 하나의 사본

결론

정적 메서드와 속성은 TypeScript(그리고 일반적으로 객체 지향 프로그래밍에서)에서 강력한 도구입니다. 이를 통해 클래스 자체에 속하는 유틸리티 함수와 공유 데이터를 생성할 수 있어 더 정리되고 효율적인 코드를 작성할 수 있습니다.

젊은 마법사 여러분, 강력한 힘에는 큰 책임이 따릅니다. 정적 멤버를 지혜롭게 사용하면 코딩 여정에서 큰 도움이 될 것입니다!

이제 TypeScript 프로젝트에서 정적 마법을 부르러 가보세요! 그리고 언제나 막히게 되면, 특히 어려운 potion 레시피를 디버깅하는 것을 상상하면 됩니다 - 인내와 지속적인 노력이 당신을 성공으로 이끌어 줄 것입니다!

Credits: Image by storyset