연습문제

1. 다음은 외부 라이브러리인 pygame을 파이썬에서 추가하기 위한 명령입니다. 옳은 것을 고르세요.

① pip install pygame

② pip upgrade pygame

③ pip setup pygame

pip download pygame

 

더보기

답 : 1

 

2. 다음 각 설명에 필요한 Pillow 함수를 쓰세요.

(1) 이미지 회전

(2) 이미지 밝게/어둡게

(3) 이미지 블러링/엠보싱

(4) 이미지 복사

(5) 이미지 확대/축소

(6) 이미지 좌우/상하 반전

 

더보기

답 : (1) rotate(각도)

(2) ImageEnhance.Brightness(이미지).enhance(밝기 값)

(3) filter(ImageFilter.BLUR) , filter(ImageFilter.EMBOSS)

(4) copy()

(5) resize((폭, 높이))

(6) transpose() 

 

3. [프로그램 2]를 다음과 같이 기능을 추가하거나 변경해 보세요.

    · 우주괴물이 화면의 위에서 아래로 지그재그로 내려오도록 하자. 또한 게임의 박진감을 위해서 우주괴물의 속도가 5~9가 되도록 조절하자.

    · 우주괴물을 맞힐 때마다 우주선의 그림이 다른 우주선으로 변경되도록 하자.

    · 우주괴물이 살아서 오른쪽 끝까지 도달하면 점수에서 1점을 빼자. 즉, 점수는 마이너스 점수도 나올 수 있다.

    · 만약, 우주선과 우주괴물이 부딪히면 5초간 화면을 멈추고, 게임 종료 메시지를 화면에 출력하자. 그리고 프로그램을 종료한다.

* 다른건 다 했는데 지그재그로 내려오게 하는걸 모르겠네요ㅠㅠ 아는 분 댓글 부탁드립니다

더보기

답 :

import pygame
import random
import sys


## 함수 선언 부분 ##
# @기능 2-5 : 매개변수로 받은 객체를 화면에 그리는 함수를 선언한다.
def paintEntity(entity, x, y) : 
   monitor.blit(entity, (int(x), int(y)))

# @기능 5-4 : 점수를 화면에 쓰는 함수를 선언한다.
def writeScore(score) :
    myfont = pygame.font.Font('NanumGothic.ttf', 20)      # 한글 폰트
    txt = myfont.render(u'파괴한 우주괴물 수 : ' + str(score), True, (255-r, 255-g, 255-b))
    monitor.blit(txt, (10, sheight - 40))
    
def writeMessage(text) :
    myfont = pygame.font.Font('NanumGothic.ttf', 50)      # 한글 폰트
    text = myfont.render(text, True, (255-r, 255-g, 255-b))
    monitor.blit(text, (swidth/2-200, sheight/2-30))

def crash() :
    writeMessage('우주선 폭파!! 게임 끝!')
    pygame.display.update()
    pygame.time.delay(5000)
    pygame.quit()
    sys.exit()

