🔷 Haskell에서 데이터 유형 정의 및 활용: 구조체(Record)와 타입 클래스

Haskell 문법

초급 난이도
문법 타입
10/12 등록일

Haskell에서 데이터 유형 정의 및 활용: 구조체(Record)와 타입 클래스

초급
태그
기초 문법 입문 구조체 타입클래스 Haskell
# Haskell에서 데이터 유형 정의 및 활용: 구조체(Record)와 타입 클래스

Haskell은 강력한 타입 시스템을 제공하며, 이를 통해 코드의 안정성과 재사용성을 높일 수 있습니다. 이 튜토리얼에서는 Haskell에서 데이터를 표현하는 두 가지 핵심 개념인 **구조체(Record)** 와 **타입 클래스(Type Class)** 를 살펴봅니다.

## 구조체 (Record)

구조체는 관련된 데이터 필드를 하나의 단위로 묶어 놓은 것입니다. Haskell에서는 `data` 키워드를 사용하여 구조체를 정의합니다.

```haskell data Person = Person { name :: String, age :: Int, city :: String } deriving (Show) ```

**설명:**
* `data Person`: `Person`이라는 이름의 새로운 데이터 유형을 정의합니다.
* `=`: 구조체의 필드를 정의합니다.
* `{ name :: String, age :: Int, city :: String }`: `name`, `age`, `city`라는 세 개의 필드와 각각의 타입(String, Int, String)을 정의합니다. `::` 연산자는 타입 힌트를 제공합니다.
* `deriving (Show)`: `Show` 타입 클래스를 유도하여 `Person` 객체를 문자열로 표현할 수 있도록 합니다. `Show` 타입 클래스는 Haskell에서 객체의 내용을 쉽게 출력하기 위한 것입니다.

**사용법:**

```haskell let person1 = Person { name = "Alice", age = 30, city = "New York" } print person1 -- Output: Person {name = "Alice", age = 30, city = "New York"} ```

## 타입 클래스 (Type Class)

타입 클래스는 관련된 함수 인터페이스를 정의하는 것입니다. 타입 클래스를 사용하면 여러 데이터 유형에 대해 동일한 동작을 수행하도록 할 수 있습니다. Haskell에서는 `where` 절 내에서 타입 클래스를 정의합니다.

```haskell class Printable a where
printIt :: a -> String

instance Printable Int where
printIt x = "The age is: " ++ show x

instance Printable String where
printIt str = "The name is: " ++ str

main :: IO ()
main = do
let age = 30
putStrLn (printIt age) -- Output: The age is: 30
let name = "Bob"
putStrLn (printIt name) -- Output: The name is: Bob ```

**설명:**
* `class Printable a where`: `Printable`이라는 이름의 타입 클래스를 정의합니다. `a`는 데이터 유형을 나타냅니다.
* `printIt :: a -> String`: `Printable` 타입 클래스에 속하는 모든 유형(a)에 대해 `printIt`라는 함수가 필요하다는 것을 선언합니다. 이 함수는 어떤 유형의 인수를 받아서 문자열을 반환해야 합니다.
* `instance Printable Int where`: `Int` 데이터 유형에 대한 `Printable` 타입 클래스의 구현을 제공합니다. `printIt` 함수는 `Int` 유형의 인수를 받아 문자열로 변환하여 반환합니다.
* `instance Printable String where`: `String` 데이터 유형에 대한 `Printable` 타입 클래스의 구현을 제공합니다.

**주요 특징:**
* **코드 재사용성**: 타입 클래스를 사용하면 여러 유형에 대해 동일한 함수를 정의할 필요가 없습니다. `Printable` 타입 클래스는 `Int`와 `String` 모두에 대한 `printIt` 함수를 제공합니다.
* **Ad-hoc Polymorphism (다형성)**: 타입 클래스 덕분에 Haskell은 ad-hoc polymorphism을 지원하여 데이터 유형이 다르더라도 동일한 함수를 사용할 수 있습니다.

## 주의사항
* 타입 클래스의 `instance` 정의 시, 타입 클래스의 모든 함수를 구현해야 합니다. 만약 타입 클래스가 여러 함수를 요구한다면, 각 함수에 대한 `instance` 정의가 필요합니다.
* 타입 클래스를 잘못 사용하면 컴파일 에러가 발생할 수 있습니다. 타입 시스템의 규칙을 준수하는지 확인하고, 필요한 타입 힌트를 제공하는 것이 중요합니다.
코드 예제
# 구조체 예제
```haskell
data Person = Person { name :: String, age :: Int, city :: String } deriving (Show)

let person1 = Person { name = "Alice", age = 30, city = "New York" }
print person1

# 타입 클래스 예제
```haskell
type Printable a where
 printIt :: a -> String

instance Printable Int where
 printIt x = "The age is: " ++ show x

instance Printable String where
 printIt str = "The name is: " ++ str

main :: IO ()
main = do
 let age = 30
 putStrLn (printIt age)
 let name = "Bob"
 putStrLn (printIt name)
등록일: 2025년 10월 12일 21:09
언어 정보
언어
Haskell
카테고리
Functional
인기도
#24
학습 팁
코드를 직접 실행해보세요
변수를 바꿔가며 실험해보세요
오류가 나도 포기하지 마세요
다른 예제도 찾아보세요