[Python] 12.클래스(Class)

□ 클래스

파이선을 이용하여 클래스를 만들 수 있습니다. 다른 객체지향 언어와 거의 비슷합니다.

클래스를 만들고 객체로 선언하여 사용합니다. 그리고 객체의 메소드를 호출해서 사용합니다.

 

▶︎ 유의사항.

• __init__

생성자, 클래스 인스턴스가 생성될때 호출됩니다. 반드시 객체를 초기화하기 위해서는 __init__라는 특별한 메소드를 사용해야 합니다. 그리고 이 안에서 사용되는 self인자는 항상 첫번째에 오며 자기자신을 가리킵니다. 이름이 꼭 self일 필요는 없지만, 관례적으로 self로 사용됩니다.

생성자에서는 해당 클래스가 다루는 데이터를 정의하는데 이 데이터를 멤버변수(member variable) 또는 속성(attribute)이라고 합니다.

 

• self

파이썬의 method는 항상 첫번째 인자로 self를 전달합니다. self는 현재 해당 메소드가 호출되는 객체 자신을 가리킵니다. 

c++/c#/java의 this에 해당되며 이것또한 이름이 self일 필요는 없으나, 위치는 항상 맨 처음의 parameter이며 관례적으로 self 사용합니다.

 

 

■ 클래스 만들기

클래스를 만드는 방법에 대해 알아봅니다.

 

▶︎ 예제 코드

• 예제 1 : 클래스 객체 프로퍼터 초기화 및 메소드 정의

코드 :
# 클래스 정의
class Circle(object):
    
    # 초기화 코드.
    # 객체가 만들어질 때 반드시 실행되는 메서드
    def __init__(self):
        self.radius = 0
    
    # 메소드 정의
    def change_radius(self, radius):
        self.radius = radius

    # 메소드 정의    
    def get_radius(self):
        return self.radius
    
# 클래스 사용 : 하나의 클래스를 다중 객체로 선언
one_circle = Circle()
other_circle = Circle()

# 객체의 메소드 호출.
one_circle.change_radius(4)

print(one_circle.get_radius())
print(other_circle.get_radius()) 

결과 :
4
0

 

 

• 예제 2  : 클래스 객체 프로퍼터 초기화 및 메소드 정의

코드 :
class Windows(object):
    def __init__(self):
        self.width = 1
        self.height = 1
        self.open = False
        
    def change_state(self):
        # 상태변경.
        self.open = not self.open
        
    def get_state(self):
        return self.open
        
    def scale(self, factor):
        self.height *= factor
        self.width *= factor
        
    def get_scale(self):
        return self.height, self.width
        
# 객체선언 : 윈도우 상태 변경
window_one = Windows()

# 윈도우 상태변경 : 변경전
print("윈도우 상태변경전 : ",window_one.get_state())

# 윈도우 상태변경 : 변경 후
window_one.change_state()
print("윈도우 상태변경후 : ",window_one.get_state())

# 객체선언 : 윈도우 크기 확인
window_size = Windows()

# 윈도우 크기 설정.
window_size.change_state()
window_size.scale(3)

# 윈도우 크기 확인.
print("윈도우 크기확인 : ", window_size.get_scale())

결과 :
윈도우 상태변경전 :  False
윈도우 상태변경후 :  True
윈도우 크기확인 :  (3, 3)

 

• 예제 3 : 매개 변수를 받는 클래스 만들기.

코드 :
class Rectangle(object):
    def __init__(self,length,width):
        self.length = length
        self.width = width
        
    def set_length(self, length):
        self.length = length
        
    def set_width(self, width):
        self.width = width

    # 넓이를 반환
    def get_area(self):
        return self.length * self.width

    # 둘레를 반환
    def get_perimeter(self):
        return 2 * (self.length + self.width)

a_rec = Rectangle(2,4)

# 넓이를 반환
print(a_rec.get_area())

# 둘레를 반환
print(a_rec.get_perimeter())

결과 :
8
12

 

 

 