def playGame() :
    global monitor, ship, monster, missile 

    r = random.randrange(0, 256)
    g = random.randrange(0, 256)
    b = random.randrange(0, 256) 
    
     # @기능 2-2 : 우주선의 초기 위치 키보드를 눌렀을 때 이동량을 저장할 변수를 선언한다.
    shipX = swidth / 2  # 우주선 위치
    shipY = sheight * 0.8
    dx, dy = 0, 0  # 키보드를 누를때 우주선의 이동량
    
    # @기능 3-2 : 우주괴물을 랜덤하게 추출하고 크기와 위치를 설정한다.
    monster = pygame.image.load(random.choice(monsterImage))
    monsterSize = monster.get_rect().size                 # 우주괴물 크기
    monsterX = 0 
    monsterY = random.randrange(0, int(swidth * 0.3)) # 상위 30% 위치까지만
    monsterSpeed = random.randrange(5, 9)
    
    # 우주선을 랜덤하게 추출한다
    ship = pygame.image.load(random.choice(shipImage))
    shipSize = ship.get_rect().size

    # @기능 4-2 : 미사일 좌표를 초기화한다.
    missileX, missileY = None, None  # None은 미사일을 쏘지 않았다는 의미이다.

    # @기능 5-1 : 맞힌 우주괴물 숫자를 저장할 변수를 선언한다.
    fireCount = 0

    # 무한 반복
    while True :
        (pygame.time.Clock()).tick(50)  # 게임 진행을 늦춘다(10~100 정도가 적당)
        monitor.fill((r, g, b))              # 화면 배경을 칠한다.

        # 키보드나 마우스 이벤트가 들어오는지 체크한다.
        for e in pygame.event.get() :
            if e.type in [pygame.QUIT]  :
                pygame.quit()
                sys.exit()

            # @기능 2-3 : 방향키에 따라 우주선이 움직이게 한다.
            # 방향키를 누르면 우주선이 이동한다(누르고 있으면 계속 이동).
            if e.type in [pygame.KEYDOWN] :
                if e.key == pygame.K_LEFT : dx = -5
                elif e.key == pygame.K_RIGHT : dx = +5
                elif e.key == pygame.K_UP : dy = -5
                elif e.key == pygame.K_DOWN : dy = +5
                # @기능 4-3 : 스페이스바를 누르면 미사일을 발사한다.
                elif e.key == pygame.K_SPACE : 
                    if missileX == None :                     # 미사일을 쏜 적이 없다면
                        missileX = shipX + shipSize[0]/2    # 우주선 위치에서 미사일을 발사한다.
                        missileY = shipY

            # 방향키를 떼면 우주선이 멈춘다.
            if e.type in [pygame.KEYUP] :
                 if e.key == pygame.K_LEFT or e.key == pygame.K_RIGHT \
                    or e.key == pygame.K_UP or e.key == pygame.K_DOWN : dx, dy = 0, 0

        # @기능 2-4 : 우주선이 화면 안에서만 움직이게 한다.
        if (0 < shipX+dx and shipX+dx <= swidth-shipSize[0]) \
            and (sheight/2 < shipY+dy and shipY+dy <= sheight - shipSize[1]) :  # 화면의 중앙까지만
            shipX += dx
            shipY += dy
        paintEntity(ship, shipX, shipY)   # 우주선을 화면에 표시한다.

        # @기능 3-3 : 우주괴물이 자동으로 나타나 왼쪽에서 오른쪽으로 움직인다.
        monsterX += monsterSpeed
        monsterY += monsterSpeed
        if monsterY > sheight :
            monsterX = random.randrange(0, int(swidth * 0.3))
            monsterY = 0
            # 우주괴물 이미지를 무작위로 선택한다.
            monster = pygame.image.load(random.choice(monsterImage))
            monsterSize = monster.get_rect().size
            monsterSpeed = random.randrange(5, 9)
           
        paintEntity(monster, monsterX, monsterY)
        
        # 놓치면 점수 빼기
        if monsterY >= sheight:
            fireCount -= 1
        
        # @기능 4-4 : 미사일을 화면에 표시한다.
        if missileX != None :                          # 총알을 쏘면 좌표를 위로 변경한다.
            missileY -= 10
            if missileY < 0 :
                  missileX, missileY= None, None   # 총알이 사라진다.
        if missileX != None :           # 미사일을 쏜 적이 있으면 미사일을 그려준다.
            paintEntity(missile, missileX, missileY)
            # @기능 5-2 : 우주괴물이 미사일에 맞았는지 체크한다.
            if (monsterX < missileX and missileX < monsterX + monsterSize[0]) and \
                   (monsterY < missileY and missileY < monsterY + monsterSize[1]) :
                fireCount += 1

                # 우주괴물을 초기화(무작위 이미지로 다시 준비)
                monster = pygame.image.load(random.choice(monsterImage))
                monsterSize = monster.get_rect().size
                monsterX = 0
                monsterY =random.randrange(0, int(swidth * 0.3))
                monsterSpeed = random.randrange(1, 5)
                
                # 미사일을 초기화한다.
                missileX, missileY= None, None   # 총알이 사라진다.

        # @기능 5-3 : 점수를 화면에 쓰는 함수를 호출한다.
        writeScore(fireCount)
        
        # 화면을 업데이트한다.
        pygame.display.update()
        
        # 우주선이 우주괴물과 충돌했는지 체크
        if (shipX < monsterX and monsterX < shipX + shipSize[0]) and \
              (shipY < monsterY and monsterY < shipY + shipSize[1]) :
           crash()

        
## 전역 변수 선언 부분 ##
r, g, b = [0] * 3                # 게임 배경색
swidth, sheight = 500, 700  # 화면 크기
monitor = None               # 게임 화면
ship, shipSize = None, 0     # 우주선의 객체와 크기 변수

# @기능 3-1 : 랜덤하게 사용할 우주괴물의 이미지 10개를 준비한다.
monsterImage = ['monster01.png', 'monster02.png', 'monster03.png', 'monster04.png', \
                'monster05.png', 'monster06.png', 'monster07.png', 'monster08.png', \
                'monster09.png', 'monster10.png']
monster = None   # 우주괴물

missile = None     # 미사일


## 메인 코드 부분 ##
pygame.init()
monitor = pygame.display.set_mode((swidth, sheight))
pygame.display.set_caption('우주괴물 무찌르기')

# @기능 2-1 : 우주선 이미지를 준비하고 크기를 구한다.
ship = pygame.image.load('ship02.png')
shipSize = ship.get_rect().size

# @기능 4-1 : 미사일 이미지를 추가한다.
missile = pygame.image.load('missile.png')

playGame()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

연습문제

1. 다음 데이터베이스와 관련된 설명 중, 거리가 먼 것을 모두 고르세요.

