* 출판사 문의 결과 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()

 

 

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

+ Recent posts