동적 타이핑(Dynamic Typing)과 정적 타이핑(Static Typing)의 차이점은 무엇인가요?

김상욱·2024년 11월 14일

동적 타이핑(Dynamic Typing)과 정적 타이핑(Static Typing)의 차이점은 무엇인가요?

동적 타이핑과 정적 타이핑은 주로 변수의 데이터 타입이 결정되는 시점과 타입 검사의 방식

동적 타이핑(Dynamic Typing)

  • 타입 결정 시점 : 실행 시(runtime)에 변수의 타입이 결정 > 변수를 선언할 때 타입 명시x, 실행중에 자유롭게 타입이 변경. 코드 작성 속도가 빠르지만, 실행 시 타입 오류가 발생할 가능성 존재. 유연성이 높아 빠르게 프로토타이핑할 때 적합.
  • 즉, 간결한 코드가 작성하고 실행 중에 타입을 변경하거나 동적으로 새로운 속성을 추가하는 작업이 용이하나 실행 전에 타입 오류를 잡을 수 없어 타입 안전성이 낮아 디버깅 어려움
    ex) Python, JavaScript, Ruby, PHP
# 동적 타이핑 예시 (Python)
x = 10        # x는 정수 타입으로 초기화
x = "Hello"   # 이후 문자열 타입으로 변경
print(x)      # 실행 시 오류 없음

정적 타이핑(Static Typing)

  • 타입 결정 시점 : 컴파일 시에 변수의 타입이 결정
  • 변수를 선언할 때 반드시 타입을 명시하거나 컴파일러가 타입을 추론해야 한다. 변수의 타입이 고정되며 이후 변경할 수 없다. 그렇기에 오히려 컴파일 단계에서 타입 오류를 잡아낼 수 있어 높은 안정성 제공 + 코드의 가독성과 유지보수성이 향상
    ex) Java, C, C++, C#, Swift, Kotlin
// 정적 타이핑 예시 (Java)
int x = 10;      // x는 정수 타입으로 선언
x = "Hello";     // 컴파일 오류: 타입이 맞지 않음
System.out.println(x);

동적 타이핑(Dynamic Typing)과 정적 타이핑(Static Typing)의 개념은 이론적으로 이해하는 것도 중요하지만, 백엔드 개발자로서 실습을 통해 차이를 체감하는 것이 훨씬 더 큰 도움이 됩니다. 다음은 실습 아이디어와 학습 방향입니다:


1. 차이점 실습 아이디어

실습 1: 다양한 언어로 간단한 기능 구현하기

동적 타이핑 언어와 정적 타이핑 언어를 각각 사용해 동일한 기능을 구현해 봅니다.

  • 주제: 간단한 RESTful API를 만들어 보기
    • 예: 사용자 등록 및 조회
  • 언어 선택:
    • 동적 타이핑: Python (Flask, FastAPI) 또는 JavaScript (Node.js, Express)
    • 정적 타이핑: Java (Spring Boot), Kotlin (Ktor), 또는 C# (.NET Core)
# Python (동적 타이핑)
from flask import Flask, jsonify, request

app = Flask(__name__)
users = []

@app.route('/user', methods=['POST'])
def add_user():
    user = request.json  # 타입이 자유롭고 미리 정의되지 않음
    users.append(user)
    return jsonify(user), 201

@app.route('/users', methods=['GET'])
def get_users():
    return jsonify(users)

if __name__ == '__main__':
    app.run(debug=True)
// Java (정적 타이핑)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class UserApp {
    public static void main(String[] args) {
        SpringApplication.run(UserApp.class, args);
    }
}

@RestController
@RequestMapping("/user")
class UserController {
    private final List<User> users = new ArrayList<>();

    @PostMapping
    public User addUser(@RequestBody User user) {
        users.add(user);
        return user;
    }

    @GetMapping
    public List<User> getUsers() {
        return users;
    }
}

class User {
    private String name;
    private int age;

    // Getter & Setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
}
  • 목표:
    • 동적 타이핑에서는 타입의 유연성을 느껴보고,
    • 정적 타이핑에서는 컴파일러가 타입 검사를 통해 발생하는 오류를 사전에 방지하는 것을 체험합니다.

실습 2: 타입 관련 디버깅

  • 문제: API의 입력 데이터가 예상한 타입과 다를 때 어떻게 처리되는지 살펴보기
  • 방법:
    • 동적 타이핑 언어에서 잘못된 데이터를 전송하고 실행 시 오류가 발생하는지 확인
    • 정적 타이핑 언어에서는 컴파일 단계에서 에러가 발생하는지 확인
# 잘못된 입력 예시 (String 대신 Number 전송)
{
  "name": 12345,
  "age": "twenty"
}

실습 3: 동적 -> 정적으로 전환

  • 목표: 동적 타이핑 언어에 정적 타입을 추가해 안정성을 높여보는 경험
    • Python에서는 type hints와 mypy를 활용
    • JavaScript에서는 TypeScript로 전환
# Python with Type Hints
from typing import List, Dict

users: List[Dict[str, str]] = []

def add_user(name: str, age: int) -> Dict[str, str]:
    user = {"name": name, "age": age}
    users.append(user)
    return user

2. 학습 방향과 심화 실습

TypeScript로 동적 -> 정적 경험

JavaScript 기반 백엔드(Node.js) 개발을 TypeScript로 전환하며 동적 타이핑의 한계를 극복하는 경험을 쌓아보세요.

// TypeScript Example
interface User {
  name: string;
  age: number;
}

const users: User[] = [];

const addUser = (user: User): void => {
  users.push(user);
};

다양한 백엔드 언어 익히기

  • 정적 타이핑 언어인 Java나 Kotlin으로 대규모 백엔드 시스템을 개발하며 안정성과 유지보수성을 체험합니다.
  • 동적 타이핑 언어인 Python이나 Node.js로 빠른 프로토타이핑과 유연한 개발을 경험합니다.

코드 리뷰와 리팩토링

  • 동적 타이핑 언어로 작성한 코드에서 발생할 수 있는 잠재적 오류를 잡아보는 훈련을 하세요.
  • 정적 타이핑 언어에서 타입을 추상화하거나 제네릭을 사용하는 실습을 해 보세요.

3. 취업 실무에 도움되는 이유

  • 문제 해결 능력: 타입 검사를 활용해 오류를 예방하는 습관을 기를 수 있습니다.
  • 도구 숙련도: 동적/정적 언어별로 IDE와 디버깅 도구를 활용하는 능력을 키웁니다.
  • 기술 스택 확장: 회사마다 사용하는 언어와 스타일이 다르기 때문에 다양한 언어 경험이 강점이 됩니다.

추천 학습 자료

실습을 진행하면서 코드와 타입 관련 이슈를 기록하면 면접에서도 큰 장점으로 작용할 수 있습니다!

0개의 댓글