① 파일 처리는 데이터의 양이 많을 때, 데이터베이스는 데이터의 양이 적을 때 적합하다.

② DBMS는 데이터베이스를 관리하는 소프트웨어 또는 시스템을 지칭한다.

③ DBMS 제품에는 오라클, SQL Sever, MySQL, Excel, PowerPoint 등이 있다.

④ SQLite는 가벼운 DBMS 중 하나다.

 

더보기

답 : 1, 3

해설 : 1번 파일 처리는 데이터의 양이 적을 때, 데이터베이스는 데이터의 양이 많을 때 적합하다.

           3번 Excel, PowerPoint는 DBMS 제품이 아니다.

 

2. MySQL, SQLite 등이 포함되는 데이터베이스 종류를 하나 고르세요.

① 계층형 DBMS

② 망 DBMS

③ 관계형 DBMS

④ 객체지향형 DBMS

 

더보기

답 : 3

 

3. 다음 각 항이 설명하는 용어를 쓰세요.

(1) 데이터가 표 형태로 표현된 것을 말한다.

(2) 테이블이 저장되는 저장소를 말한다.

(3) 사용자와 DBMS가 소통하기 위한 언어를 말한다.

(4) 회원테이블의 회원이름 열은 문자 형식, 출생년도는 숫자 형식으로 지정하는 것을 말한다.

 

더보기

답 : (1) 테이블, (2) 데이터베이스, (3) SQL, (4) 데이터 형식

 

4. 다음은 데이터베이스의 구축 과정입니다. 차례대로 나열하세요.

A. 응용 프로그램에서 활용
B. 데이터 조회
C. 데이터 입력
D. 테이블 생성
E. 데이터베이스 생성
F. DBMS 설치

 

더보기

답 : F - E - D - C - B - A

 

5. SQLite의 데이터 입력 과정입니다. 차례대로 나열한 것을 고르세요.

A. 테이블 만들기
B. 커서 생성

C. 데이터베이스 연결
D. 데이터베이스 닫기
E. 입력한 데이터 저장
F. 데이터 입력

① CBAFED

② ABCDEF

③ CABEFD

④ CDEFAB

 

더보기

답 : 1

 

6. 파이썬에서 데이터를 입력하는 코드입니다. 빈칸을 채우세요.

import sqlite3

con = sqlite3.connect("C:/CookPython/naverDB")
cur = [     ①     ]

while (True) :
    data1 = input("사용자ID ==> ")
    if data1 == "" :
        break;
    data2 = input("사용자이름 ==> ")
    data3 = input("이메일 ==> ")
    data4 = input("출생연도 ==> ")
    sql = "INSERT INTO userTable VALUES('" + data1 + "','" + data2 + "')"
    [     ②     ]
    
[     ③     ]
con.close()

 

더보기

답 : con.cursor(), cur.execute(sql), con.commit()

 

7. 다음은 데이터를 조회하는 코드의 일부입니다. 빈 칸을 채우세요.

con = sqlite3.connect("naverDB")
cur = [     ①     ]
sql = "SELECT * FROM userTable"
[     ②     ]

 

더보기

답 : ① con.cursor(), ② cur.fetchone

 

8. [응용예제 02]는 RAW 파일을 DB에 저장하고 화면에 출력하는 코드입니다. 이에 다음 기능을 추가하세요.

(1) [파일] >> [열기] 메뉴를 추가해서 원하는 RAW 파일을 선택해서 열도록 한다.

(2) [사진효과] 메뉴를 추가하고, 그 하위에 [밝게하기], [어둡게하기], [반전하기] 메뉴를 추가한다.

(3) [밝게하기], [어둡게하기], [반전하기]를 선택하면 데이터베이스의 테이블이 변경된 후에, 데이터베이스의 내용을 메모리로 불러와서 화면을 출력하도록 한다.

힌트 [사진효과]는 UPDATE문을 테이블에 실행해야 한다.

 

더보기

답 :

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import os.path
import math
import sqlite3

## 함수 선언 부분 ##
def func_open():
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    filename = askopenfilename(parent=window, filetypes=(("RAW 파일", "*.raw"), ("모든 파일", "*.*")))
    if filename == '':  # 대화상자에서 취소를 눌렀으면
        return

    if canvas != None:  # 기존에 열린 적이 있으면 제거
        canvas.destroy()

    # 파일 --> 메모리
    loadImage(filename)

    window.geometry(str(XSIZE) + 'x' + str(YSIZE))  # 윈도창 크기
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image((XSIZE / 2, YSIZE / 2), image = paper, state = "normal")

    # 메모리 --> 화면
    loadImage(filename) # 파일 --> 데이터베이스
    loadDatabase() # 데이터베이스 --> 메모리
    displayImage(inImage) # 메모리 --> 화면

    canvas.pack()

