🫐 Generics Generics 제네릭은 함수의 타입을 파라미터처럼 사용하는 것으로 any 타입의 훌륭한 대체 용도로 자주 쓰이는 듯 하다. 어떤 값을 받아 그대로 반환해주는 함수를 작성한다고 가정해보자! 이 때 인자로 들어오는 값의 타입이 number라면 number를 반환해주고, string이라면 string을 반환해주고, boolean이라면 boolean을 반환해주어야 할 것이다. 이를 토대로 함수를 작성해보면 3가지 경우의 수가 생각나는데 /* case 1 */ function getNumber(number: number): number { return number; } function getString(string: string): string { return string; } functio..
🫐 OOP - Composition Composition Inheritance의 의존성 문제를 해결하기 위한 방법이다. 위의 그림에서는 Bulgogi Cooking과 Kimchi Cooking이 Cooking과의 관계에서 한 단계의 상속 관계를 가지지만, Bulgogi Cooking에서 Soy Bulgogi나 Seasoned Bulgogi등이 상속되거나 Bulgogi Cooking이나 Kimchi Cooking을 합쳐서 Kimchi Bulgogi를 만들고자 한다면 상속이 문제점이 될 수 있다. 이런 경우 Cooking과 그 하위 객체들의 관계가 너무 밀접하게 연결되어 있어 의존도가 높고, Kimchi Bulgogi의 경우 Bulgogi Cooking과 Kimchi Cooking을 동시에 상속할 수 없기 ..
🫐 OOP - Polymorphism Poltmorphism 다형성은 같은 함수가 다양한 형태를 지니고 있는 것을 의미한다. 같은 slice()여도 고기와 배추를 써는 법은 다르기 때문에 각 객체마다 slice()의 동작은 다를 수 있다. Example type Ingredients = { [key: string]: { sliceable: boolean; boilable: boolean; }; }; interface Cook { cook(): void; } class Cooking implements Cook { constructor(protected ingredients: Ingredients) {} protected slice(): void { const canSlice: string[] = []; ..
🫐 OOP - Inheritance Inheritance 상속이란 기존에 생성된 객체를 기반으로 하는 새로운 객체를 만드는 것이다. 일반적으로 기존에 생성된 객체를 부모, 이를 기반으로 생성된 새로운 객체를 자식이라고 부른다. Abstract class interface처럼 abstract class를 상속받은 객체들은 꼭 부모에게 작성된 메소드를 구현해야한다. abstract class로 지정된 부모는 상속을 위한 이름만 존재하고 인스턴스 생성이 불가능하다. 또한 abstract로 지정된 메소드는 자식에서 구현하지 않으면 안된다. abstract class Cooking { constructor(ingredients: string[]) {} slice() {} boil() {} abstract cook..
🫐 OOP - Abstraction Abstraction 객체 내부의 구현이 어떻게 되어있는지 알 수 없어도 사용할 수 있는 것, 즉 객체의 공통적인 속성과 기능을 정의하여 추출하는 것을 추상화라고 한다. 앞선 OOP - Encapsulation에서 slice()와 boil()이라는 메소드를 구현해보았다. 사용자는 Cooking의 slice()와 boil()이 어떻게 구현되어 있는지는 몰라도 해당 메소드를 실행하면 썰고 끓일 수 있다는 것을 알 수 있다. 하지만 요리를 하는데 있어서 slice()와 boil() 말고도 다른 여러 과정들이 있을 수 있는데 그 경우 또 다른 메소드를 만들어 이 과정들을 한꺼번에 실행하도록 다시 추상화 해줄 수 있다. Interface 인터페이스는 특정 객체의 역할을 정의해 ..
🫐 OOP - Encapsulation Encapsulation 캡슐화는 서로 연관된 데이터를 하나의 캡슐로 묶어두는 것을 의미한다고 저번 포스팅에 작성해두었다. 이렇게 캡슐화를 하는 것에는 크게 2가지 이유가 존재한다. 데이터 보호 (data protection) - 클래스 내부에 정의된 데이터를 외부로부터 보호 데이터 은닉 (data hiding) - 내부의 동작을 감추고 필요한 부분만 외부에 노출 이 중 데이터 은닉을 실현하기 위해 쓸 수 있는 것이 바로 access modifier이다. Access modifier Access modifier는 데이터에 대한 접근(access)을 제어(modify)하는 것으로, public, private, protected가 존재한다. access modifie..
🫐 Object Oriented Programming Object Oriented Programming 객체 지향 프로그래밍은 서로 관련있는 데이터와 함수를 객체로 정의해서 객체끼리 상호작용 하도록 하는 프로그래밍 방법이다. 예를 들어, 재료, 썰기(), 끓이기() 등의 데이터와 함수를 묶어서 표현한 것을 Cooking 객체라고 표현할 수 있고, 이름, 학교, 공부() 등의 데이터와 함수를 묶어서 Student 객체로 표현한 것을 객체 지향 프로그래밍의 방법이라고 할 수 있다. 객체 지향 프로그래밍의 경우 이미 만들어진 객체를 확장, 재사용하여 Cooking 객체를 기반으로 한 Bulgogi Cooking, Kimchi Cooking 등의 객체를 만들수도 있기 때문에 확장성과 재사용성이 뛰어나다. OO..
🫐 Everyday Types Primitives string 모든 문자열 타입 const name: string = 'Shoupeach'; number 모든 숫자 타입 const age: number = 4; boolean true 또는 false 타입 const isApeach: boolean = true; undefined undefined만 지정 가능한 타입 const career: undefined = undefined; null null만 지정 가능한 타입 const career: null = null; undefined는 값의 여부를 모르는 경우, null은 값이 없는 경우 사용된다. 😃 Objects object 모든 JavaScript 객체 타입 let obj: object; obj = ..
🫐 TypeScript 맛보기 😋 TypeScript가 뭔데?! TypeScript는 JavaScript를 기반으로 정적 타입 문법을 추가한 언어이다. JavaScript는 런타임 시에 타입이 결정되는 동적인 특징을 갖고 있는데, 이를 컴파일타임 시에 타입이 지정되도록 정적으로 변환한 것이 바로 TypeScript이다. let name = 'Shoupeach'; name = true; /* 런타임시에 타입이 결정되기 때문에 string에서 boolean으로 변경해도 문제가 없다! */ let name: string = 'Shoupeach'; name = true; // 🚨 compile error occurred 🚨 /* 컴파일시에 타입이 결정되기 때문에 string에서 boolean으로 변경할 시 컴파..