십대를 위한 코딩/십대를 위한 파이썬

[파이썬] 클래스와 객체(Class & Object)

forSilver 2025. 2. 11. 13:58
반응형

🏛 클래스와 객체(Class & Object)

파이썬을 포함한 객체 지향 프로그래밍(OOP, Object-Oriented Programming)에서는 클래스(Class)객체(Object) 개념이 핵심입니다.

자동차 클래스 선언


📌 1. 클래스란?

클래스는 객체를 정의하는 틀(설계도) 입니다.
예를 들어, 자동차를 만들기 위한 설계도를 생각해 보면 됩니다.

🔹 클래스는 속성(변수)과 메서드(함수)로 구성됩니다.
🔹 클래스를 이용하면 동일한 구조를 가지는 객체를 쉽게 여러 개 생성할 수 있습니다.

class Car:  # 자동차 클래스 선언
    def __init__(self, brand, color):  # 생성자 (초기화 메서드)
        self.brand = brand  # 속성 1
        self.color = color  # 속성 2

    def drive(self):  # 메서드 (동작)
        print(f"{self.color} {self.brand}가 주행 중입니다.")

📌 2. 객체란?

객체는 클래스를 기반으로 생성된 실체(인스턴스) 입니다.
즉, 클래스가 설계도라면, 객체는 그 설계도를 기반으로 만든 실제 자동차라고 볼 수 있습니다.

car1 = Car("Hyundai", "Blue")  # 객체 생성
car2 = Car("Tesla", "Red")  # 객체 생성

print(car1.brand)  # Hyundai
print(car2.color)  # Red

car1.drive()  # Blue Hyundai가 주행 중입니다.
car2.drive()  # Red Tesla가 주행 중입니다.

🔹 Car 클래스는 자동차를 만들기 위한 틀이고,
🔹 car1, car2는 각각의 자동차 객체(인스턴스)입니다.


📌 3. 클래스와 객체의 관계

개념 설명 예시

클래스 객체를 생성하기 위한 틀(설계도) Car 클래스
객체(인스턴스) 클래스를 기반으로 생성된 실체 car1, car2
속성(변수) 객체의 데이터(특징) brand, color
메서드(함수) 객체의 동작(행동) drive()

📌 4. 예제: 학생 클래스 만들기

학생을 나타내는 Student 클래스를 만들어봅시다.

class Student:
    def __init__(self, name, age, grade):
        self.name = name  # 학생 이름
        self.age = age  # 학생 나이
        self.grade = grade  # 학년

    def introduce(self):
        print(f"안녕하세요! 저는 {self.age}살 {self.grade}학년 {self.name}입니다.")

# 객체 생성
student1 = Student("철수", 14, 8)
student2 = Student("영희", 15, 9)

# 메서드 호출
student1.introduce()  # 안녕하세요! 저는 14살 8학년 철수입니다.
student2.introduce()  # 안녕하세요! 저는 15살 9학년 영희입니다.

📌 5. 연습 문제

아래 요구 사항에 맞는 클래스를 작성해 보세요.

🔹 문제 1
다음 요구 사항을 만족하는 Book 클래스를 만드세요.

  • 책의 제목(title), 저자(author), 가격(price)을 속성으로 가집니다.
  • info() 메서드를 실행하면 "책 제목: OO, 저자: OO, 가격: OO원"이 출력됩니다.

🔹 문제 2
Book 클래스를 이용하여

  • 제목이 "파이썬 기초", 저자가 "김철수", 가격이 15000원인 책을 생성하세요.
  • info() 메서드를 실행하여 정보를 출력하세요.

🔥 도전 과제

🚀 도전 과제
Library 클래스를 만들어서 여러 권의 책을 관리하는 기능을 추가해 보세요.

  • 책을 추가하는 add_book() 메서드
  • 도서 목록을 출력하는 show_books() 메서드

📌 힌트: 책을 저장할 리스트(self.books = [])를 활용하세요! 🚀

 


