파이썬에서 C 스타일 구조체 사용하기
튜플 사용:
간단한 구조체를 정의하려면 튜플을 사용하는 것이 편리합니다. 튜플은 순서가 있는 값들의 모음이며, 키-값 쌍을 저장하는 데 유용합니다. 예를 들어, 학생 정보를 저장하는 구조체를 다음과 같이 정의할 수 있습니다:
학생 = (이름, 나이, 학과)
김철수 = 학생("김철수", 20, "컴퓨터공학")
print(김철수.이름) # 김철수 출력
print(김철수.나이) # 20 출력
print(김철수.학과) # 컴퓨터공학 출력
namedtuple 사용:
namedtuple
모듈을 사용하면 튜플에 이름을 지정하고, 더 쉽게 접근할 수 있는 속성을 만들 수 있습니다.
from collections import namedtuple
학생 = namedtuple('학생', ['이름', '나이', '학과'])
김철수 = 학생("김철수", 20, "컴퓨터공학")
print(김철수.이름) # 김철수 출력
print(김철수.나이) # 20 출력
print(김철수.학과) # 컴퓨터공학 출력
dataclasses 사용:
dataclasses
모듈은 파이썬 3.7부터 도입되었으며, 더욱 강력하고 유연한 구조체 정의 기능을 제공합니다. @dataclass
데코레이터를 사용하여 클래스를 선언하고, 속성 이름을 명시적으로 정의할 수 있습니다. 또한, 기본 생성자, 비교 연산자, 표현 문자열 등을 자동으로 생성하는 기능도 제공합니다.
from dataclasses import dataclass
@dataclass
class 학생:
이름: str
나이: int
학과: str
김철수 = 학생("김철수", 20, "컴퓨터공학")
print(김철수.이름) # 김철수 출력
print(김철수.나이) # 20 출력
print(김철수.학과) # 컴퓨터공학 출력
print(김철수) # 학생(이름='김철수', 나이=20, 학과='컴퓨터공학') 출력
struct 모듈 사용:
바이너리 데이터를 처리하거나, C 언어 코드와 상호 운용해야 하는 경우 struct
모듈을 사용할 수 있습니다. struct
모듈은 C 구조체와 호환되는 형식으로 데이터를 패킹하고 언패킹하는 기능을 제공합니다.
import struct
데이터 = struct.pack('!i', 1024)
print(데이터) # b'\x00\x00\x04\x00' 출력
숫자 = struct.unpack('!i', 데이터)
print(숫자) # (1024,) 출력
예제 코드
학생 = (이름, 나이, 학과)
김철수 = 학생("김철수", 20, "컴퓨터공학")
박영희 = 학생("박영희", 21, "정보공학")
print(김철수) # ("김철수", 20, "컴퓨터공학") 출력
print(박영희) # ("박영희", 21, "정보공학") 출력
for 학생 in (김철수, 박영희):
print(f"{학생[0]}은 {학생[1]}살이며 {학생[2]} 학과입니다.")
from collections import namedtuple
학생 = namedtuple('학생', ['이름', '나이', '학과'])
김철수 = 학생("김철수", 20, "컴퓨터공학")
박영희 = 학생("박영희", 21, "정보공학")
print(김철수.이름) # 김철수 출력
print(김철수.나이) # 20 출력
print(김철수.학과) # 컴퓨터공학 출력
for 학생 in (김철수, 박영희):
print(f"{학생.이름}은 {학생.나이}살이며 {학생.학과} 학과입니다.")
from dataclasses import dataclass
@dataclass
class 학생:
이름: str
나이: int
학과: str
김철수 = 학생("김철수", 20, "컴퓨터공학")
박영희 = 학생("박영희", 21, "정보공학")
print(김철수) # 학생(이름='김철수', 나이=20, 학과='컴퓨터공학') 출력
print(박영희) # 학생(이름='박영희', 나이=21, 학과='정보공학') 출력
for 학생 in (김철수, 박영희):
print(f"{학생.이름}은 {학생.나이}살이며 {학생.학과} 학과입니다.")
import struct
데이터 = struct.pack('!i', 1024)
print(데이터) # b'\x00\x00\x04\x00' 출력
숫자 = struct.unpack('!i', 데이터)
print(숫자) # (1024,) 출력
압축된_데이터 = struct.pack('!ii', 1024, 2048)
print(압축된_데이터) # b'\x00\x00\x04\x00\x00\x00\x08\x00'
해제된_데이터 = struct.unpack('!ii', 압축된_데이터)
print(해제된_데이터) # (1024, 2048) 출력
C 스타일 구조체를 사용하는 대체 방법
객체 지향 프로그래밍 방식을 사용하여 데이터를 저장하고 관리하는 경우, 클래스를 사용하는 것이 더 나은 방법일 수 있습니다. 클래스는 데이터 멤버와 메서드를 정의하여 데이터를 추상화하고 코드를 더욱 명확하고 유지 관리하기 쉽게 만들 수 있습니다.
class 학생:
def __init__(self, 이름, 나이, 학과):
self.이름 = 이름
self.나이 = 나이
self.학과 = 학과
def __str__(self):
return f"{self.이름}은 {self.나이}살이며 {self.학과} 학과입니다."
김철수 = 학생("김철수", 20, "컴퓨터공학")
박영희 = 학생("박영희", 21, "정보공학")
print(김철수) # 학생(이름='김철수', 나이=20, 학과='컴퓨터공학') 출력
print(박영희) # 학생(이름='박영희', 나이=21, 학과='정보공학') 출력
for 학생 in (김철수, 박영희):
print(학생)
사전 사용:
키-값 쌍을 저장해야 하는 경우 사전을 사용하는 것이 좋습니다. 사전은 데이터를 빠르게 검색하고 추가하거나 삭제하는 데 유용합니다.
학생 = {
"이름": "김철수",
"나이": 20,
"학과": "컴퓨터공학"
}
print(학생["이름"]) # 김철수 출력
print(학생["나이"]) # 20 출력
print(학생["학과"]) # 컴퓨터공학 출력
for 이름, 정보 in 학생.items():
print(f"{이름}: {정보}")
JSON 사용:
데이터를 저장하거나 다른 프로그램과 공유해야 하는 경우 JSON 형식을 사용하는 것이 좋습니다. JSON은 데이터를 표현하는 간단하고 표준적인 방법이며, 파이썬에서 쉽게 읽고 쓰는 것이 가능합니다.
import json
학생 = {
"이름": "김철수",
"나이": 20,
"학과": "컴퓨터공학"
}
with open("학생.json", "w") as f:
json.dump(학생, f)
with open("학생.json", "r") as f:
저장된_데이터 = json.load(f)
print(저장된_데이터["이름"]) # 김철수 출력
print(저장된_데이터["나이"]) # 20 출력
print(저장된_데이터["학과"]) # 컴퓨터공학 출력
python struct