목록으로

프로그래밍 · TypeScript

TypeScript 입문자를 위한 완전한 기술 소개

BeanCon
TypeScript 컴파일 흐름과 타입 시스템을 표현한 기술 일러스트

TypeScript의 기본 개념, 설치, 프로젝트 구성, 타입 시스템, 인터페이스, 클래스, 제네릭, tsconfig 설정, 초보자 실수와 학습 로드맵까지 입문자가 알아야 할 핵심을 정리합니다.

TypeScript란 무엇인가?

TypeScript는 Microsoft가 개발한 오픈소스 프로그래밍 언어입니다. JavaScript를 기반으로 하며 정적 타입, 인터페이스, 제네릭, 향상된 개발 도구 지원 같은 기능을 추가합니다.

TypeScript는 품질 검사를 한 겹 더한 JavaScript라고 이해할 수 있습니다. 개발자는 TypeScript를 작성하고, 컴파일러는 이를 브라우저와 Node.js가 실행할 수 있는 일반 JavaScript로 변환합니다.

TypeScript 코드 (.ts)
TypeScript 컴파일러 (tsc)
JavaScript 코드 (.js)
Browser / Node.js

TypeScript가 만들어진 이유

JavaScript 애플리케이션 규모가 커지면서 개발자들은 다음과 같은 공통 문제를 겪기 시작했습니다.

잘못된 데이터 타입으로 인한 런타임 오류
대규모 코드베이스 유지보수의 어려움
안전하지 않은 코드 리팩터링
객체와 함수 구조를 명확히 설명하는 문서화 부족

TypeScript는 코드가 실행되기 전에 문제를 점검함으로써 이러한 어려움을 줄여 줍니다.

학습 전 준비 지식

TypeScript를 배우기 전에는 다음 JavaScript 기본기를 알고 있는 것이 좋습니다.

변수
함수
배열
객체
반복문
JavaScript 기본 문법
ES6 문법: let, const, 화살표 함수

TypeScript 설치

Node.js 설치

공식 웹사이트에서 Node.js를 다운로드해 설치합니다. 설치 후 다음 명령으로 확인합니다.

node -v
npm -v

TypeScript 설치

전역 설치 명령은 다음과 같습니다.

npm install -g typescript

설치를 확인합니다.

tsc -v

예시는 다음과 같습니다.

Version 5.8.2

첫 프로젝트 만들기

프로젝트 폴더를 생성합니다.

mkdir typescript-demo
cd typescript-demo

npm을 초기화합니다.

npm init -y

TypeScript를 로컬 개발 의존성으로 설치합니다.

npm install --save-dev typescript

설정 파일을 생성합니다.

npx tsc --init

프로젝트 구조는 다음처럼 구성할 수 있습니다.

typescript-demo/
├── node_modules/
├── src/
├── src/app.ts
├── package.json
└── tsconfig.json

첫 TypeScript 프로그램

다음 파일을 생성합니다.

// app.ts

let message: string = "Hello TypeScript";

console.log(message);

컴파일합니다.

tsc app.ts

실행합니다.

node app.js

출력 결과는 다음과 같습니다.

Hello TypeScript

변수

문자열

let name: string = "Alice";

숫자

let age: number = 25;

불리언

let isAdmin: boolean = false;

타입 추론

TypeScript는 타입을 자동으로 판단할 수 있습니다.

let city = "Seoul";

이 코드를 보면 TypeScript는 자동으로 string 타입이라는 것을 압니다.

기본 데이터 타입

타입
예시
string
"Hello"
number
100
boolean
true
null
null
undefined
undefined
bigint
100n
symbol
Symbol()

배열

let numbers: number[] = [1,2,3];

문자열 배열은 다음처럼 작성할 수 있습니다.

let colors: string[] = [
    "Red",
    "Blue",
    "Green"
];

다른 문법도 사용할 수 있습니다.

let numbers: Array<number> = [1,2,3];

객체

let user: {
    name: string;
    age: number;
};

예시는 다음과 같습니다.

let user = {
    name: "Alice",
    age: 25
};

함수

타입을 지정하지 않은 함수

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

문제 상황은 다음과 같습니다.

add("10",20)

출력 결과는 1020입니다.

TypeScript로 타입을 지정한 함수

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

이제 다음 호출은 컴파일러 오류를 발생시킵니다.

add("10",20)

선택적 매개변수

function greet(
    name:string,
    age?:number
){
    console.log(name);
}

다음 호출은 모두 유효합니다.

greet("Alice");
greet("Alice",25);

기본 매개변수

function hello(name:string="Guest"){
    console.log(name);
}

유니언 타입

변수는 여러 타입을 허용할 수 있습니다.

let id:number|string;

예시는 다음과 같습니다.

id=100;
id="ABC123";

타입 별칭

type UserID = string;

