IMCAT.DEV
로그인 가입
Zig 중급 객체지향

Zig 객체지향 프로그래밍 기초

Zig 객체지향 프로그래밍 기초 — 중급

Zig 객체지향 프로그래밍 기초

1. 도입 (왜 배워야 하는가)

Zig 언어는 시스템 프로그래밍을 위한 저수준 언어로, 메모리 관리와 성능 최적화에 강점을 가지고 있습니다. 그러나 객체지향 프로그래밍(OOP)의 패러다임을 이해하고 활용하면, 코드를 더 체계적이고 재사용 가능하게 만들 수 있습니다. 실무에서는 복잡한 애플리케이션을 관리하기 위해 OOP 개념을 적용해야 할 때가 많습니다. 객체지향 프로그래밍을 모르면, 코드의 유지보수성이나 확장성이 떨어져 대규모 프로젝트에서 어려움을 겪을 수 있습니다.

2. 핵심 개념 설명

객체 (Object)

객체는 상태(속성)와 행동(메서드)을 가진 인스턴스입니다. 예를 들어, "자동차"라는 객체는 색상, 모델, 속도와 같은 속성과 주행, 정지와 같은 행동을 가질 수 있습니다.

클래스 (Class)

클래스는 객체의 설계도입니다. 자동차라는 클래스는 여러 자동차 객체를 생성할 수 있는 틀을 제공합니다.

상속 (Inheritance)

상속은 기존 클래스의 속성과 메서드를 새로운 클래스에서 재사용할 수 있게 해 줍니다. 예를 들어, "전기자동차"는 "자동차" 클래스를 상속받아 추가적인 속성이나 메서드를 가질 수 있습니다.

용어설명
객체상태와 행동을 가진 인스턴스
클래스객체를 생성하기 위한 설계도
상속기존 클래스의 속성과 메서드를 재사용

3. 기본 코드 예제

다음은 Zig로 간단한 클래스를 정의하고 객체를 생성하는 예제입니다.

const std = @import("std");

const Car = struct {
    color: []const u8,
    model: []const u8,
    speed: i32,

    pub fn drive(self: *Car) void {
        std.debug.print("Driving {} {} at {} km/h\n", .{self.color, self.model, self.speed});
    },
};

pub fn main() !void {
    var myCar = Car{
        .color = "Red",
        .model = "Tesla Model S",
        .speed = 100,
    };

    myCar.drive();
}

실행 결과

Driving Red Tesla Model S at 100 km/h

코드 한 줄씩 동작 설명

  1. const std = @import("std"); - Zig의 표준 라이브러리를 가져옵니다.
  2. const Car = struct { ... }; - 자동차 클래스를 정의합니다.
  3. pub fn drive(self: *Car) void { ... } - 자동차가 주행하는 메서드를 정의합니다.
  4. pub fn main() !void { ... } - 메인 함수에서 프로그램의 시작을 정의합니다.
  5. var myCar = Car{ ... }; - 자동차 객체를 생성합니다.
  6. myCar.drive(); - 생성한 자동차 객체의 drive 메서드를 호출하여 주행합니다.
  7. 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 구현

    쇼핑몰 애플리케이션에서 장바구니를 구현할 때, 장바구니는 여러 상품 객체를 포함합니다.

    const std = @import("std");
    
    const Product = struct {
        name: []const u8,
        price: f64,
    };
    
    const Cart = struct {
        items: []Product,
    
        pub fn addItem(self: Cart, item: Product) void {
            self.items.append(item);
        },
    
        pub fn totalPrice(self: Cart) f64 {
            var total: f64 = 0;
            for (self.items) |item| {
                total += item.price;
            }
            return total;
        },
    };
    
    pub fn main() !void {
        var myCart = Cart{ .items = &[_]Product{} };
    
        myCart.addItem(Product{ .name = "Laptop", .price = 1200.00 });
        myCart.addItem(Product{ .name = "Mouse", .price = 25.00 });
    
        std.debug.print("Total Price: ${:.2f}\n", .{myCart.totalPrice()});
    }

    실행 결과

    Total Price: $1225.00

    코드 설명

    • Product 구조체로 상품을 정의하고, Cart 구조체로 장바구니를 정의합니다.
    • addItem 메서드로 상품을 장바구니에 추가하고, totalPrice 메서드로 총 가격을 계산합니다.
    • 5. 흔한 실수와 주의사항

      실수 1: 메서드 호출 시 self를 잘못 사용

      pub fn drive(self: *Car) void {
          std.debug.print("Driving {} {} at {} km/h\n", .{color, model, speed}); // 잘못된 코드
      }
    • 올바른 코드:
    • std.debug.print("Driving {} {} at {} km/h\n", .{self.color, self.model, self.speed});
    • self를 사용하지 않으면 해당 속성을 찾지 못합니다.
    • 실수 2: 객체를 복사할 때 주소 참조 문제

      var myCar2 = myCar; // 잘못된 코드: 얕은 복사
    • 올바른 코드:
    • var myCar2 = myCar; // 깊은 복사를 원할 경우 복사 메서드 필요
    • 객체가 크거나 복잡할 경우 얕은 복사가 문제를 일으킬 수 있습니다.
    • 6. 정리

    • Zig에서 객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높입니다.
    • 객체와 클래스, 상속 개념을 통해 시스템을 더 체계적으로 설계할 수 있습니다.
    • 실무에서 장바구니와 같은 패턴을 사용하여 확장 가능한 코드를 작성할 수 있습니다.

다음에 학습하면 좋은 주제는 Zig의 메모리 관리나 비동기 프로그래밍입니다. 이 주제들은 객체지향 프로그래밍을 활용한 시스템 프로그래밍에서 매우 중요한 요소입니다.