[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] 12.클래스(Class)  (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

댓글(0)

Designed by JB FACTORY