FUNDAMENTAL | 13. 나만의 n면체 주사위 만들기(Class)

yeonk·2021년 10월 2일
0

aiffel-ai-bootcamp

목록 보기
26/38
post-thumbnail

20211001



1. 객체 지향 프로그래밍


객체 지향 프로그래밍(OOP: Object Oriented Programming)
객체(Object): 파이썬에서 다루는 모든 것 (문자열, 배열, 정수, 모듈 등)
id(): 객체의 고유값(identity, 메모리 주소)을 반환






copy()

  • 얕은 복사:
    • copy.copy()
    • 데이터의 id(메모리 주소)를 복사하고 참조
  • 깊은 복사:
    • copy.deepcopy()
    • 데이터 자체를 복사하는 것






추상화와 캡슐화

추상화(abstraction): 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.

캡슐화(encapsulation): 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶는다.
실제 구현 내용 일부를 외부에 감추어 은닉한다.
(-> 모듈, 패키지, 라이브러리)






2. 클래스


개발자가 객체를 설계하기 위한 것.
객체에는 속성, 메소드가 있다.

# 기본 형태
class 클래스명:
	코드
    
# 인스턴스화
인스턴스명 = 클래스()

인스턴스화: 클래스로 객체를 만드는 것






클래스와 함수 표기

  • 클래스: 카멜 케이스

    • 단어의 앞 글자를 대문자로 표기
  • 함수: 스네이크 케이스

    • 단어는 모두 소문자로 작성하되, 단어 간 연결은 언더바를 활용한다.






메서드

클래스에서 동작을 표현

  • def로 선언

  • 메서드의 첫 인자는 반드시 self

# 
def 함수명(self):
	코드
    
# 메서드 사용
인스턴스명.메서드명

# 속성값 접근
인스턴스.속성명






self

  • 객체(인스턴스) 자기 자신을 의미

  • 메서드는 해당 인스턴스(self)를 인자로 받아야 함

  • 인스턴스 변수 정의 시 self.를 붙여줌

  • 변수를 인스턴스의 속성으로 쓰고 싶다면 self.를 써주어야 함






생성자 (__init__)

__init__ 함수는 생성자(constructor)이며, 인스턴스 객체를 초기화(initializing instance) 한다.

  • __init__으로 인자를 전달하여 인스턴스 객체 속성 초기화

  • __init__ 메소드 내부에서 정의된 변수는 클래스를 인스턴스화 할 때 값 설정 가능

  • def로 정의






상속

기존 클래스와 비슷한 기능, 속성을 유지하고 새로운 속성을 추가해서 다른 클래스를 만들고 싶을 때 상속을 사용한다.
코드 재사용!



상속 받은 클래스: 자식, 서브, 파생 클래스
기존 클래스: 부모, 슈퍼, 베이스 클래스



메소드 오버라이드(재정의, override): 기존에 있는 메소드를 변경하는 것



메소드 추가 vs 메소드 오버라이드

메소드 추가: 파생 클래스에 없는 메소드를 정의 하는 것
메소드 오버라이드: 파생 클래스에서 있는 메소드를 다시 정의하는 것



super() 함수

# 기본 형태
def 부모 클래스의 메소드 이름():
	super().메소드 이름()

# super를 활용한 변수 초기화
class 자식클래스명(부모클래스명):
	def__init__(self, 부모클래스 속성, 속성):
    	self.부모클래스 속성 = 속성값
        self. 속성 = 속성값 #새롭게 추가한다면

super()를 통해 변수를 초기화하면 부모 클래스의 변경사항이 자식 클래스에도 반영된다.






3. n면체 주사위 만들기


# funnydice.py

from random import randrange

class FunnyDice:
    def __init__(self, n=6):
        self.n = n
        self.options = list(range(1, n+1))
        self.index = randrange(0, self.n)
        self.val = self.options[self.index]
    
    def throw(self):
        self.index = randrange(0, self.n)
        self.val = self.options[self.index]
    
    def getval(self):
        return self.val
    
    def setval(self, val):
        if val <= self.n:
            self.val = val
        else:
            msg = "주사위에 없는 숫자입니다. 주사위는 1 ~ {0}까지 있습니다. ".format(self.n)
            raise ValueError(msg)

def get_inputs():
    n = int(input("주사위 면의 개수를 입력하세요: "))
    return n

def main():
    n = get_inputs()
    mydice = FunnyDice(n)
    mydice.throw()
    print("행운의 숫자는? {0}".format(mydice.getval()))

if __name__ == '__main__':
    main()






추가 학습 자료


Everything is an Object

파이썬 공식 문서: id() 함수

파이썬 공식 문서: copy() 모듈

객체지향이란 무엇인가-절차지향과의 차이점

파이썬 문서-클래스

Magic Methods
Rafe Kettler

위키피디아-추상화(컴퓨터 과학)

위키피디아-캡슐화

0개의 댓글