Chapter 9 : Python - practice(assignment for myself)

안녕하세요, 오늘은 저번 포스팅에서 말했듯이
파이썬 클래스에 대해서 연습하는 시간입니다.
오늘의 주제는 AI에게 부탁해서 몇개의 과제를 좀 받아왔습니다.
실습 컨텐츠가 필요할때마다 요긴하게 쓸 수 있는 것 같습니다:)
주제 1
주어진 클래스 Rectangle을 활용하여
직사각형의 넓이와 둘레를 계산하는 프로그램을 작성해보세요.
작성해야 할 프로그램
- 1. Rectangle 클래스를 이용하여 rectangle1 객체를 생성하세요. 가로 길이는 5, 세로 길이는 3으로 설정해주세요.
- 2. rectangle1의 넓이와 둘레를 계산하여 출력해보세요.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def get_area(self):
return self.width * self.height
def get_perimeter(self):
return 2 * (self.width + self.height)
클래스 설명
- Rectangle 클래스는 가로(width)와 세로(height) 속성을 가지고 있습니다.
- get_area 메서드는 직사각형의 넓이를 반환합니다.
- get_perimeter 메서드는 직사각형의 둘레를 반환합니다.
My Answer
rectabgle1 = Rectangle(3, 5)
print(rectabgle1.get_area())
print(rectabgle1.get_perimeter())
먼저, rectangle1이라는 객체를 선언하라고 했으니까
변수 rectangle1을 사용할것인데 가로길이가 3, 높이가 5라고 했으니
rectangle1은 Rectangle(3, 5)를 담아야겠습니다.
그러니 rectangle1 = Rectangle(3, 5) 라고 객체를 선언해주었습니다.
이제 객체 rectangle1은 가로 세로 정보가 담긴
클래스 Rectanlge 라고 보면 될 것 같습니다.
넓이와 둘레를 구하는 메서드가 각각 클래스 안에 작성되어서
간단하게 print만 해주면 끝이므로
rectangle1.get_area()와 rectanlge1.get_perimeter()를 출력해 주었습니다.
여기서 괄호안에 인자값을 안 넣은 이유는
이미 객체선언을 할때 인자값을 입력해 놓았기 때문입니다!

주제 2
**클래스 실습 과제: 동물 클래스 만들기**
1번 주제는 AI가 이미 클래스를 만들어서 과제를 내줘서
난이가 비교적 쉬웠습니다. 그래서 이번엔 클래스 자체를
제가 직접 작성할 수 있도록
과제를 만들어달라고 부탁했는데요, 한번 풀어보겠습니다.
- Animal 클래스를 만들어주세요.
- Animal 클래스는 다음과 같은 속성과 메서드를 가져야 합니다:
- 속성:
- name: 동물의 이름을 저장하는 문자열 변수
- age: 동물의 나이를 저장하는 정수 변수
- 메서드:
- introduce(): 동물의 이름과 나이를 출력하는 메서드입니다. - Animal 클래스의 인스턴스를 생성하고, introduce() 메서드를 호출하여 동물의 정보를 출력해보세요.
- 추가로, Animal 클래스를 상속받는 새로운 클래스를 만들어보세요. 이 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받아야 합니다.
- 새로운 클래스의 인스턴스를 생성하고, introduce() 메서드를 호출하여 동물의 정보를 출력해보세요.
My Answer
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print("이름 : {}".format(self.name))
print("나이 : {}살".format(self.age))
return
intro1 = Animal("김몽이", 5) # 이름과 나이 정보를 담고있는 객체
intro1.introduce()
class personality(Animal):
def __init__(self, name, age, pers):
super().__init__(name, age)
self.pers = pers
def introduce2(self):
print("성격 : {}".format(self.pers))
intro2 = personality("김몽이", 5, "내향적") # 이름과 나이, 성격까지 담고있는 객체
intro2.introduce()
intro2.introduce2()
이번껀 작성하는데 시간이 좀 걸렸습니다.
아직까진 미숙해서 그런지 자꾸 self를 뻬먹게 되더라구요
에러 조치 하는데 애 좀 먹었답니다:)
먼저, Animal이라는 클래스를 생성하고
나이와 이름을 출력하는 메서드를 생성합니다.
메서드명은 과제의 조건대로 introduce()로 하였습니다.
intro1이라는 Animal 클래스의 인스턴스를 생성해서
introduce()메서드를 호출했고
동물 이름과 나이는 저희집 강아지 정보를 입력해보았어요:)
다음으로 Animal 클래스를 상속받는 새로운 클래스 personality를 생성했습니다.
자식클래스는 부모클래스에서의 name, age 뿐만 아니라
성격을 나타내는 pers까지 총 세개의 인자를 가지고 있습니다.
성격을 출력해주는 메서드 introduce2()도 작성을 해주었습니다.
부모클래스에서는 intro1이라는 인스터스를 생성했으니
자식클래스에서는 intro2라는 이름의 인스턴스를 생성해봤습니다.
자식클래스의 인스턴스 intor2를 통해서
introduce()와 introduce2()를 모두 호출 할 수 있는게 보이죠:)
작성코드의 출력결과는 아래와 같습니다.