let id:UserID="USER001";

인터페이스

인터페이스는 객체의 형태를 정의합니다.

interface User{

    id:number;

    name:string;

    email:string;

}

사용 예시는 다음과 같습니다.

const user:User={

    id:1,

    name:"John",

    email:"john@test.com"

};

클래스

class Car{

    brand:string;

    constructor(brand:string){

        this.brand=brand;

    }

}

객체는 다음처럼 생성합니다.

const car=new Car("Tesla");

접근 제한자

접근 제한자
설명
public
어디서든 접근할 수 있습니다.
private
클래스 내부에서만 접근할 수 있습니다.
protected
하위 클래스에서 접근할 수 있습니다.

열거형

enum Direction{

    Up,

    Down,

    Left,

    Right

}

사용 예시는 다음과 같습니다.

let move=Direction.Up;

제네릭

제네릭은 재사용 가능하면서도 타입 안전한 함수를 만들 수 있게 해줍니다.

function first<T>(items:T[]):T{

    return items[0];

}

사용 예시는 다음과 같습니다.

first<number>([1,2,3]);

first<string>(["A","B"]);

any와 unknown

any

let value:any;

무엇이든 허용됩니다. 권장되지 않습니다.

unknown

let value:unknown;

사용하기 전에 타입을 확인해야 하므로 더 안전합니다.

타입 단언

let value:any="Hello";

let length=(value as string).length;

컴파일

파일 하나를 컴파일합니다.

tsc app.ts

감시 모드는 다음과 같습니다.

tsc --watch

tsconfig.json

예시는 다음과 같습니다.

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "strict": true,
    "outDir": "./dist",
    "rootDir": "./src"
  }
}

중요 옵션은 다음과 같습니다.

옵션
목적
target
생성할 JavaScript 버전을 지정합니다.
module
ESM, CommonJS 등 모듈 시스템을 지정합니다.
strict
모든 엄격한 타입 검사를 활성화합니다.
rootDir
소스 디렉터리를 지정합니다.
outDir
출력 디렉터리를 지정합니다.
sourceMap
디버깅용 소스맵을 생성합니다.

초보자가 자주 하는 실수

any를 모든 곳에 사용하는 것

let value:any;

이 방식은 TypeScript의 많은 장점을 비활성화합니다. 가능한 구체적인 타입을 사용하고, 필요할 때는 unknown을 선택하는 것이 좋습니다.

컴파일러 오류를 무시하는 것

컴파일러 오류는 버그를 조기에 잡아 주는 중요한 힌트입니다.

컴파일을 잊는 것

TypeScript 파일(.ts)은 컴파일하거나 ts-node 같은 런타임을 사용하지 않으면 Node.js에서 직접 실행할 수 없습니다.

JavaScript와 TypeScript를 부주의하게 섞는 것

JavaScript 코드를 점진적으로 이전하고, 프로젝트가 성숙해질수록 더 엄격한 컴파일러 옵션을 활성화하는 것이 좋습니다.

추천 학습 로드맵

단계
학습 주제
입문
변수, 원시 타입, 배열, 객체, 함수
중급
인터페이스, 클래스, 열거형, 유니언 타입, 타입 별칭
고급
제네릭, 유틸리티 타입, 데코레이터(적용 가능한 경우), 모듈
전문
타입 추론, 조건부 타입, 매핑된 타입, 선언 파일, 컴파일러 설정

모범 사례

tsconfig.json에서 strict 모드를 사용합니다.
any보다 interface 또는 type을 우선합니다.
함수는 하나의 역할에 집중시키고 강하게 타입을 지정합니다.
타입이 명확할 때는 과도하게 타입을 붙이기보다 TypeScript의 타입 추론을 활용합니다.
코드는 모듈과 재사용 가능한 타입으로 정리합니다.
Visual Studio Code 같은 최신 편집기를 사용해 자동 완성, 리팩터링, 인라인 타입 검사를 활용합니다.

결론

TypeScript는 강력한 타입 시스템을 통해 JavaScript를 확장하며, 더 안전하고 유지보수하기 쉽고 확장 가능한 애플리케이션을 작성하도록 도와줍니다. 학습 곡선은 조금 있지만 프로젝트가 커질수록 그 효과가 분명해집니다.

대부분의 현대 웹 개발에서 실용적인 학습 순서는 다음과 같습니다.

JavaScript 기초
TypeScript 기본기
TypeScript 기반 React / Next.js 또는 Node.js
고급 TypeScript 패턴
운영 환경에 적합한 애플리케이션

기초를 먼저 확실히 익히면 고급 TypeScript 기능도 자연스럽게 이해할 수 있으며, 프론트엔드, 백엔드, 풀스택 개발을 위한 탄탄한 기반을 마련할 수 있습니다.

댓글

0

댓글을 불러오는 중입니다.