■ 선택적 추가 및 제거(스택방법을 이용한)

튜플을 연속적으로 추가하고 제거하는 방법입니다. 여러개로 추가된 항목중 마지막 항목부터 차례대로 출력하여 처음항목을

출력하는 것입니다. First in Last Out으로 스택의 특성을 클래스로 사용하는 방법을 알아봅니다.

 

▶︎ 예제 코드

코드 :
class Stack(object):
    def __init__(self):
        self.stack = []


    def get_stack_elements(self):
        return self.stack.copy()

    # 튜플 추가
    def add_one(self, item):
        self.stack.append(item)

    # 다중 튜플 추가
    def add_many(self, item, n):
        for i in range(n):
            self.stack.append(item)

    # 튜플 제거
    def remove_one(self):
        self.stack.pop()

    # 다중 튜플 제거
    def remove_many(self, n):
        for i in range(n):
            self.stack.pop()

    # 크기
    def size(self):
        return len(self.stack)

    # 스택 출력(마지막 튜플부터 차례대로 출력)
    def stackprint(self):
        for thing in self.stack[::-1]:
            print('|_', thing, '_|')

# 클래스 오브젝트 생성.
stackitem = Stack()

# 항목 추가
stackitem.add_one("stack_1")

# 다중으로 추가 항목 추가
stackitem.add_many("stack_2",4)

# 스택 크기
print(stackitem.size())

# 스택 제거전.
stackitem.stackprint()

# 스택 항목 1개 제거
stackitem.remove_one()

# 스택 크기
print(stackitem.size())

# 스택 제거 후 출력.
stackitem.stackprint()

# 나머지 스택 제거.
stackitem.remove_many(4)

# 스택 출력.
stackitem.stackprint()

결과 : 마지막은 모든스택이 제거되어서 아무것도 없습니다.
5
|_ stack_2 _|
|_ stack_2 _|
|_ stack_2 _|
|_ stack_2 _|
|_ stack_1 _|
4
|_ stack_2 _|
|_ stack_2 _|
|_ stack_2 _|
|_ stack_1 _|

 

 

 

■ 클래스 상속 및 메소드 오버라이딩

1. 클래스를 상속하는 방법에 대해 알아봅니다.

2. 메소드 오버라이딩에 대해 알아봅니다.

 

▶︎ 사용방법

1. 부모클래스 및 자식 클래스 선언 후 자식 클래스의 파라미터에 부모 클래스 사용

Child Class(Parenet Class)

2. 메소드 재정의.

 

▶︎ 예제 코드

코드 :
# 부모 클래스 선언
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self, food):
        print('{}은 {}를 먹습니다.'.format(self.name, food))

   def sleep(self, minute):
        print('{}은 {}를 잡니다.'.format(self.name, food))

    def work(self, minute):
        print('{}은 {}분동안 일합니다.'.format(self.name, food))

# 자식 클래스 선언
class Student(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):     <-메소드 오버라이드
        print('{}은 {}분동안 공부합니다.'.format(self.name, food))

# 클래스 상속 부분
# Employee 클래스 파라미터에 부모 클래스 Person 입력
class Employee(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):     <-메소드 오버라이드
        print('{}은 {}분동안 업무를 합니다.'.format(self.name, food))

bob = Person('Bob',25)
bob.eat('BBQ')
bob.sleep(30)
bob.work(60)

bob = Student('Bob',25)
bob.eat('BBQ')
bob.sleep(30)
# 메소드 오버라이딩 : 부모 메소드 재정의
bob.work(60)

bob = Employee('Bob',25)
bob.eat('BBQ')
bob.sleep(30)
# 메소드 오버라이딩 : 부모 메소드 재정의
bob.work(60)


결과 :
Bob은 BBQ를 먹습니다.
Bob은 30분동안 잡니다.
Bob은 60분동안 일합니다.

Bob은 BBQ를 먹습니다.
Bob은 30분동안 잡니다.
Bob은 60분동안 공부합니다.