📌 연습 문제 & 도전 과제 정답


연습 문제 1 & 2: Book 클래스 구현

📌 요구 사항

  • title, author, price 속성을 가진다.
  • info() 메서드를 실행하면 "책 제목: OO, 저자: OO, 가격: OO원"이 출력된다.

🎯 정답 코드

class Book:
    def __init__(self, title, author, price):
        self.title = title
        self.author = author
        self.price = price

    def info(self):
        print(f"책 제목: {self.title}, 저자: {self.author}, 가격: {self.price}원")

# 객체 생성
book1 = Book("파이썬 기초", "김철수", 15000)

# 메서드 실행
book1.info()  # 책 제목: 파이썬 기초, 저자: 김철수, 가격: 15000원

🚀 도전 과제: Library 클래스 구현

📌 요구 사항

  • 여러 권의 책을 관리하는 Library 클래스를 만든다.
  • add_book() 메서드를 통해 책을 추가한다.
  • show_books() 메서드를 통해 도서 목록을 출력한다.

🎯 정답 코드

class Library:
    def __init__(self):
        self.books = []  # 책 목록을 저장할 리스트

    def add_book(self, book):
        self.books.append(book)
        print(f"'{book.title}' 책이 도서관에 추가되었습니다.")

    def show_books(self):
        if not self.books:
            print("현재 도서관에 등록된 책이 없습니다.")
            return
        print("\n📚 도서관 목록 📚")
        for idx, book in enumerate(self.books, start=1):
            print(f"{idx}. {book.title} - {book.author} (가격: {book.price}원)")

# 객체 생성
library = Library()

# 책 추가
book1 = Book("파이썬 기초", "김철수", 15000)
book2 = Book("객체지향 프로그래밍", "이영희", 20000)
book3 = Book("데이터 분석", "박민수", 18000)

library.add_book(book1)
library.add_book(book2)
library.add_book(book3)

# 도서 목록 출력
library.show_books()

🏆 실행 결과

'파이썬 기초' 책이 도서관에 추가되었습니다.
'객체지향 프로그래밍' 책이 도서관에 추가되었습니다.
'데이터 분석' 책이 도서관에 추가되었습니다.

📚 도서관 목록 📚
1. 파이썬 기초 - 김철수 (가격: 15000원)
2. 객체지향 프로그래밍 - 이영희 (가격: 20000원)
3. 데이터 분석 - 박민수 (가격: 18000원)

🎯 추가 확장 아이디어

✔ search_book() 메서드를 추가하여 특정 책 검색 기능 구현
✔ remove_book() 메서드를 추가하여 책을 삭제하는 기능 추가
✔ 책 목록을 파일에 저장하는 기능 추가 (save_books() 메서드)

이제 여러분도 객체 지향 프로그래밍(OOP)을 활용하여 더 많은 기능을 추가해 보세요! 🚀🔥

 


 

📌 추가 확장 아이디어: Library 클래스 기능 추가

도서관 시스템을 더욱 발전시키기 위해 검색, 삭제, 파일 저장 기능을 추가할 수 있습니다.


1. search_book() - 책 검색 기능

🔹 사용자가 입력한 제목에 해당하는 책을 검색하는 기능
🔹 검색된 책이 있으면 정보를 출력, 없으면 "책을 찾을 수 없습니다." 출력

🎯 코드 추가

class Library:
    def __init__(self):
        self.books = []  # 책 목록을 저장할 리스트

    def add_book(self, book):
        self.books.append(book)
        print(f"'{book.title}' 책이 도서관에 추가되었습니다.")

    def show_books(self):
        if not self.books:
            print("현재 도서관에 등록된 책이 없습니다.")
            return
        print("\n📚 도서관 목록 📚")
        for idx, book in enumerate(self.books, start=1):
            print(f"{idx}. {book.title} - {book.author} (가격: {book.price}원)")

    def search_book(self, title):
        for book in self.books:
            if book.title == title:
                print(f"🔍 검색 결과: {book.title} - {book.author} (가격: {book.price}원)")
                return
        print(f"❌ '{title}' 책을 찾을 수 없습니다.")

