CAFE

과제게시판

[python] 8장 요약 및 연습문제풀이

작성자2201042 장성진|작성시간25.12.03|조회수23 목록 댓글 0

8장 객체와 클래스

 

  객체 지향 프로그래밍

 객체 지향 프로그래밍에서는 방대한 함수로 만들어진 프로그램을 유지보수하기 쉽게 만들기 위해 서로 관련 있는 함수나 데이터들을 묶어서 객체로 만들고 객체들이 모여 프로그램이 된다. 이러한 프로그래밍 방식을 객체지향이라고 한다.

데이터와 함수를 하나의 덩어리(객체)로 묶는 것을 캡슐화 라고 한다.

객체 지향은 현실 세계를 시뮬레이션하는 언어였던 시뮬라 라는 언어에 기반을 두고 있다.

절차 지향 프로그래밍은 프로시저(라인 또는 하나의 실행 단위)를 기반으로 하는 방법으로, 이 때 프로그램은 함수들의 집합으로 이루어진다. 원하는 수준에 도달할 때까지 문제를 더 작은 서브 함수로 분해하여 작성함으로써 문제를 해결한다.

또한 클래스는 객체에 대한 설계도, 비슷한 데이터와 함수를 묶는 기준이 되는 설명문으로, 클래스로부터 만들어지는 객체를 그

클래스의 인스턴스 라고 한다. 이를 통해서 정의된 특성을 가진 객체를 필요에 따라 쉽게 찍어내듯이 만들 수 있다.

클래스에 의해서 제공되는 메소드는 공용 인터페이스 라고 한다. 이러한 메소드들은 구현 세부사항을 캡슐화를 통해 감춰지는데, 

사용시에는 세부 구현 사항을 알 필요가 없다. 

 

  클래스 작성하기

 클래스 안에는 함수와 변수를 정의하는데, 클래스 안에 정의된 변수를 인스턴스 변수, 함수는 메소드라고 하고,

이를 합쳐 클래스의 멤버 라고 한다. 기본적으로 변수는 객체의 속성을, 메소드는 동작을 나타낸다. 

클래스 이름에 ()를 붙여 호출하면, 객체 안의 __init__() 함수가 호출되면서 객체가 생성된다. 이를 변수에 대입해여 사용한다.

객체 안의 메소드나 변수에 접근하려면 객체 이름에 .을 붙이고 메소드나 변수 이름을 적어주면 된다. 클래스로 생성된 객체들은 각각 별도의 인스턴스 변수를 가진다.

 

  정보 은닉

 정보 은닉이란 구현의 세부 사항을 클래스 안에 감추는 것이다. 따라서 클래스 안에 변수를 선언할 때는 private로 선언함으로서

객체의 내부 데이터를 지킬 수 있다. 이러한 경우 외부에서 변수의 값에 간접적으로 접근할 수 있는 메소드를 만드는 것이 좋다. 

 

  객체 참조

 파이썬에서 변수는 객체의 메모리 주소를 저장하는데, 이 주소를 객체 참조값 이라고 한다. 일반적으로는 메모리 주소이지만,

기본적으로는 객체를 구별하여 참조할 수 있는 값이기만 하면 된다. 이에 따라 객체를 가리키는 변수를 다른 변수에 대입연산하면,

객체가 생성되지 않고 참조값만 복사된다. 변수가 아무것도 가리키고 있지 않다면 None으로 설정하는 것이 좋다.

함수에서 객체를 참조할 때는 기본적으로 객체 자체를 참조하여 원본 객체의 데이터를 변경한다.

다만 변경 불가능한 데이터일 경우 원본은 그대로 두고, 함수 내에서 새로운 데이터를 생성하여 변경한다.

 

  클래스 변수

 인스턴스 변수는 항상 객체를 통하여 사용하여야 한다. 그러나 파이썬에서는 클래스 단위로 객체를 통하지 않고 사용할 수 있는 변수를 만들 수 있다. 이 변수는 모든 객체를 통틀어 하나만 생성되고, 모든 객체가 이것을 공유하게 된다. 이러한 변수를 클래스 
멤버 라고 한다. 클래스를 정의 할 때 메소드와 동일한 수준에서 변수를 생성하면 클래스 변수로 정의된다. 

 

  특수 메소드

 파이썬의 특수 메소드는 특정한 연산을 하도록 사전에 정의된 메소드들로, 이름이나 호출 및 사용방식이 정해져 있다.

__str__()메소드를 직접 작성한 후 print(객체명)을 사용하여 객체 안의 정보들을 출력하게 할 수도 있다.

 

 

python_8_func.py)

# 1

