5 minute read

📝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()
  • 결과
    fail to bring image

📝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()
  • 결과
    fail to bring image

📝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()
  • 결과
    fail to bring image

📝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()
  • 결과
    fail to bring image

ℹ️출처

  • John M. Zelle 저, Python Programming: An Introduction to Computer Science, 2nd Ed.

  • graphics.py는 구글링 하시면 쉽게 다운받으실 수 있습니다!!