# 객체 생성 및 테스트
library = Library()
library.add_book(Book("파이썬 기초", "김철수", 15000))
library.add_book(Book("데이터 분석", "박민수", 18000))

library.search_book("파이썬 기초")  # 검색 성공
library.search_book("자바 기초")  # 검색 실패

🏆 실행 결과

'파이썬 기초' 책이 도서관에 추가되었습니다.
'데이터 분석' 책이 도서관에 추가되었습니다.
🔍 검색 결과: 파이썬 기초 - 김철수 (가격: 15000원)
❌ '자바 기초' 책을 찾을 수 없습니다.

2. remove_book() - 책 삭제 기능

🔹 사용자가 특정 책을 입력하면 삭제
🔹 삭제 후, "책이 삭제되었습니다." 메시지 출력
🔹 목록에 없는 책을 삭제하려 하면 "책을 찾을 수 없습니다." 출력

🎯 코드 추가

def remove_book(self, title):
    for book in self.books:
        if book.title == title:
            self.books.remove(book)
            print(f"✅ '{title}' 책이 삭제되었습니다.")
            return
    print(f"❌ '{title}' 책을 찾을 수 없습니다.")

🔹 위 코드를 Library 클래스 안에 추가한 후, 실행하면 아래와 같이 동작합니다.

library.show_books()
library.remove_book("파이썬 기초")
library.show_books()
library.remove_book("자바 기초")

🏆 실행 결과

📚 도서관 목록 📚
1. 파이썬 기초 - 김철수 (가격: 15000원)
2. 데이터 분석 - 박민수 (가격: 18000원)
✅ '파이썬 기초' 책이 삭제되었습니다.
📚 도서관 목록 📚
1. 데이터 분석 - 박민수 (가격: 18000원)
❌ '자바 기초' 책을 찾을 수 없습니다.

3. save_books() - 책 목록을 파일로 저장

🔹 도서 목록을 books.txt 파일에 저장
🔹 파일 저장 형식: 책 제목, 저자, 가격
🔹 with open()을 사용하여 파일을 열고 저장

🎯 코드 추가

def save_books(self, filename="books.txt"):
    with open(filename, "w", encoding="utf-8") as file:
        for book in self.books:
            file.write(f"{book.title},{book.author},{book.price}\n")
    print(f"💾 도서 목록이 '{filename}' 파일에 저장되었습니다.")

파일 저장 테스트

library.add_book(Book("객체지향 프로그래밍", "이영희", 20000))
library.save_books()  # books.txt 파일 생성됨

🏆 파일 내용 (books.txt)

데이터 분석,박민수,18000
객체지향 프로그래밍,이영희,20000

🎯 최종 코드 (Library 클래스)

class Library:
    def __init__(self):
        self.books = []

    def add_book(self, book):
        self.books.append(book)
        print(f"'{book.title}' 책이 도서관에 추가되었습니다.")

    def show_books(self):
        if not self.books:
            print("현재 도서관에 등록된 책이 없습니다.")
            return
        print("\n📚 도서관 목록 📚")
        for idx, book in enumerate(self.books, start=1):
            print(f"{idx}. {book.title} - {book.author} (가격: {book.price}원)")

    def search_book(self, title):
        for book in self.books:
            if book.title == title:
                print(f"🔍 검색 결과: {book.title} - {book.author} (가격: {book.price}원)")
                return
        print(f"❌ '{title}' 책을 찾을 수 없습니다.")

    def remove_book(self, title):
        for book in self.books:
            if book.title == title:
                self.books.remove(book)
                print(f"✅ '{title}' 책이 삭제되었습니다.")
                return
        print(f"❌ '{title}' 책을 찾을 수 없습니다.")

    def save_books(self, filename="books.txt"):
        with open(filename, "w", encoding="utf-8") as file:
            for book in self.books:
                file.write(f"{book.title},{book.author},{book.price}\n")
        print(f"💾 도서 목록이 '{filename}' 파일에 저장되었습니다.")