class Cat :

    def __init__(self, name = None, age = 0):

        self.name = name

        self.age = age

    def __str__(self):

        return f"{self.name} {self.age}"

   

# 2

class Rocket :

    def __init__(self, x = 0, y = 0):

        self.x = x

        self.y = y

    def moveup(self):

        self.y += 1

 

# 3

class Box :

    def __init__(self, length = 0, height = 0, depth = 0):

        self.length = length

        self.height = height

        self.depth = depth

    def __str__(self):

        return f"({self.length}, {self.height}, {self.depth})"

    def get_length(self):

        return self.length

    def get_height(self):

        return self.height

    def get_depth(self):

        return self.depth

 

# 4

class Rac :

    def __init__(self, x = 0, y = 0, w = 0, h = 0):

        self.x = x

        self.y = y

        self.w = w

        self.h = h

    def __str__(self, x, y, w, h):

        return f"{self.x}, {self.y}, {self.w}, {self.h}"

    def is_overlap(self, rect2):

        if self.x + self.w <= rect2.x or self.x >= rect2.x + rect2.w or self.y + self.h <= rect2.y or self.y >= rect2.y + rect2.h:

            return False

        return True

 

# 5

class Tri :

    def __init__(self, angle1, angle2, angle3, sidenum = 3):

        self.angle1 = angle1

        self.angle2 = angle2

        self.angle3 = angle3

        self.sidenum = sidenum

    def chackangle(self):

        if self.angle1 + self.angle2 + self.angle3 == 180:

            return True

        else : return False

 

# 6

class Person :

    def __init__(self, name, mobile = None, office = None, email = None):

        self.name = name

        self.mobile = mobile

        self.office = office

        self.email = email

    def setemail(self) :

        print(f"{self.name}")

    def __str__(self):

        print(f"name={self.name}, mobile={self.mobile}, office={self.office}, email={self.email}")

       

# 7

class Phonebook:

    def __init__(self, contact):

        self.contact = contact

    def add(self, name, mobile=None, office=None, email=None):

        self.contact[name] = {

            "mobile": mobile,

            "office": office,

            "email": email

        }

    def __str__(self):

        result = ""

        for name in self.contact.keys():

            result += f"{name}\n"

            for k in self.contact[name].keys():

                result += f"{k}: {self.contact[name][k]}\n"

            result += "\n"

        return result

   

# 8

class Song:

    def __init__(self, song):

        self.song = song

    def sing(self):

        print(self.song)

           

# 9

import turtle

class Maketurtle:

    def __init__(self, name, shape="turtle"):

        self.name = name

        self.t = turtle.Turtle()

        self.t.shape(shape)

    def forward(self, distance):

        self.t.forward(distance)

    def left(self, angle):

        self.t.left(angle)

    def right(self, angle):

        self.t.right(angle)

 

 

 

python_8_main.py)

import python_8_func as func



def main():

 

    # 1

    missy = func.Cat('Missy', 3)

    lucky = func.Cat('Lucky', 5)

    print(missy)

    print(lucky)

 

    # 2

    myrocket = func.Rocket()

    print("로켓의 높이:", myrocket.y)

    myrocket.moveup()

    print("로켓의 높이:", myrocket.y)

 

    # 3    

    box = func.Box(10, 10, 10)

    print(box)

    print(box.get_length()*box.get_height()*box.get_depth())

 

    # 4

    r1 = func.Rac(0, 0, 100, 100)

    r2 = func.Rac(10, 10, 100, 100)

    if (r1.is_overlap(r2)) :

        print("r1과 r2는 서로 겹칩니다.")

 

    # 5

    tri = func.Tri(90,30,60)

    if tri.chackangle(): print("정상입니다.")

 

    # 6

    p1 = func.Person("kim", office = "1234567", email = "kim@company.com")

    p2 = func.Person("park", office = "2345678")

    p2.setemail("park@ponpacy.com")

 

    # 7

    obj = func.Phonebook({})

    obj.add("kim", office="1234567", email="kim@company.com")

    obj.add("park", office="2345678", email="park@company.com")

    print(obj)

 

    # 8

    asong = func.Song([

    "song_name:",

    "aaa",

    "sss",

    "ddd",

    ])

    asong.sing()

 

    # 9

    import turtle

    cat = func.Maketurtle("cat")

    dog = func.Maketurtle("dog", "circle")

    cat.forward(100)

    dog.left(180), dog.forward(100)

    cat.right(90), dog.right(90)

    cat.forward(10), dog.forward(10)

    cat.left(90), dog.left(90)

    cat.forward(100), dog.forward(100)

    turtle.done()



if __name__ == "__main__":

    main()

 

다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 신고 센터로 신고

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