주제3
**주어진 클래스들을 활용하여 간단한 은행 시스템을 구현해보세요.**
- 클래스 설명:
1. Account 클래스:
- Account 클래스는 은행 계좌를 나타내는 클래스입니다.
- Account 클래스는 account_number와 balance라는 인스턴스 변수를 가지고 있습니다.
- deposit 메서드는 예금을 처리하여 balance를 증가시킵니다.
- withdraw 메서드는 출금을 처리하여 balance를 감소시킵니다.
2. CheckingAccount 클래스:
- CheckingAccount 클래스는 Account 클래스를 상속받은 클래스입니다.
- CheckingAccount 클래스는 Account 클래스의 기능을 모두 상속받으면서, 추가로 transaction_fee 라는 인스턴스 변수를 가지고 있습니다.
- withdraw 메서드를 오버라이딩하여 출금 시 transaction_fee를 적용하고, balance를 감소시킵니다.
3. SavingsAccount 클래스:
- SavingsAccount 클래스는 Account 클래스를 상속받은 클래스입니다.
- SavingsAccount 클래스는 Account 클래스의 기능을 모두 상속받으면서, 추가로 interest_rate 라는 인스턴스 변수를 가지고 있습니다.
- add_interest 메서드는 현재 balance에 interest_rate를 곱한 만큼의 이자를 더해줍니다.
과제 요구사항:
1. Account 클래스를 작성하세요. 필요한 인스턴스 변수와 메서드를 구현해야 합니다.
2. CheckingAccount 클래스를 작성하세요. Account 클래스를 상속받아 필요한 인스턴스 변수와 메서드를 추가로 구현해야 합니다.
3. SavingsAccount 클래스를 작성하세요. Account 클래스를 상속받아 필요한 인스턴스 변수와 메서드를 추가로 구현해야 합니다.
4. CheckingAccount와 SavingsAccount 클래스의 인스턴스를 생성하고, 다양한 입출금 작업을 수행하여 결과를 출력해보세요.
My Answer
class Account:
def __init__(self, account_number, balance):
self.account_number = account_number
self.balance = balance
print("계좌번호 : {}\n잔액 : {}원".format(account_number, balance))
def deposit(self, amount):
self.balance += amount
print("{}원 입금이 완료되었습니다. \n잔액 : {}원".format(amount, self.balance))
def withdraw(self, amount):
self.balance -= amount
print("{}원 출금이 완료되었습니다. \n잔액 : {}원".format(amount, self.balance))
account_object = Account("000000000000", 100000000) # 계좌번호와 잔액을 출력하는 객체 생성
account_object.deposit(5000000) # 인스턴스를 통해 메서드 호출
class CheckingAccount(Account):
def __init__(self, account_number, balance, transaction_fee):
super().__init__(account_number, balance)
self.transaction_fee = transaction_fee
def withdraw(self, amount):
self.amount = amount
self.balance -= (amount + self.transaction_fee)
print("{}원 출금이 완료되었습니다.(수수료 : {}원) \n잔액 : {}원".format(amount, self.transaction_fee, self.balance))
transaction_fee = CheckingAccount(account_object.account_number, account_object.balance, 1000)
transaction_fee.withdraw(5000000)
class SavingsAccount(Account):
def __init__(self, account_number, balance, interest_rate):
super().__init__(account_number, balance)
self.interest_rate = interest_rate
def add_interest(self):
self.balance += (self.balance * self.interest_rate)
self.balance = int(self.balance)
print("이자 정산이 완료되었습니다.\n잔액 : {}원".format(self.balance))
interest_rate = SavingsAccount(transaction_fee.account_number, transaction_fee.balance, 0.05)
interest_rate.add_interest()
이번 과제도 고생 좀 했습니다..
클래스 생성을 3개나 하다 보니 정신이 없네요^^
먼저, 과제 조건대로 Account 클래스를 생성해줍니다.
메서드 또한 조건에서 제시한대로
메서드 deposit과 withdraw도 잘 작성을 해주었습니다.
두 메서드 모두 대입연산자를 활용해서
잔액을 출력할 수 있도록 작성했으니 과제 조건을 충족해주었네요
다음은 account_object라는 인스턴스를 선언해주고
그 인스턴스를 통해서 클래스안의 deposit 메서드를 호출까지 해보았습니다.
두번째로, Account 클래스를 상속받은
CheckingAccount 클래스를 생성하였는데 transaction_fee라고 해서
수수료 항목을 추가하기 위해 인자를 하나 더 받도록 하였습니다.
여기서 withdraw 메서드를 선언해주었지만
Account 클래스에서의 withdraw와는 다른 내용을 작성해 줌으로써
메서드 오버라이딩까지 과제 조건 충족을 완수했습니다:)
마지막으로, Account 클래스를 상속받는 SavingAccount 클래스를 생성했는데
이자율에 관해서 표현하기 위해 interest_rate를 인자로 받도록 했습니다.
메서드 add_interest는 원금에 이자를 더한 잔액을 계산하여 출력하도록
메서드 선언을 완료하였고 모든 조건을 충족하는 프로그램을 작성했습니다!