# 테스트
library = Library()
library.add_book(Book("파이썬 기초", "김철수", 15000))
library.add_book(Book("객체지향 프로그래밍", "이영희", 20000))

library.show_books()
library.search_book("객체지향 프로그래밍")
library.remove_book("파이썬 기초")
library.show_books()
library.save_books()

🎯 추가 발전 방향

✔ load_books() 기능 추가하여 파일에서 도서 목록 불러오기
✔ update_book() 기능 추가하여 책의 가격 수정 가능하게 하기
✔ GUI(그래픽 인터페이스)와 연결하여 도서관 시스템 구축

이제 더 발전된 기능을 추가해보세요! 🚀🔥


📌 추가 발전 방향: 도서관 시스템 확장 🚀

이제 Library 클래스에 더 다양한 기능을 추가하여 더욱 완벽한 도서관 관리 시스템을 만들어 보겠습니다.


1. load_books() - 파일에서 도서 목록 불러오기

🔹 기존에 저장된 books.txt 파일에서 도서를 불러와 목록에 추가
🔹 open() 함수로 파일을 읽어 self.books 리스트에 저장
🔹 파일이 없거나 오류 발생 시 "불러올 도서 목록이 없습니다." 출력

🎯 코드 추가

def load_books(self, filename="books.txt"):
    try:
        with open(filename, "r", encoding="utf-8") as file:
            for line in file:
                title, author, price = line.strip().split(",")
                self.books.append(Book(title, author, int(price)))
        print(f"📂 '{filename}'에서 도서 목록을 불러왔습니다.")
    except FileNotFoundError:
        print(f"❌ '{filename}' 파일이 없습니다. 새 도서 목록을 시작합니다.")

파일 불러오기 테스트

library = Library()
library.load_books()  # books.txt 파일에서 불러오기
library.show_books()  # 불러온 책 목록 출력

🏆 실행 결과 (books.txt 파일 존재 시)

📂 'books.txt'에서 도서 목록을 불러왔습니다.

📚 도서관 목록 📚
1. 데이터 분석 - 박민수 (가격: 18000원)
2. 객체지향 프로그래밍 - 이영희 (가격: 20000원)

2. update_book() - 책 정보 수정 기능

🔹 책의 가격을 변경하는 기능 추가
🔹 사용자가 입력한 책이 존재하면 가격을 업데이트하고 "책 정보가 업데이트되었습니다." 출력
🔹 존재하지 않는 경우 "책을 찾을 수 없습니다." 출력

🎯 코드 추가

def update_book(self, title, new_price):
    for book in self.books:
        if book.title == title:
            book.price = new_price
            print(f"🔄 '{title}'의 가격이 {new_price}원으로 변경되었습니다.")
            return
    print(f"❌ '{title}' 책을 찾을 수 없습니다.")

책 정보 수정 테스트

library.show_books()
library.update_book("객체지향 프로그래밍", 22000)
library.show_books()

🏆 실행 결과

📚 도서관 목록 📚
1. 데이터 분석 - 박민수 (가격: 18000원)
2. 객체지향 프로그래밍 - 이영희 (가격: 20000원)
🔄 '객체지향 프로그래밍'의 가격이 22000원으로 변경되었습니다.
📚 도서관 목록 📚
1. 데이터 분석 - 박민수 (가격: 18000원)
2. 객체지향 프로그래밍 - 이영희 (가격: 22000원)

3. GUI(그래픽 인터페이스) 연동