Bob은 BBQ를 먹습니다.
Bob은 30분동안 잡니다.
Bob은 60분동안 업무를 합니다.

 

 

■ super 메소드 호출

하위클래스(자식클래스)에서 부모 클래스의 method를 호출할때 사용합니다.

 

▶︎ 사용방법

super.메소드명()

 

▶︎ 예제 코드

코드 :
# Person Class
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self, food):
        print('{}은 {}를 먹습니다.'.format(self.name, food))

   def sleep(self, minute):
        print('{}은 {}를 잡니다.'.format(self.name, food))

    def work(self, minute):
        print('{}은 {}분동안 준비를 합니다.'.format(self.name, food))

# Student Class
class Student(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):
        # 부모 메소드 호출
        super().work(minute)
        print('{}은 {}분동안 공부합니다.'.format(self.name, food))

# Employee Class
class Employee(Person):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def work(self, minute):
        # 부모 메소드 호출
        super().work(minute)
        print('{}은 {}분동안 업무를 합니다.'.format(self.name, food))

bob = Employee('Bob',25)
bob.eat('BBQ')
bob.sleep(30)
bob.work(60)

결과 :
Bob은 BBQ를 먹습니다.
Bob은 30분동안 잡니다.
Bob은 60분동안 준비를 합니다.
Bob은 60분동안 업무를 합니다.

 

 

■ 클래스 건너뛰기.

스크립트 개발중 디버깅 혹은 다른목적으로 미리 만들어두고 실제로 사용하지 않을 때 사용합니다.

 

▶︎ 사용방법

pass

 

▶︎ 예제 코드

class Employee():

    pass

 

■ 특수 메소드 오버라이드 하기

클래스작성시 거의 필수로 작성되는 __init__ 클래스 초기화 메소드  말고도 여러가지 특수 메소드(Special Method)가 있습니다. 이 메소드는 클래스에 연산자를 사용하여 연산을 추가하려 할때 이런 특수 메소드를 합니다. 이 특수 메소드를 사용하려면 메소드 오버라이드 방법(메소드 재정의)을 이용하여 사용합니다. 이 메소드는 여러가지가 있는데 자주 쓰이는 메소드들에 대해서 알아봅니다. 참고로 __(언더바 2개)로 시작하기 때문에 Double Underscore Method라고도 합니다.

 

▶︎ 사용예제

예제 코드 :
class Fraction(object):
    def __init__(self, top, bottom):
        self.top = top
        self.bottom = bottom

half = Fraction(1,2)
quarter = Fraction(1,4)
# 클래스끼리 더하기.
print(half + quarter)

결과 :
TypeError: unsupported operand type(s) for +: 'Fraction' and 'Fraction'

클래스의 기본 연산은 내부적으로 정의되어 있지 않아 변수에 정의된 값을 이용해서 더하기, 빼기를 하는것처럼 이용할시

위와같은 에러가 발생합니다. 그래서 클래스가 연산이 가능하도록 특수 메소드를 이용하여 연산을 할 수 있도록 해야 합니다.

 

▶︎ 특수 메소드 종류

• 수학연산
__add__ : 더하기(+)
__sub__ : 빼기(-)
__mul__ : 곱하기(*)
__truediv__ : 나누기(/)

• 비교
__eq__ : 같다(==)
__lt__ : 작다(<)
__gt__ : 크다(>)

• 기타
__str__ : 출력, 문자열(print(), str())
__init__ : 객체생성(예: 변수이름 = 클래스이름())

 

▶︎ 예제 코드

코드 :
class Fraction(object):
    def __init__(self, top, bottom):
        self.top = top
        self.bottom = bottom
    
    # print함수의 더하기(+)는 __add__메소드를 호출합니다.
    def __add__(self, other_fraction):
        new_top = self.top * other_fraction.bottom + self.bottom * other_fraction.top
        new_bottom = self.bottom * other_fraction.bottom
        return Fraction(new_top, new_bottom)
    
    # print함수의 곱하기(*)는  __mul__메소드를 호출합니다.
    def __mul__(self, other_fraction):
        new_top = self.top * other_fraction.top
        new_bottom = self.bottom * other_fraction.bottom
        return Fraction(new_top, new_bottom)
    
    # 밑에 print를 이 메소드와 맵핑.
    def __str__(self):
        return str(self.top) + "/" + str(self.bottom)
    
    
