타입스크립트
자바스크립트의 상위 집합
자바스크립트의 한계를 해결
타입스크립트를 쓰는 이유
동적 타입을 정적으로
let a;
a = 1;
a = 'b';
let a : number;
a = 1;
a = 'b'; // type error
타입 유추를 통한 타입 제어
const sum = (a,b) => {
return a+b
}
sum(1, "2") // 12
const sum = (a: number, b: number) => {
return a + b;
}
sum(1, 2); // 3
object와 reference 형태가 아닌 실제 값을 저장하는 자료형
primitive type 내장 함수를 사용 가능한 것은 자바스크립트 처리 방식 덕분
객체, 배열, 함수 등과 같은 Object 형식의 타입
메모리에 값을 주소로 저장하고, 출력 시 메모리 주소와 일치하는 값을 출력
TypeScript는 공통 타입 변환을 용이하게 하기 위해 유틸리티 타입을 제공한다.
유틸리티 타입은 전역으로 사용 가능하다.
함수를 정의할때 사용되는 변수를 매개변수라고 한다.
함수를 호출할때 사용되는 값을 인수라고 한다.
function add(x, y) {
return x+y;
}
add(2, 5);
x, y는 인자 값 = 매개변수 = parameter
2, 5는 인수 = argument
https://amagrammer91.tistory.com/9
// 1. 함수 선언식
function world(name) {
return `hello${name}`;
}
// 2. 함수 표현식
let world2 = function (name) {
return `hello${name}`;
}
// 3. 화살표 함수 표현식
let world3 = (name) => {
return `hello${name}`;
}
// 4. 단축형 화살표 함수 표현식
let world4 = (name) => `hello${name}`;
// 5. 함수 생성자, 권장 x
let world5 = new Function("name", 'return "hello" + name');
let f12 = function(x: number, y: number): number {
return x+y;
}
let f12: (baseValue: number, increment:number) => number = function(x,y) {
return x+y;
}
function buildName(firstName: string, lastName?: string) {
if (lastName) return firstName + "" + lastName;
else return firstName;
}
function buildName(firstName: string, lastName= "smith") {
return firstName + "" + lastName;
}
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + "" + restOfName.join('');
}
장점:
프로그램을 유연하고 변경이 용이하게 만든다.
개발, 보수 간편
직관적인 코드 분석 가능
강한 응집력과 약한 결합력 지향
클래스의 요소 : 멤버, 필드, 생성자, 메소드
인스턴스: new 연산자에 의해서 생성된 객체
Class 생성하기
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
say() {
return "Hello, My name is " + this.name;
}
}
let Person = new Person("june");
class Animal {
public name: string
constructor(name:string) {
this.name = name;
}
}
new Animal("cat").name;
class Animal {
private name: string
constructor(name:string) {
this.name = name;
}
}
new Animal("cat").name; // 에러
class Animal {
move(distanceInMeters:number) {
console.log('Animalmoved${distanceInMeters}m.');
}
}
class Dog extends Animal {
makeSound(){
console.log("멍멍!");
}
}
class Cat extends Animal {
makeSound(){
console.log("야옹!");
}
}
const dog = new Dog();
dog.move(10);
dog.makeSound();
const cat=newCog();
cat.move(5);
cat.makeSound();
class Person {
private _name: string
get name() {
return this._name;
}
set name(name: string) {
if (name.length > 10) {
throw new Error ("name too long")
}
this._name = name;
}
}
abstract class Animal {
protected name: string
constructor(name: string) {
this.name = name;
}
abstract makeSound(): void
move(): void {
console.log("move!!");
}
}
class Dog extends Animal {
constructor(name: string) {
super(name); // 파생된 클래스의 생성자는 반드시 super()를 호출
}
makeSound(): void { // 반드시 파생된 클래스에서 구현 필수
console.log(this.name + "멍멍");
}
}
const animal = new Animal("animal"); // 에러
const dog = new Dog("진돗개");
dog.makeSound(); // 진돗개 멍멍
추상클래스를 활용한 디자인 패턴
전체적인 알고리즘은 상위 클래스에서 구현하고 다른 부분은 하위 클래스에서 구현한다.