def loadImage(fname) :  # raw --> DB
    global inImage, XSIZE, YSIZE
    con, cur = None, None
    row, col, data, sql = 0, 0, 0, ''
    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    fp = open(fname, 'rb')
    for row in range(0, XSIZE) :
        for col in range(0, YSIZE) :
            data = int(ord(fp.read(1)))
            sql = "INSERT INTO rawTable VALUES(" + str(row) + "," + str(col) + "," + str(data) + ")"
            cur.execute(sql)

    fp.close()
    con.commit()
    con.close()

def loadDatabase() :  # DB --> 메모리
    global inImage, XSIZE, YSIZE
    con, cur = None, None
    row, col, data = 0, 0, 0
    record = None # 테이블에서 읽어온 한 행
    con = sqlite3.connect("C:/CookPython/rawDB")
    cur = con.cursor()  
    cur.execute("SELECT * FROM rawTable")
    # 빈 inImage 생성
    for i in range(0, XSIZE) :
        tmpList = []
        for k in range(0, YSIZE) :
            data = 0
            tmpList.append(data)
        inImage.append(tmpList)

    # 테이블 --> inImage
    while (True) :
        record = cur.fetchone()
        if record== None :
            break;
        row = record[0]; col = record[1]; data = record[2]
        inImage[row][col] = data
    
    con.close()

def displayImage(image) :
    global XSIZE, YSIZE
    rgbString = ""
    for i in range(0, XSIZE) :
        tmpString = ""
        for k in range(0, YSIZE) :
            data = image[i][k]
            tmpString += "#%02x%02x%02x " % (data, data, data)	# x 뒤에 한 칸 공백
        rgbString += "{" + tmpString +  "} "	# } 뒤에 한 칸 공백
    paper.put(rgbString)


def func_exit() :
    window.quit()
    window.destroy()

def brightPhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    value = 0
    value = askinteger('밝게', '값 입력', minvalue=1, maxvalue=255)

    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = data +" + str(value)
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

def darkPhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    value = 0
    value = askinteger('어둡게', '값 입력', minvalue=1, maxvalue=255)

    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = data -" + str(value)
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 255 WHERE data > 255"
    cur.execute(sql)
    sql = "UPDATE rawTable SET data = 0 WHERE data < 0"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

def reversePhoto() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    con = sqlite3.connect("C:/CookPython/rawDB")  # DB가 저장된 폴더까지 지정
    cur = con.cursor()
    sql = "UPDATE rawTable SET data = 255 - data"
    cur.execute(sql)
    con.commit()
    con.close()

    loadDatabase()  # 데이터베이스 --> 메모리
    displayImage(inImage)

## 전역 변수 선언 부분
window, canvas, XSIZE, YSIZE = None, None, 256, 256
inImage = [] # 2차원 리스트 (메모리)

## 메인 코드 부분 ##
if __name__ == "__main__" :
    window = Tk()
    window.title("연습문제")
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image((XSIZE/2, YSIZE/2), image = paper, state = "normal")

    # 테이블 초기화
    con = sqlite3.connect("C:/CookPython/rawDB")  # 소스코드가 저장된 폴더에 생성됨
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS rawTable")
    cur.execute("CREATE TABLE rawTable(row  int , col int, data int)") # 행,열,픽셀값
    con.commit()
    con.close()

    # 메뉴 추가
    mainMenu = Menu(window)
    window.config(menu = mainMenu)
    fileMenu = Menu(mainMenu)
    mainMenu.add_cascade(label = "파일", menu = fileMenu)
    fileMenu.add_command(label = "파일 열기", command = func_open)
    fileMenu.add_separator()
    fileMenu.add_command(label = "프로그램 종료", command = func_exit)

    photoMenu = Menu(mainMenu)
    mainMenu.add_cascade(label = "사진효과", menu = photoMenu)
    photoMenu.add_command(label = "밝게하기", command = brightPhoto)
    photoMenu.add_command(label = "어둡게하기", command = darkPhoto)
    photoMenu.add_command(label = "반전 이미지", command = reversePhoto)

    filename = 'RAW/tree.raw'  # C:/CookPython/RAW/tree.raw
    loadImage(filename)
    loadDatabase()
    displayImage(inImage)

    canvas.pack()
    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

* 출판사 문의 결과 11번 문제에 이상이 있어 다음 쇄부터 문제 자체를 뺀다고 합니다.

 

연습문제

1. 객체지향과 관련된 설명입니다. 거리가 가장 먼 것을 하나 고르세요.

① 자바, C++ 등에서도 사용되는 개념이다.

② 클래스라는 핵심적인 단어를 사용한다.

속성은 색상, 속도 등 자동차의 상태를 표현한다.

기능은 변수 형태로 표현한다.

 

더보기

답 : 4

해설 : 기능은 메서드로 구현되며 객체의 상태를 나타내는 속성을 변수 형태로 표현한다.

 

2. 다음은 자동차의 클래스로 만든 코드입니다. 메소드에서 틀린 부분 2곳을 찾아서 맞게 고치세요.