half = Fraction(1,2)
quarter = Fraction(1,4)

# 클래스끼리 더하기. 메소드 __add__ 호출
# self에 half, other_fraction에 quarter 적용. 순서대로 대입됩니다.
print(half + quarter)

# 클래스끼리 곱하기. 메소드 __mul__ 호출
# self에 half, other_fraction에 quarter 적용. 순서대로 대입됩니다.
print(half * quarter)

결과 :
6/8
1/8

 

 

 

■ 파이선 다른 회차

[Python] Intro : Very Quick Python : https://myinfrabox.tistory.com/169

 

[Python] Intro : Very Quick Python

개인적으로 공부하면서 정리해 놓은 파이선 자료를 업로드합니다. 여기의 내용은 문법에 대한 자세한 설명은 생략합니다. 개발 경험이 있는 분들에게 굳이 문법에 대한 자세한 설명은 필요없으

myinfrabox.tistory.com

[Python] 01.Python 준비 : https://myinfrabox.tistory.com/170

 

[Python] 01.Python 준비

파이선을 처음 접할때 콘솔로 프로그래밍하기 보다는 편리한 IDE툴을 이용해서 접해보기를 권합니다. 보통 프로그래밍을 처음 배울때 날(raw)코딩으로 처음 접하기를 권하고 저또한 마찬가지이

myinfrabox.tistory.com

[Python] 02.Python 스크립트 작성 방법 : https://myinfrabox.tistory.com/171

 

[Python] 02.Python 스크립트 작성 방법

리눅스, 유닉스에서 파이선을 실행시 맨위에 스크립트 종류를 선언합니다. 물론 선언하지 않고도 수행은 가능합니다. 그러나 리눅스, 유닉스에서 실행되는 대부분의 스크립트는 맨위에 특정 스

myinfrabox.tistory.com

[Python] 03.변수 선언 및 할당 : https://myinfrabox.tistory.com/172

 

[Python] 03.변수 선언 및 할당

1. 변수 할당 파이선에서 변수할당은 다른 스크립트 언어(php, shell script)처럼 특정 스트링을 입력 후 값을 할당합니다. 좌측은 변수명, 우측은 값을 입력합니다. 또한 변수명은 숫자로 시작할 수

myinfrabox.tistory.com

[Python] 04.문자열 처리 : https://myinfrabox.tistory.com/173

 

[Python] 04.문자열 처리

■ 문자열 인덱스 스트링으로 값을 받을때는 자동으로 인덱스 처리가 됩니다. 스트링 인덱스는 0부터 시작되며 끝에서 읽어올 시 -1부터 시작합니다. ▶︎ 사용방법 변수명[1] : 특정 인덱스에 값

myinfrabox.tistory.com

[Python] 05.조건문 : https://myinfrabox.tistory.com/174

 

[Python] 05.조건문

■ 조건문이 참 혹은 거짓일경우. 조건문의 True, False에 따라 그에 맞는 분기를 실행합니다. ▶︎ 사용방법 if 조건문: ▶︎ 예제 코드 코드 : num_a = 2 if num_a > 0: print("num_a가 0보다 큽니다") else: pr..

myinfrabox.tistory.com

[Python] 06.반복문 : https://myinfrabox.tistory.com/175

 

[Python] 06.반복문

■ for문 시퀀스의 모든 요소가 처음부터 마지막 수행될때까지 계속 반복힙ㄴ;디/ ▶︎ 사용방법 for <루프변수> in <튜플, 리스트등의 시퀀스>: ▶︎ 예제 코드 • 예제 1 : 시퀀스의 부분을 순서대

