학습
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
코드 한 줄씩 동작 설명
const std = @import("std");- Zig의 표준 라이브러리를 가져옵니다.const Car = struct { ... };- 자동차 클래스를 정의합니다.pub fn drive(self: *Car) void { ... }- 자동차가 주행하는 메서드를 정의합니다.pub fn main() !void { ... }- 메인 함수에서 프로그램의 시작을 정의합니다.var myCar = Car{ ... };- 자동차 객체를 생성합니다.myCar.drive();- 생성한 자동차 객체의 drive 메서드를 호출하여 주행합니다.Product구조체로 상품을 정의하고,Cart구조체로 장바구니를 정의합니다.addItem메서드로 상품을 장바구니에 추가하고,totalPrice메서드로 총 가격을 계산합니다.- 올바른 코드:
self를 사용하지 않으면 해당 속성을 찾지 못합니다.- 올바른 코드:
- 객체가 크거나 복잡할 경우 얕은 복사가 문제를 일으킬 수 있습니다.
- Zig에서 객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높입니다.
- 객체와 클래스, 상속 개념을 통해 시스템을 더 체계적으로 설계할 수 있습니다.
- 실무에서 장바구니와 같은 패턴을 사용하여 확장 가능한 코드를 작성할 수 있습니다.
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
코드 설명
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});
실수 2: 객체를 복사할 때 주소 참조 문제
var myCar2 = myCar; // 잘못된 코드: 얕은 복사
var myCar2 = myCar; // 깊은 복사를 원할 경우 복사 메서드 필요
6. 정리
다음에 학습하면 좋은 주제는 Zig의 메모리 관리나 비동기 프로그래밍입니다. 이 주제들은 객체지향 프로그래밍을 활용한 시스템 프로그래밍에서 매우 중요한 요소입니다.