class Car :
	color = ""
    speed = 0
    
    def upSpeed(value) :
    	speed += value

 

더보기

답 :

class Car :
	color = ""
    speed = 0
    
    def upSpeed(self, value) :
    	self.speed += value

 

 

3. 다음은 생성자에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 인스턴스가 생성되면 자동으로 호출되는 메서드이다.

② 생성자의 이름은 __initilaize()__로 사용한다.

생성자는 반드시 클래스 안에 1개 이상 코드로 작성해야 한다.

생성자는 여러 개 만들 수 있다.

 

더보기

답 : 2, 3

해설 : 2번 생성자의 이름은 __init__로 사용한다.

3번 생성자는 클래스 안에 작성하지 않아도 기본 생성자가 호출된다.

 

4. 속도를 50으로 초기화하는 클래스의 생성자 코드입니다. 빈칸을 채우세요.

class Horse :
	speed = 0
    [
    
                     ]

 

더보기

답 :

def __init__(self) :
	self.speed = 50

 

5. 인스턴스 변수와 클래스 변수에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 클래스 변수를 선언할 때는 static을 앞에 붙인다.

② 인스턴스 변수와 클래스 변수는 선언하는 시점에는 구분할 수 없다.

인스턴스 변수는 'self.변수명' 형식으로 사용한다.

클래스 변수는 아무 것도 붙이지 않고 '변수명' 형식으로 사용한다.

 

더보기

답 :  1, 4

해설 : 1번 클래스 변수를 선언할 때는 static을 앞에 붙이지 않아도 된다.

4번 클래스 변수는 '클래스명.클래스변수명', '인스턴스명.클래스변수명' 형식으로 사용한다. 

 

6. 다음은 클래스의 상속과 관련된 코드입니다. 코드의 실행 결과를 고르세요.

class Car :
    def method(self) :
        print("슈퍼 클래스")

class Sedan(Car) :
    def method(self) :
        print("서브 클래스")
    
myCar = Car()
mySedan = Sedan()
myCar.method()
mySedan.method()

① 서브 클래스

② 슈퍼 클래스

③ 슈퍼 클래스 서브 클래스

④ 서브 클래스 슈퍼 클래스

 

더보기

답 : 3

 

7. Car의 상속을 받는 RVCar 클래스를 정의하는 코드입니다. 빈칸을 채우세요.

class Car :
	speed = 0
    
    def upSpeed(self, value) :
        self.speed = self.speed + value

[          ] :
    seatNum = 0
    
    def getSeatNum(self) :
        return self.seatNum

 

더보기

답 : class RVCar(Car)

 

8. super( ) 메서드에 대한 설명입니다. 가장 옳은 설명을 고르세요.

① 클래스 메서드와 관련된다.

② 오버라이딩된 메서드에서 슈퍼 클래스의 메서드를 호출할 때 사용한다.

③ 'super.메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

④ 'super.속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

더보기

답 : 2번

해설 : 1번 super() 메서드는 클래스 메서드와 직접적인 관련이 없으며, 주로 상속 관계에서 부모 클래스의 메서드를 호출하는 용도로 사용된다.

3번  'super( ).메서드( )' 형식으로 슈퍼 클래스의 메서드를 사용한다.

4번 'super( ).속성' 형식으로 슈퍼 클래스의 속성을 사용한다.

 

9. 다음 각 설명을 보기 중에서 고르세요.

__repr__(), __le__(), __add__(), __del__(), __lt__(), __gt__(), __ge__(), __eq__(), __ne__()

(1) 인스턴스 사이의 비교 연산자(!=)가 사용될 때 호출되는 메서드다.

(2) 소멸자라고 부르며 인스턴스가 제거될 때는 자동으로 호출된다.

(3) 인스턴스 사이의 덧셈 작업이 일어나면 실행되는 메서드다.

(4) 인스턴스를 print( ) 함수를 이용해 출력할 때 실행되는 메서드다.

(5) 인스턴스 사이의 비교 연산자(<=)가 사용될 때 호출되는 메서드다.

 

더보기

답 : (1) __ne__(), (2) __del__(), (3) __add__(), (4) __repr__(), (5) __le__()

 

10. 다음은 파이썬의 추상 메서드를 위한 코드입니다. 빈칸에 들어갈 것을 고르세요.

class SuperClass :
    def method(self) :
        [          ]

class SubClass(SuperClass) :
    pass

sub = SubClass()
sub.method()

① raise ImplementedError( )

raise NotImplemented( )

raise Implemented( )

raise NotImplementedError( )

 

더보기

답 : 4

 

11. 다음 멀티 프로세싱 코드의 빈 부분을 채우세요.

import multiprocessing
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name

    def runHorse(self) :
        for _ in range(0, 3) :
            horseStr = self.horseName + '~~ 달립니다.\n'
            print(horseStr, end = '')
            time.sleep(0.1) # 0.1초 멈춤

