[Python]연습문제: 클래스, Graphics.py
📝1번: 상속, 연산자 오버로딩 등 클래스의 개념 적용해보기
- 답안
#-*- coding: utf-8 -*-
# 클래스, 오버로딩, 상속을 사용해 문장을 완성하는 프로그램.
# HousePark 클래스 생성.
class HousePark:
# 클래스 변수 lastname 선언. 객체변수와 달리 모든 객체에 공유됨.
lastname = "박"
# 문장을 만들기 위한 여러 메소드 생성.
# __init__메소드는 생성자로 객체가 생성되면 자동으로 호출됨. self와 name을 매개변수로 입력받음.
# 멤버변수 self.fullname 선언.
def __init__(self,name):
self.fullname = self.lastname + name
# travel, love, fight 메소드를 만듦. 각각 self를 포함한 두개의 매개변수를 입력받음
# 문자열 포맷팅을 사용해 각각 상황에 맞는 문자열을 출력함.
def travel(self,where):
print("%s, %s여행을 가다." %(self.fullname, where))
def love(self,other):
print("%s, %s 사랑에 빠졌네" %(self.fullname, other.fullname))
def fight(self,other):
print("%s, %s 싸우네" %(self.fullname, other.fullname))
def __add__(self,other): # + 연산자 오버라이딩 메소드.
print("%s, %s 결혼했네" %(self.fullname, other.fullname))
def __sub__(self,other): # - 연산자 오버라이딩 메소드.
print("%s, %s 이혼했네" %(self.fullname, other.fullname))
# HouseKim클래스에 HousePark클래스를 상속하여 같은 기능을 물려주고 그 외 메소드를 생성하여 기능 확장.
class HouseKim(HousePark):
lastname = "김" # 부모 클래스의 동일한 클래스 변수 오버라이딩.
# 메소드를 추가하여 HouseKim 클래스의 기능을 확장시킴. 세개의 매개변수(self.fullname, where, day)를 입력받음.
# 포맷팅을 사용하여 문자열 출력.
def travel(self,where,day): # 메소드의 Signature 가 다르므로 오버로딩.
print("%s, %s 여행 %d일 가네." %(self.fullname, where, day))
# 객체 pey는 HousePark 클래스의 인스턴스.
# __init__메소드가 자동으로 호출되어 self.fullname이 "박응용"으로 생성됨. 같은 방식으로 클래스 HouseKim에서 "김줄리엣"이 self.fullname에 반환.
pey = HousePark("응용") # "박응용"
juliet = HouseKim("줄리엣") # "김줄리엣"
# 객체.메소드 형태로 호출되므로 self는 생략.
# travel메소드가 호출되어 "박응용, 부산여행을 가다.", "김줄리엣, 부산 여행 3일 가네."가 출력됨.
pey.travel("부산")
juliet.travel("부산",3)
# love, fight메소드가 호출되어 "박응용, 김줄리엣 사랑에 빠졌네", "박응용, 김줄리엣 싸우네"가 출력됨.
# 연산자 메소드가 호출되어 "박응용, 김줄리엣 결혼했네", "박응용, 김줄리엣 이혼했네"가 출력됨.
pey.love(juliet)
pey + juliet
pey.fight(juliet)
pey - juliet
- 결과
박응용, 부산여행을 가다.
김줄리엣, 부산 여행 3일 가네.
박응용, 김줄리엣 사랑에 빠졌네
박응용, 김줄리엣 결혼했네
박응용, 김줄리엣 싸우네
박응용, 김줄리엣 이혼했네
📝2번: 원금과 이자율을 입력받아 10년동안 돈이 늘어나는 정도를 그래프를 통해 보여주는 프로그램
- 코드
# 원금과 이자율을 입력받아 10년동안 돈이 늘어나는 정도를 그래프를 통해 보여주는 프로그램.
# graphics.py파일을 import함
from graphics import*
# 원금, 이자율을 입력받아 성장율을 그래프로 보여주는 main() 함수를 클래스와 for문을 사용하여 정의함.
def main():
# 사용자에게 프로그램에 대한 설명 출력.
print("This program plots the growth of a 10-year investment.")
# 원금과 이자율을 각각 input()함수를 통해 입력받는 변수 principal, apr을 선언함.
# eval() 함수는 문자열로 저장된 데이터를 수의 형태로 변환시킴.
principal = eval(input("Enter the initial principal: "))
apr = eval(input("Enter the annualized interest rate: "))
# 객체 win은 GraphWin의 인스턴스로 윈도우의 이름, 크기를 정함. setBackground 메소드 호출.
# setBackground 메소드는 self 포함 두개의 매개변수를 입력받고, 윈도우의 배경색(흰색)을 설정함.
win = GraphWin("Investment Growth Chart", 320, 240)
win.setBackground("white")
# Text()함수는 원하는 위치에 문자를 쓰는 함수로 y축 좌표 5개를 윈도우에 그려넣음.
Text(Point(20,230), ' 0.0k').draw(win)
Text(Point(20,180), ' 2.5k').draw(win)
Text(Point(20,130), ' 5.0k').draw(win)
Text(Point(20,80), ' 7.5k').draw(win)
Text(Point(20,30), ' 10.0k').draw(win)
# 원금의 2%를 값으로 저장하는 변수 height 선언.
# 객체 bar는 사각형을 그리는 Rectangle클래스의 인스턴스로 여기에선 맨 첫번째 막대그래프의 모양과 크기를 설정.
# setFill, setWidth, draw 메소드를 호출하여 막대그래프의 색(초록), 선두께(2), 너비를 설정한 후 윈도우에 그림.
height = principal*0.02
bar = Rectangle(Point(40,230), Point(65, 230-height))
bar.setFill("green")
bar.setWidth(2)
bar.draw(win)
# 반복문 for문을 이용하여 돈을 계산하고, 그에 맞게 나머지 10개의 막대그래프를 그려줌.
for year in range(1,11):
principal = principal*(1 + apr)
# x11은 막대그래프를 그릴 때 막대그래프(사각형)의 좌측 하단 꼭지점의 좌표를 값으로 하는 변수x11 = year * 25 + 40
# 막대그래프의 모양은 길이를 제외하고 위의 첫번째 막대그래프와 같이 해줌.
x11 = year * 25 + 40
height = principal * 0.02
bar = Rectangle(Point(x11, 230), Point(x11+25, 230-height))
bar.setFill("green")
bar.setWidth(2)
bar.draw(win)
# close메소드를 통해 enter 치면 창을 닫고 프로그램을 종료함.
input("Press <Enter> to quit")
win.close()
# main()함수 호출하여 실행함.
main()
- 결과
📝3번: 점을 찍으면 그 좌표를 알려주는 프로그램
- 코드
#점을 찍으면 그 좌표를 알려주는 프로그램
# graphics.py를 import함
from graphics import*
# 사용자가 클릭한 점의 좌표를 알려주는 main()함수를 클래스와 for문을 사용하여 정의함.
def main():
# 객체 win은 클래스 GraphWin의 인스턴스. "Click Me!"라고 윈도우 창의 이름이 설정됨.
# 반복문 for문을 통해 클릭한 마우스 좌표를 알려주는 실행을 10번 반복함.
win = GraphWin("Click Me!")
for i in range(10):
# 클릭을 기다렸다가 클릭한 마우스 좌표값을 반환하는 메소드 getMouse를 호출. 좌표값을 변수 p에 반환하여 저장.
p = win.getMouse()
# getX(),getY() 함수는 각각 x좌표, y좌표값을 리턴하는 메소드.
print("You clicked at: ", p.getX(), p.getY())
# main() 함수 호출
main()
- 결과
📝4번: 섭씨온도를 화씨온도로 변환해주는 프로그램
- 코드
# convert_gui.pyw
# gui 전용 쉘인 파이썬 확장자 pyw사용
# 섭씨온도를 화씨온도로 변환해주는 프로그램
# graphics.py를 import함
from graphics import*
# 클래스를 사용하여 섭씨-화씨온도를 변환해주는 main()함수 정의
def main():
# 객체 win은 클래스 GraphWin의 인스턴스. 윈도우의 이름(Celsius Converter), 크기를 설정함.
# setCoords메소드를 호출하여 좌측 하단 모서리 좌표(0,0)에서 우측 상단 모서리 좌표(3,4)로 직사각형 박스 생성.
win = GraphWin("Celsius Converter", 400, 300)
win.setCoords(0.0, 0.0, 3.0, 4.0)
# Text()함수를 사용하여 출력할 문자열을 좌표(1,3)에 지정하고 draw메소드를 통해 출력.
Text(Point(1,3), " Celsius Temperature:").draw(win)
Text(Point(1,1), "Fahrenheit Temperature:").draw(win)
# 객체 input은 클래스 Entry의 인스턴스. 숫자를 입력받을 박스를 윈도우에 만듦.
# 초기값을 "0.0"으로, 박스 색과 글씨 색상, 너비 등 모양을 설정해줌.
input = Entry(Point(2,3), 5)
input.setText("0.0")
input.draw(win)
# 객체 output은 클래스 Text의 인스턴스로 섭씨를 화씨로 변환한 결과값을 지정된 좌표(2,1)에 출력해줌.
output = Text(Point(2,1), "")
output.draw(win)
# 객체 button은 클래스 Text의 인스턴스로 "convert it"문자열을 지정된 좌표(1.5,2)에 출력해줌.
button = Text(Point(1.5, 2.0), "Convert It")
button.draw(win)
# 좌측 하단 모서리 좌표값과 우측 상단 모서리 좌표값으로 사각형 버튼을 윈도우에 만들어줌.
Rectangle(Point(1,1.5), Point(2, 2.5)).draw(win)
# 사용자의 마우스클릭을 기다렸다가 클릭되면 다음으로 넘어감.
win.getMouse()
# 사용자로부터 변환하고자 하는 섭씨온도를 입력받아 화씨로 계산하여 변수 fahrenheit에 저장.
celsius = eval(input.getText())
fahrenheit = 9.0/5.0*celsius + 32
# setText메소드를 호출하여 output객체에 화씨온도를 출력하고, 객체 button에 써있던 문자열을 "Quit"으로 바꿈
output.setText(fahrenheit)
button.setText("Ouit")
# 마우스클릭을 기다렸다가 마우스가 클릭되면 윈도우를 닫고 프로그램을 종료함.
win.getMouse()
win.close()
#main()함수 호출하여 프로그램 실행.
main()
- 결과
📝5번: 점을 세개 찍어 삼각형을 그리는 프로그램
- 코드
# gui 전용 쉘인 파이썬 확장자 pyw사용
# 점을 세개 찍어 삼각형을 그리는 프로그램
# graphics.py를 import함
from graphics import*
# 클래스를 사용하여 점 세개를 찍어 삼각형을 그리는 main()함수를 정의함.
def main():
# 객체 win은 클래스 GraphWin의 인스턴스. 윈도우의 이름(Draw a Triangle)을 설정함.
# setCoords메소드를 호출하여 좌측 하단 모서리 좌표(0,0)에서 우측 상단 모서리 좌표(10,10)로 윈도우 생성.
win = GraphWin("Draw a Triangle")
win.setCoords(0.0, 0.0, 10.0, 10.0)
# Text()함수를 사용하여 좌표(5,0.5)에 해당 문자열(Click on three points)을 message에 저장.
# message를 draw메소드를 호출하여 윈도우에 출력함.
message = Text(Point(5, 0.5), "Click on three points")
message.draw(win)
# 마우스로 클릭한 지점 좌표값을 반환하는 getMouse메소드를 사용함.
# 사용자가 찍은 세개의 점의 좌표값을 객체 p1,p2,p3에 반환하여 draw메소드를 사용하여 윈도우에 그림.
p1 = win.getMouse()
p1.draw(win)
p2 = win.getMouse()
p2.draw(win)
p3 = win.getMouse()
p3.draw(win)
# 객체 triangle은 클래스 Polygon의 인스턴스로, 윈도우에 삼각형을 그림.
# setFill, setOutline, draw 메소드를 사용하여 도형 색상채우기(peachpuff), 선 색상(cyan청록색)을 정하고 윈도우에 그림.
triangle = Polygon(p1,p2,p3)
triangle.setFill("peachpuff")
triangle.setOutline("cyan")
triangle.draw(win)
# 위에서 선언했던 message를 setText 메소드를 사용하여 문자를 "Click anywhere to quit."로 바꿈.
# 아무곳이나 클릭한 뒤 프로그램 종료.
message.setText("Click anywhere to quit.")
win.getMouse()
#main()함수 호출
main()
- 결과
ℹ️출처
-
John M. Zelle 저, Python Programming: An Introduction to Computer Science, 2nd Ed.
-
graphics.py는 구글링 하시면 쉽게 다운받으실 수 있습니다!!