🔹 tkinter 또는 PyQt를 사용하여 GUI 기반 도서관 프로그램 제작
🔹 버튼 클릭으로 책 추가, 검색, 삭제, 수정, 저장 기능 실행 가능
🔹 Treeview를 이용하여 도서 목록을 테이블 형식으로 출력

🎯 간단한 tkinter GUI 코드

import tkinter as tk
from tkinter import messagebox

class LibraryGUI:
    def __init__(self, master):
        self.library = Library()
        self.master = master
        master.title("도서관 관리 시스템")

        # 책 추가 버튼
        self.add_button = tk.Button(master, text="책 추가", command=self.add_book)
        self.add_button.pack()

        # 책 목록 출력 버튼
        self.show_button = tk.Button(master, text="도서 목록 보기", command=self.show_books)
        self.show_button.pack()

    def add_book(self):
        self.library.add_book(Book("알고리즘", "최규빈", 25000))
        messagebox.showinfo("성공", "책이 추가되었습니다!")

    def show_books(self):
        books_list = "\n".join([f"{book.title} - {book.author} ({book.price}원)" for book in self.library.books])
        messagebox.showinfo("도서 목록", books_list if books_list else "도서 목록이 없습니다.")

root = tk.Tk()
gui = LibraryGUI(root)
root.mainloop()

🏆 기능

✔ 버튼 클릭으로 책 추가 가능
✔ 도서 목록을 팝업 창으로 확인 가능
✔ tkinter를 활용하여 GUI 형태로 프로그램 사용


4. search_books_by_author() - 저자별 책 검색

🔹 특정 저자의 책 목록을 검색하는 기능
🔹 해당 저자가 쓴 모든 책을 리스트 형태로 출력

🎯 코드 추가

def search_books_by_author(self, author):
    result = [book for book in self.books if book.author == author]
    if result:
        print(f"\n📖 '{author}' 작가의 도서 목록:")
        for book in result:
            print(f"- {book.title} ({book.price}원)")
    else:
        print(f"❌ '{author}' 작가의 책을 찾을 수 없습니다.")

테스트

library.search_books_by_author("이영희")

🏆 실행 결과

📖 '이영희' 작가의 도서 목록:
- 객체지향 프로그래밍 (22000원)

5. export_books_to_csv() - CSV 파일로 내보내기

🔹 책 목록을 CSV 파일로 저장하여 엑셀에서 확인 가능
🔹 csv 모듈을 사용하여 데이터를 books.csv 파일로 저장

🎯 코드 추가

import csv

def export_books_to_csv(self, filename="books.csv"):
    with open(filename, "w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerow(["제목", "저자", "가격"])
        for book in self.books:
            writer.writerow([book.title, book.author, book.price])
    print(f"📂 '{filename}' 파일로 도서 목록을 내보냈습니다.")

테스트

library.export_books_to_csv()

🏆 결과 (books.csv 파일)

제목,저자,가격
데이터 분석,박민수,18000
객체지향 프로그래밍,이영희,22000

🎯 최종 목표: 완벽한 도서관 관리 시스템 구축

기본 기능

  • 책 추가 (add_book())
  • 책 검색 (search_book())
  • 책 삭제 (remove_book())
  • 책 정보 수정 (update_book())

파일 입출력

  • 도서 목록 저장 (save_books())
  • 도서 목록 불러오기 (load_books())
  • CSV 파일로 내보내기 (export_books_to_csv())

고급 기능

  • 저자별 검색 (search_books_by_author())
  • GUI 인터페이스 (tkinter)

🚀 이제 여러분이 해볼 것!

💡 추가 기능을 직접 구현해 보세요! ✔ 도서 대출 및 반납 시스템 추가
✔ 회원 관리 기능 추가 (회원 등록, 대출 기록 관리)
✔ 웹 애플리케이션 형태로 구현 (Flask 또는 Django 활용)

파이썬을 활용한 객체 지향 프로그래밍(OOP)을 연습하면서 도서관 시스템을 직접 업그레이드해 보세요! 🚀🔥