## 메인 코드 부분 ##
if __name__ == "__main__" :
    horse1 = [     ①     ]('@얼룩말')
    horse2 = [     ②     ]('#조랑말')

    mp1 = [     ③     ](target = horse1.runHorse)
    mp2 = [     ④     ](target = horse2.runHorse)

    mp1.start()
    mp2.start()

    mp1.join()
    mp2.join()

 

더보기

답 : RunningHorse, ② RunningHorse, ③ multiprocessing.Process, ④ multiprocessing.Process

 

12. 다음은 멀티 스레드를 위한 코드입니다. 빈칸에 들어갈 코드를 채우세요.

import threading
import time

class RunningHorse :
    horseName = ''
    def  __init__(self, name) :
        self.horseName = name
    def runHorse(self) :
        for _ in range(0, 3) :
            print(self.horseName)
            time.sleep(0.1)

horse1 = [     ①     ]('@얼룩말')
horse2 = [     ①     ]('#조랑말')
thead1 = threading.Thread(target = horse1.[     ②     ])
thead2 = threading.Thread(target = horse2.[     ②     ])
thead1.[     ③     ]()
thead2.[     ③     ]()

 

더보기

답 : RunningHorse, runHorse, start

 

13. [응용예제 02]를 수정해서 <Delete> 키를 누르면 마지막 원부터 제거되고, <BackSpace> 키를 누르면 마지막 사각형부터 제거되도록 하세요.

힌트 Backspace 키의 이벤트는 <BackSpace>이고, Delete 키의 이벤트는 <Delete>다

더보기

답 :

from tkinter import *
import math
import random


## 클래스 선언
class Shape:  # 슈퍼 클래스
    color, width = '', 0
    shX1, shY1, shX2, shY2 = [0] * 4  # 도형을 포함하는 두 점

    def drawShape(self):  # 추상 메소드
        raise NotImplementedError()


class Rectangle(Shape):  # 서브 클래스
    objects = None  # 사각형 선분 리스트

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 사각형의 4개 선분을 제거함
        for obj in self.objects:
            canvas.delete(obj)

    def drawShape(self):  # 네모 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        squreList = []
        squreList.append(canvas.create_line(sx1, sy1, sx1, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx1, sy2, sx2, sy2, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy2, sx2, sy1, fill=self.color, width=self.width))
        squreList.append(canvas.create_line(sx2, sy1, sx1, sy1, fill=self.color, width=self.width))
        self.objects = squreList  # 선분 리스트(=사각형)을 objects에 넣음.


class Circle(Shape):  # 서브 클래스
    objects = None

    def __init__(self, x1, y1, x2, y2, c, w):
        self.shX1 = x1
        self.shY1 = y1
        self.shX2 = x2
        self.shY2 = y2
        self.color = c
        self.width = w
        self.drawShape()

    def __del__(self):  # 원은 객체 1개만 제거
        canvas.delete(self.objects)

    def drawShape(self):  # 원형 그리기로 재정의
        sx1 = self.shX1;
        sy1 = self.shY1;
        sx2 = self.shX2;
        sy2 = self.shY2
        self.objects = canvas.create_oval(sx1, sy1, sx2, sy2, outline=self.color, width=self.width)


## 함수 정의 부분
def getColor():  # 임의의 색상 선택
    r = random.randrange(16, 256)  # 16진수로 변환시 0~A는 제외
    g = random.randrange(16, 256)
    b = random.randrange(16, 256)
    return "#" + hex(r)[2:] + hex(g)[2:] + hex(b)[2:]  # '#rrggbb' 형태로 만듬


def getWidth():  # 임의의 펜 두께 선택
    return random.randrange(1, 9)


