호출 시그니처(call signatures) 코드 작성
- last(arr): 이 함수는 배열의 마지막 요소를 반환해야 합니다.
function last<T>(arr: T[]): T | undefined {
return arr.length > 0 ? arr[arr.length - 1] : undefined;
}
- 호출 시그니처: <T>(arr: T[]): T | undefined
- 설명:
- 제네릭 타입 T를 사용하여 다양한 타입의 배열을 처리할 수 있도록 했습니다.
- 배열이 비어있을 경우 undefined를 반환하도록 처리했습니다.
- prepend(arr, item): 이 함수는 배열의 시작 부분에 item을 넣고 배열을 return해야 합니다.
function prepend<T>(arr: T[], item: T): T[] {
return [item, ...arr];
}
- 호출 시그니처: <T>(arr: T[], item: T): T[]
- 설명: 스프레드 연산자(...)를 사용하여 간결하게 구현했습니다.
- mix(arr,arr) : 두개의 배열을 매개변수로 받아, 매개변수로 받은 두 배열을 하나의 배열로 섞어서 하나의 배열로 반환합니다.
function mix<T>(arr1: T[], arr2: T[]): T[] {
return [...arr1, ...arr2];
}
- 호출 시그니처: <T>(arr1: T[], arr2: T[]): T[]
- 설명: 스프레드 연산자를 사용하여 두 배열을 합쳐 새로운 배열을 생성합니다.
- count(arr) : 배열을 매개변수로 받아, 매개변수로 받아온 배열의 길이를 반환하면됩니다.
function count<T>(arr: T[]): number {
return arr.length;
}
- 호출 시그니처: <T>(arr: T[]): number
- 설명: 배열의 length 프로퍼티를 사용하여 길이를 반환합니다.
- findIndex(arr, item) : 첫번째 매개변수로 배열을, 두번째 매개변수로 받아온 item이 첫번째 매개변수 arr배열의 몇번째 index로 존재하는지 체크한후 존재한다면 몇번째 index인지 반환하고 존재하지않는다면 null을 반환합니다.
function findIndex<T>(arr: T[], item: T): number | null {
return arr.indexOf(item);
}
- 호출 시그니처: <T>(arr: T[], item: T): number | null
- 설명: indexOf 메서드를 사용하여 요소의 인덱스를 찾고, 찾지 못하면 1을 반환하는데, 여기서는 null로 변환하여 반환했습니다.
- slice(arr, startIndex, endIndex): 첫번째 매개변수로 배열 arr을 받고, 두번째 매개변수로 숫자 startIndex, 세번째 매개변수 숫자 endIndex를 받습니다. 첫번째 매개변수 arr을 두번째 매개변수로 받은 startIndex부터 세번째 매개변수로 받은 인덱스까지 자른 결과를 반환하면됩니다. 이때 세번째 매개변수는 필수 매개변수가 아닙니다.
function slice<T>(arr: T[], startIndex: number, endIndex?: number): T[] {
return arr.slice(startIndex, endIndex);
}
- 호출 시그니처: <T>(arr: T[], startIndex: number, endIndex?: number): T[]
- 설명: endIndex를 선택적 매개변수로 설정하여 생략할 수 있도록 했습니다.
추가 설명
- 제네릭: 다양한 타입의 데이터를 처리하기 위해 제네릭 타입 T를 사용했습니다.
- 스프레드 연산자: 배열을 펼쳐서 새로운 배열을 생성하거나 함수의 인수로 전달할 때 유용하게 사용됩니다.
- 인덱스 찾기: indexOf 메서드를 사용하여 배열에서 특정 요소의 인덱스를 찾습니다.
- 배열 자르기: slice 메서드를 사용하여 배열의 일부분을 추출합니다.
위 함수들을 활용하여 다양한 배열 관련 작업을 수행할 수 있습니다.
예시:
const numbers = [1, 2, 3, 4, 5];
const strings = ['a', 'b', 'c'];
const lastNumber = last(numbers); // 5
const prependedArray = prepend(numbers, 0); // [0, 1, 2, 3, 4, 5]
const mixedArray = mix(numbers, strings); // [1, 2, 3, 4, 5, 'a', 'b', 'c']
const countNumbers = count(numbers); // 5
const index = findIndex(numbers, 3); // 2
const slicedArray = slice(numbers, 1, 3); // [2, 3]
타입스크립트 클래스를 이용하여 Dic.(딕셔너리 dictionary) 클래스 코드 작성
// 단어와 정의의 구조를 나타내는 인터페이스 정의
interface Word {
term: string;
definition: string;
}
class Dict {
private words: { [key: string]: string } = {}; // 단어를 저장하는 딕셔너리
// 단어를 추가하는 메소드
add(term: string, definition: string): void {
if (!this.words[term]) {
this.words[term] = definition;
} else {
console.log(`${term}은(는) 이미 사전에 존재합니다.`);
}
}
// 단어의 정의를 리턴하는 메소드
get(term: string): string | undefined {
return this.words[term];
}
// 단어를 삭제하는 메소드
delete(term: string): void {
if (this.words[term]) {
delete this.words[term];
} else {
console.log(`${term}은(는) 사전에 존재하지 않습니다.`);
}
}
// 단어를 업데이트하는 메소드
update(term: string, definition: string): void {
if (this.words[term]) {
this.words[term] = definition;
} else {
console.log(`${term}은(는) 사전에 존재하지 않습니다.`);
}
}
// 모든 단어를 보여주는 메소드
showAll(): void {
Object.keys(this.words).forEach((term) => {
console.log(`${term}: ${this.words[term]}`);
});
}
// 사전 단어들의 총 개수를 리턴하는 메소드
count(): number {
return Object.keys(this.words).length;
}
// 단어를 업데이트하거나 존재하지 않으면 추가하는 메소드 (upsert)
upsert(term: string, definition: string): void {
this.words[term] = definition;
}
// 단어가 사전에 존재하는지 여부를 리턴하는 메소드
exists(term: string): boolean {
return !!this.words[term];
}
// 여러개의 단어를 한 번에 추가하는 메소드
bulkAdd(words: Word[]): void {
words.forEach((word) => {
this.add(word.term, word.definition);
});
}
// 여러개의 단어를 한 번에 삭제하는 메소드
bulkDelete(terms: string[]): void {
terms.forEach((term) => {
this.delete(term);
});
}
}
// 테스트
const myDict = new Dict();
myDict.add("apple", "A fruit that is sweet and crisp.");
myDict.add("banana", "A yellow fruit that is soft and sweet.");
myDict.showAll();
console.log("Total words:", myDict.count());
myDict.upsert("banana", "A fruit that monkeys love.");
myDict.showAll();
console.log("Exists 'apple'?", myDict.exists("apple"));
myDict.delete("apple");
console.log("Exists 'apple'?", myDict.exists("apple"));
myDict.bulkAdd([
{ term: "grape", definition: "A small, sweet fruit used to make wine." },
{ term: "watermelon", definition: "A large fruit with green rind and red flesh." },
]);
myDict.showAll();
myDict.bulkDelete(["banana", "grape"]);
myDict.showAll();
console.log("Total words:", myDict.count());
주요 메소드 설명:
- add(term, definition): 단어를 추가합니다. 이미 존재하는 단어를 추가할 경우 경고 메시지를 출력합니다.
- get(term): 해당 단어의 정의를 반환합니다.
- delete(term): 해당 단어를 삭제합니다.
- update(term, definition): 해당 단어의 정의를 업데이트합니다.
- showAll(): 사전의 모든 단어를 콘솔에 출력합니다.
- count(): 사전 내 단어의 개수를 반환합니다.
- upsert(term, definition): 단어가 존재하면 업데이트, 존재하지 않으면 추가합니다.
- exists(term): 단어가 사전에 존재하는지 여부를 반환합니다.
- bulkAdd(words): 여러 개의 단어를 한 번에 추가합니다.
- bulkDelete(terms): 여러 개의 단어를 한 번에 삭제합니다.
'Dev > TypeScript' 카테고리의 다른 글
TypeScript : Triple-Slash Directives (0) | 2024.09.30 |
---|---|
TypeScript : Class와 Interface (1) | 2024.09.28 |
TypeScript / 타입스크립트 개념 및 활용 (0) | 2024.09.26 |
[공식문서-Handbook] Everyday Types(언어의 원시 타입들) (0) | 2023.10.04 |
[공식문서-Handbook] The Basics(기초) (0) | 2023.09.27 |