본문으로 건너뛰기

2장: 타입

강타입과 약타입​

강타입​

  • 타입의 변환이 엄격해 서로 다른 타입과의 변환이 자동으로 이루어지지 않거나 제한적으로 허용됨.
let num: number = 10;
let str: string = "20";

//console.log(num + str); // ❌ 오류: number와 string을 더할 수 없음

// 명시적 변환이 필요
console.log(num + Number(str)); // ✅ 30 (명시적 변환 후 연산)

약타입​

  • 타입의 변환이 자동으로 이루어져 코드가 유연해지지만 오류 발생 확률이 높음.
let num = 10;
let str = "20";

console.log(num + str); // ❗ "1020" (자동 형 변환, 숫자가 문자열로 변환됨)
console.log(num - str); // ✅ -10 (문자열이 숫자로 변환됨)


특징강타입약타입
엄격성엄격함유연함
자동변환없음 (명시적변환 필요)있음 (암시적 변환)
안정성높음낮을 가능성 있음
대표 언어TypeScript, Python, Java, C#JavaScript, PHP

타입스크립트의 계층 구조​

TypeScript는 원시 타입과 객체 타입을 구분해서 안정성을 확보하고 예상치 못한 참조 문제를 해결할 수 있다고 한다. 하지만 이 말을 이해하려면 먼저 원시 타입과 객체 타입이 무엇인지 알아야 한다.

원시 타입과 객체 타입을 나누는 이유에는 메모리 처리 방식의 차이도 있지만 여기서는 값과 비교방식의 차이만 알아보자.

원시 타입​

JavaScript의 원시타입과 동일하지만 TypeScript에서는 이를 명시적으로 지정할 수 있다.

타입설명예제 코드
number숫자 (정수, 부동소수점 포함)let num: number = 42;
string문자열let str: string = "Hello";
boolean참/거짓 값let isDone: boolean = true;
null값이 없음(의도적)let n: null = null;
undefined값이 할당되지 않음let u: undefined = undefined;
bigint큰 정수 값 (ES2020 이상)let big: bigint = 9007199254740991n;
symbol고유한 값 생성 (ES2015 이상)let sym: symbol = Symbol("key");
  • 변수
let age: number = 25;    // 숫자 타입
let name: string = "Alice"; // 문자열 타입
let isStudent: boolean = true; // 불리언 타입

객체 타입​

TypeScript에서 객체 타입은 특정 속성과 해당 속성의 타입을 정의하여 구조적으로 타입을 검증할 수 있다.

개념설명예제 코드
기본 객체 타입{ key: type } 형태로 정의{ name: string; age: number }
선택적 속성?를 사용하여 속성을 선택적으로 설정{ name: string; age?: number }
읽기 전용 속성readonly를 사용하여 수정 불가{ readonly id: number }
type 사용객체 타입을 별칭으로 정의type User = { name: string; age: number }
interface 사용객체 타입을 정의 (확장 가능)interface User { name: string; age: number }
extends인터페이스 확장interface Employee extends Person {}
인덱스 타입키를 동적으로 설정 가능{ [key: string]: string }
유니언 타입여러 타입 중 하나 가능let pet: Dog | Cat;
인터섹션 타입모든 속성을 포함해야 함let worker: Programmer & Designer;
  • 배열
let numbers: number[] = [1, 2, 3, 4, 5]; // 숫자 배열
let names: string[] = ["Alice", "Bob", "Charlie"]; // 문자열 배열
let numbers: Array<number> = [1, 2, 3, 4, 5];
  • 객체
let person: { name: string; age: number; isStudent: boolean } = {
name: "Alice",
age: 25,
isStudent: true
};
  • 함수

(1) 매개변수와 반환값 타입 지정

function add(a: number, b: number): number {
return a + b;
}

console.log(add(10, 20)); // 30
// console.log(add(10, "20")); // ❌ 오류 발생

(2) 반환값이 없는 함수 (void 타입)

function greet(name: string): void {
console.log(`Hello, ${name}!`);
}

greet("Alice"); // "Hello, Alice!"
  • 콜백 함수
type MathOperation = (x: number, y: number) => number;

const multiply: MathOperation = (a, b) => a * b;

console.log(multiply(5, 3)); // 15
  • 인터페이스
interface Person {
name: string;
age: number;
isStudent?: boolean; // 선택적 속성
}

const user: Person = {
name: "Bob",
age: 30
};
  • 제너릭
function identity<T>(value: T): T {
return value;
}

console.log(identity<string>("Hello")); // "Hello"
console.log(identity<number>(42)); // 42
  • 유니온
let id: number | string; // 숫자 또는 문자열 가능
id = 123;
id = "ABC123";

작성하며 느낀 점​

  • 좋았던 점 : 타입 명시적 지정으로 코드 안정성이 향상되었고, 다양한 타입 활용법을 배울 수 있었다.

  • 배운 점 : 강타입과 약타입의 차이, 타입 계층 구조, 선택적 속성 및 제너릭 개념을 익혔다.

  • 부족했던 점 : 실전에서 타입 활용 연습이 부족했고, 유니온·인터섹션 타입과 타입 추론에 대한 이해가 더 필요했다.

  • 다음 목표 : 다양한 타입 패턴을 경험하고 제너릭을 활용하여 타입스크립트를 리액트에서 잘 쓰게 되는 것이 목표이다.