## 이벤트 함수 정의 부분
def startDrawRect(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawRect(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    rect = Rectangle(x1, y1, x2, y2, getColor(), getWidth())  # 사각형 생성
    shapes.append(rect)  # 전체 도형 리스트에 추가


def startDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x1 = event.x
    y1 = event.y


def endDrawCircle(event):
    global x1, y1, x2, y2, shapes
    x2 = event.x
    y2 = event.y
    cir = Circle(x1, y1, x2, y2, getColor(), getWidth())  # 원 생성
    shapes.append(cir)  # 전체 도형 리스트에 추가


def deleteObject(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 또는 사각형 객체 확인
                del (shapes[i])
                break


def deleteCircle(event, objType):  # 마지막 그린 원제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 원 객체 확인
                del (shapes[i])
                break


def deleteRectangle(event, objType):  # 마지막 그린 사각형 제거
    global shapes
    if len(shapes) != 0:  # 화면에 도형이 있으면 마지막 도형 제거
        for i in range(len(shapes) - 1, -1, -1):
            strObj = str(shapes[i])
            if strObj.find(objType) != -1:  # 사각형 객체 확인
                del (shapes[i])
                break


## 전역  변수 선언
shapes = []  # 화면에 그려진 전체 도형 리스트
window = None
canvas = None
x1, y1, x2, y2 = None, None, None, None  # 클릭한 두 지점의 X, Y

## 메인 코드 부분 ##
if __name__ == "__main__":
    window = Tk()
    window.title("연습 문제")
    canvas = Canvas(window, height=300, width=300)

    window.bind("<Delete>", lambda event: deleteCircle(event, 'Circle'))
    window.bind("<BackSpace>", lambda event: deleteRectangle(event, 'Rectangle'))

    canvas.bind("<Button-1>", startDrawRect)
    canvas.bind("<ButtonRelease-1>", endDrawRect)

    canvas.bind("<Button-3>", startDrawCircle)
    canvas.bind("<ButtonRelease-3>", endDrawCircle)

    canvas.pack()
    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

연습문제

1. 다음 보기를 입력과 관련된 함수와 출력과 관련된 함수로 분류하세요.

input(), print(), write(), read(), readline(), writeline(), readlines()

 

더보기

답 :

입력과 관련된 함수 : input(), read(), readline(), readlines()

출력과 관련된 함수 : print(), write(), writeline()

 

2. 다음은 파일의 처리단계입니다. 순서대로 나열한 것이 맞는 것을 고르세요.

A. 파일 열기
B. 파일 쓰기
C. 파일 읽기
D. 파일 닫기

① A -> C -> B -> D

A -> C -> D -> B

D -> C -> B -> A

A -> D -> B -> C

 

더보기

답 : 1

 

3. 파일의 열기 모드에 대한 설명입니다. 거리가 먼 것을 모두 고르세요.

① 생략하면 쓰기 모드가 기본으로 설정된다.

② r+는 읽기/쓰기 겸용 모드다

a는 쓰기 모드이다. 기존 파일이 있으면 삭제하고 새로 만든다.

④ t는 텍스트 모드다.

b는 이진 파일 모드다.

⑥ tb는 텍스트 파일 겸 이진 파일 모드 공용이다.

 

더보기

답 : 1, 3, 6

해설 : 1번 생략하면 읽기 모드가 기본으로 설정된다. 3번 기존 파일을 삭제하지 않고 파일 끝에 이어서 쓴다. 6번 tb는 없는 모드이다.

 

4. 다음은 data1.txt 파일에서 1개 행만 읽어서 출력하는 코드입니다. 빈칸을 채우세요.

inFp = [     ①     ]("C:/Temp/data1.txt", "r")

inStr = inFp.[     ②     ]()
print(inStr, end = "")

inFp.[     ③     ]()

 

더보기

답 : ① open, ② readline, ③ close

 

5. 파일이 있는지 확인하는 함수를 다음 중에서 고르세요.

① os.path.file(파일명)

os.path.isfile(파일명)

os.path.place(파일명)

os.path.exists(파일명)

 

더보기

답 : 4

 

6. 다음은 파일을 복사하는 코드입니다. 빈칸을 채우세요.

inFp = open("C:/Windows/win.ini", "r")
outFp = open("C:/Temp/data3.txt", "w")

inList = [     ①     ]
for inStr in inList :
    [     ②     ]

inFp.close()
outFp.close()

 

더보기

답 : inFp.readlines(), outFp.writelines(inStr)

 

7. 글자에 대응하는 고유한 숫자를 알려주는 함수와 숫자에 해당하는 글자를 알려주는 함수의 짝으로 옳은 것을 고르세요.

① number( ), char( )

order( ), character( )

ocp( ), ch( )

ord( ), chr( )

 

더보기

답 : 4

 

8. 각 설명에 맞는 os, os.path, shutil 모듈의 함수를 쓰세요.

(1) 파일 복사

(2) 디렉터리 복사

(3) 디렉터리 생성

(4) 디렉터리 삭제

(5) 폴더 여부 확인

(6) 파일 삭제

 

더보기

답 : (1) shutil.copy, (2) shutil.copytree, (3) os.mkdir, (4) shutil.rmtree, (5) os.path.isdir, (6) os.remove

 

9. 다음 각 함수의 의미를 보기에서 고르세요.

파일 복사, 디렉터리 복사, 디렉터리 생성, 디렉터리 삭제, 폴더여부 확인, 파일 삭제

(1) shutil.rmtree( )

(2) os.path.isdir( )

(3) os.remove( )

(4) shutil.copy( )

(5) shutil.copytree( )

(6) os.mkdir( )

 

더보기

답 : (1) 디렉터리 삭제, (2) 폴더여부 확인, (3) 파일 삭제, (4) 파일 복사, (5) 디렉터리 복사, (6) 디렉터리 생성

 

10. try~except 문에서 사용하는 예외 종류를 설명한 것입니다. 예외를 쓰세요.

(1) 존재하지 않는 변수에 접근할 때

(2) 파일 처리에서 오류가 발생할 때

(3) 실행에서 오류가 발생할 때

(4) 딕셔너리에 키가 없을 때

 

더보기

답 : (1) NameError, (2) IOError, (3) RuntimeError, (4) KeyError

 

11. 다음은 파일이 없을 때 또는 0으로 나눌 때 예외 처리를 하는 코드입니다. 빈칸을 채우세요.

try :
	infp = open("c:/nofile", "r")
    value = 100 / 0
[     ①     ]:
	print("파일 입출력 오류 입니다.")
{     ②     ]:
	print("0으로 나눴습니다.")
    
print("프로그램 종료!")

 

더보기

답 : ① except IOError, ② except ZeroDivisionError

 

12. [응용예제 02]를 수정해서 다음의 기능을 구현하세요.

 ·마우스 왼쪽 버튼을 누르면 10씩 화면이 밝아진다.

 ·마우스 오른쪽 버튼을 누르면 10씩 화면이 어두워진다.

 ·마우스 가운데 버튼을 누르면 화면이 반전된다. (또 누르면 원래 화면)

 

더보기

답 :

from tkinter import *
from tkinter.filedialog import *
from tkinter.simpledialog import *
import os.path
import math

## 함수 선언 부분 ##
def  loadImage(fname) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    inImage=[]
    fsize = os.path.getsize(fname)              # 파일의 크기
    XSIZE = YSIZE = int(math.sqrt(fsize))      # 정방형으로 가정하고 크기 구함
    
    fp = open(fname, 'rb')   

    for i in range(0, XSIZE) :
        tmpList = []
        for k in range(0, YSIZE) :
            data = int(ord(fp.read(1)))
            tmpList.append(data)
        inImage.append(tmpList)

    fp.close()

def displayImage(image) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename
    rgbString = ""
    for i in range(0, XSIZE) :
        tmpString = ""
        for k in range(0, YSIZE) :
            data = image[i][k]
            tmpString += "#%02x%02x%02x " % (data, data, data) # x 뒤에 한칸 공백
        rgbString += "{" + tmpString +  "} " # } 뒤에 한칸 공백
    paper.put(rgbString)

def func_open() :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    filename = askopenfilename(parent = window, filetypes = (("RAW 파일", "*.raw"),  ("모든 파일", "*.*")))
    if filename == '' : # 대화상자에서 취소를 눌렀으면
        return
    
    if canvas != None : # 기존에 열린 적이 있으면 제거
        canvas.destroy()

     # 파일 --> 메모리
    loadImage(filename)
    
    window.geometry(str(XSIZE) + 'x' + str(YSIZE)) # 윈도창 크기
    canvas = Canvas(window, height = XSIZE, width = YSIZE)
    paper = PhotoImage(width = XSIZE, height = YSIZE)
    canvas.create_image( (XSIZE / 2, YSIZE / 2), image = paper, state = "normal")
   
    # 메모리 --> 화면 
    displayImage(inImage)
    
    canvas.pack()

def func_exit() :
    window.quit()
    window.destroy()

def brightPhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    addValue += 10

    for i  in range(0, XSIZE) :
        for k in range(0, YSIZE) :
            data = inImage[i][k] + addValue
            if  data > 255 :
                newData = 255
            elif data < 0 :
                newData = 0
            else :
                newData = data
            inImage[i][k] = newData

    displayImage(inImage)

def darkPhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename, addValue
    addValue -= 10
    for i in range(0, XSIZE) :
        for k in range(0, YSIZE) :
            data = inImage[i][k] + addValue
            if  data > 255 :
                newData = 255
            elif data < 0 :
                newData = 0
            else :
                newData = data
            inImage[i][k] = newData

    displayImage(inImage)

def reversePhoto(event) :
    global window, canvas, paper, filename, XSIZE, YSIZE, inImage, filename

    for  i  in  range(0, XSIZE) :
        for  k  in  range(0, YSIZE) :
            data = inImage[i][k]
            newData = 255 - data
            inImage[i][k] = newData

    displayImage(inImage)

## 전역 변수 선언 부분 ##
window = None
canvas = None
XSIZE, YSIZE=0, 0
inImage = []    # 2차원 리스트 (메모리)
filename = '' # 파일이름 (전역 변수)
addValue = 0

## 메인 코드 부분 ##
if __name__ == "__main__" :
    window=Tk()
    window.title("연습문제")

    # 메뉴 추가
    mainMenu = Menu(window)
    window.config(menu=mainMenu)
    fileMenu = Menu(mainMenu)
    mainMenu.add_cascade(label="파일", menu=fileMenu)
    fileMenu.add_command(label="파일 열기", command=func_open)
    fileMenu.add_separator()
    fileMenu.add_command(label="프로그램 종료", command=func_exit)

    window.bind("<Button-1>", brightPhoto)
    window.bind("<Button-2>", reversePhoto)
    window.bind("<Button-3>", darkPhoto)

    window.mainloop()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

+ Recent posts