myinfrabox.tistory.com

[Python] 07.튜플(Tuple) : https://myinfrabox.tistory.com/176

 

[Python] 07.튜플(Tuple)

■ 튜플 뒤에서 배울 리스트와 비슷합니다. 데이터를 열거하는 식으로 만듭니다. ()안에 데이터를 열거합니다. 튜플의 특징은 tuple = (1,)처럼 단지 1개의 요소만을 가질 때는 요소 뒤에 콤마(,)를

myinfrabox.tistory.com

[Python] 08.리스트(List) : https://myinfrabox.tistory.com/177

 

[Python] 08.리스트(List)

■ 리스트 선언 리스트를 선언하는 방법입니다. ▶︎ 사용방법 기본적으로 []를 사용해서 선언합니다. ["리스트요소","리스트요소","리스트요소","리스트요소"] ▶︎ 예제 코드 strlist = ["TV","냉장

myinfrabox.tistory.com

[Python] 09.사전(Dictionary) : https://myinfrabox.tistory.com/178

 

[Python] 09.사전(Dictionary)

■ 사전 선언 방법 - 1 컬렉션중 사전을 만드는 방법입니다. 사전은 키:값 방식의 선언 방법입니다. {}(중괄호)문으로 시작합니다. 그리고 key:value방식으로 항목을 만듭니다. ▶︎ 사용방법 사전명

myinfrabox.tistory.com

[Pytho] 10.set : https://myinfrabox.tistory.com/179

 

[Pytho] 10.set

□ set이란? 키만 활용하는 데이터 구조로 이해합니다. 수학에서 집합과 동일한 개념입니다. ■ set 선언 방법 set을 선언하는 방법입니다. ▶︎ 사용방법 set변수 = {항목1, 항목2, ....} ▶︎ 예제 코

myinfrabox.tistory.com

[Python] 11.함수(Function) : https://myinfrabox.tistory.com/180

 

[Python] 11.함수(Function)

□ 사전 습득 지식 : 독 스트링(주석 묶기) 함수에는 보통 함수 명세서라 부르는 주석이 있습니다. 이곳에는 함수의 사용방법, 파라미터등을 설명합니다. 의무는 아니지만 팀으로 개발하는 소스

myinfrabox.tistory.com

[Python] 13.외부 클래스 사용하기 : https://myinfrabox.tistory.com/182

 

[Python] 13.외부 클래스 사용하기

□ 외부 클래스 사용하기 파이선에도 여러가지 유용한 클래스를 제공합니다. 수학, 스트링, 랜덤수, 시간등등 여러가지 외부에서 임포트해서 유용하게 사용할 수 있는 여러 클래스를 제공합니

myinfrabox.tistory.com

[Python] 14.파일처리 : https://myinfrabox.tistory.com/183

 

[Python] 14.파일처리

□ 파일처리 파일을 생성, 수정, 읽기를 하는 방법을 알아봅니다. ■ 파일 생성. 신규 파일을 생성합니다. 만약 기존 파일이 있을시 덮어씁니다. 파일을 생성하고 그 파일안에 내용을 작성할 수

myinfrabox.tistory.com

[Python] 15.MySQL Database : https://myinfrabox.tistory.com/184

 

[Python] 15.MySQL Database

□ MySQL데이터베이스 사용방법 MySQL 데이터베이스에 대해 사용방법을 알아봅니다. DB생성, 테이블 생성-삭제, DML문법을 알아봅니다. ■ 데이터 베이스 사용을 위한 환경설정. 파이선에서 MySQL데이

myinfrabox.tistory.com

 

'Develop > Python' 카테고리의 다른 글

[Python] 14.파일처리  (0) 2020.12.30
[Python] 13.외부 클래스 사용하기  (0) 2020.12.30
[Python] 11.함수(Function)  (0) 2020.12.30
[Pytho] 10.set  (0) 2020.12.30
[Python] 09.사전(Dictionary)  (0) 2020.12.30

Designed by JB FACTORY