주제 4
**클래스 실습 과제 : 도서 관리 시스템**
- 1. Book 클래스를 정의하세요.
- Book 클래스는 다음과 같은 속성을 가져야 합니다 :
- title : 책의 제목을 저장하는 문자열 변수
- author : 책의 저자를 저장하는 문자열 변수
- year : 책의 출판 연도를 저장하는 정수 변수
- Book 클래스는 다음과 같은 메서드를 가져야 합니다 :
- display_info() : 책의 제목, 저자, 출판 연도를 출력하는 메서드입니다.
2. EBook 클래스를 정의하세요. EBook 클래스는 Book 클래스를 상속받아야 합니다.
- EBook 클래스는 다음과 같은 속성을 추가로 가져야 합니다 :
- file_size : 전자책 파일의 크기를 저장하는 정수 변수
- EBook 클래스는 display_info() 메서드를 오버라이딩하여 책의 제목, 저자, 출판 연도, 파일 크기를 출력해야 합니다.
3. Book 클래스와 EBook 클래스의 인스턴스를 생성하고, display_info() 메서드를 호출하여 도서의 정보를 출력해보세요.
My Answer
class Book:
def __init__(self, title, author, year):
self.title = title
self.author = author
self.year = year
def display_info(self):
print("책 제목 : {}\n저자 : {}\n출판연도 : {}"\
.format(self.title, self.author, self.year))
class EBook(Book):
def __init__(self, title, author, year, file_size):
super().__init__(title, author, year)
self.file_size = file_size
def display_info(self):
print("책 제목 : {}\n저자 : {}\n출판연도 : {}\n파일크기 : {}MB"\
.format(self.title, self.author, self.year, self.file_size))
Book_info = Book("sleep_soo의 인생", "sleep_soo", 2024) # Book클래스의 인스턴스 선언
Book_info.display_info() # Book 클래스의 메서드 display_info 호출
EBook_info = EBook(Book_info.title, Book_info.author, Book_info.year, 100) # EBook 클래스의 인스턴스 선언
EBook_info.display_info() # EBook 클래스의 메서드 display_info 호출
연습이 조금 더 필요할 것 같아서 AI에게
주제 3번과 비슷하게 문제 하나를 더 만들어달라고 요청했는데요,
이번엔 주제 3번에 비해 말도안되게 빨리 작성했습니다!
물론 난이도가 조금 더 쉬운것 같긴 한데
이젠 self 사용도 어느정도 익숙해지니 코드 작성하기가 수월해졌습니다.
코드 구성은 주제3번과 크게 다르지 않습니다.
Book이라는 이름의 클래스를 생성해주었고
조건대로 title, author, year라는 속성으로 갖도록 하였으며
책 정보를 출력하는 메서드 display_info도 선언해주었습니다.
두번째 클래스 EBook은 Book클래스를 상속받았고
부모클래스의 속성을 모두 가지고 있으며
file_size를 추가로 포함하도록 하였습니다.
display_info를 메서드 오버라이딩해줌으로써
책 이름, 저자, 출판연도, 파일크기까지 출력해주는 메서드가 완성되었습니다.
마지막엔 Book 클래스의 인스턴스 선언과 메서드 호출,
EBook 클래스의 인스턴스 선언과 메서드 호출을 해주면서
책정보가 출력되도록 코드를 작성해 주었습니다.
*실수했던 점
코드를 작성하면서 제가 실수했던 점이 있었는데요,
저는 맨 처음에 super().__init__(self, title, author, year) 이렇게 작성했는데요
super를 사용한것부터가 이미 암무적으로 self인자를 전달받은 것이기 때문에
self인자를 추가로 명시하게되면 오류가 발생한다고 하는것같습니다.

위에 제대로 출력된 부분은 Book클래스의 인스턴스를 통해
메서드를 호출한 부분이라서 정상적으로 출력이 된 것이고
Ebook클래스를 다루는 부분에서 아까 말한 self때문에 오류가 발생한 것입니다.
정상적으로 수정하여 실행한 결과는 아래의 사진과 같습니다.

이번 자체 실습관제를 하면서 느낀점은
미흡하거나 어렵다고 느껴지는 부분은 이렇게
자체실습과제로 연습하는 것이 매우 효과적이라는 것입니다.
확실히 특정 주제를 가지고 코드작성 연습을 하니까
실력 향상이 되고있다는게 스스로도 느껴지니 뿌듯하고 좋았습니다.
오늘은 여기까지하고 다음 포스팅으로 찾아뵙겠습니다:)
출처 : https://youtu.be/kWiCuklohdY
필자는 해당 링크 영상을 통해 학습하였으나,
포스팅 내용 및 설명은 영상과 다를 수 있음을 알립니다.