210716 FUNDAMENTAL 13. 객체와 클래스

시에나 Sienna·2021년 7월 16일
0

AIFFEL

목록 보기
11/66
post-custom-banner

1. 객체 & 객체 지향 프로그래밍

1) 객체

  1. 파이썬의 모든 것(부울, 정수, list, set, 함수, 프로그램, 모듈 등)이 객체
  2. 객체 : object가 변수 할당 가능하고, 함수의 인자로 받을 수 있는 것
    • 속성(attribute) : 상태(state) ⇨ 변수 구현
    • 메소드(method) : 동작(behavior) ⇨ 함수 구현
  3. 변수 : 진짜 객체를 변수명으로 가리켜 참조할 수 있게 하는 것
  4. 얕은 복사, 깊은 복사
    • 얕은 복사(copy.copy()) : 원본데이터는 그대로 두고, 참조하는 데이터의 ID만 복사
    • 깊은 복사(copy.deepcopy()) : 내부에 객체들까지 모두 새롭게 copy 되는 것

2) 객체 지향 프로그래밍(OOP : Object Oriented Programming)

2. 클래스 선언 & 인스턴스화

  • class : 클래스 선원
  • Car : 클래스 자체 & 객체
  • Car() : 새로운 Car 타입의 객체 생성 => 인스턴스화
  • mycar 변수에 Car 클래스의 인스턴스를 할당 = "클래스를 호출(call) 했다"
  • 인스턴스가 생성될 때마다 객체를 할당받은 변수들에게 다른 id가 부여됨
  • 표기법
    • 클래스명 표기법:
      • 카멜 케이스(각 단어의 앞 글자를 대문자로)
      • 명사로 명명
      • ex) mycar —> MyCar
    • 함수명 표기법:
      • 스네이크 케이스(단어는 소문자로 & 각 단어의 연결은 언더바(_)를 사용)
      • 동사로 명명
      • ex) mycar —> my_car

3. 클래스 속성 & 메소드

  • 클래스의 속성: 상태(state) 표현, 변수로 나타냄
	color = 'red'
  • color에 'red'를 할당함
  • 클래스의 속성 접근(호출) : 인스턴스 객체 + . + 속성명

  • 클래스의 메소드: 동작(behavior)을 표현, def 키워드로 나타냄
	def driving(self):
	    pass
  • 클래스의 메서드는 첫 번째 인자는 self 값을 적어 주어함
  • 메소드 호출 : 인스턴스 객체 + . + 메소드명 + ()

    <코드구현 도식화>

  • self 인자
    • 자기 자신
    • 클래스를 인스턴스(객체생성)화 한 인스턴스 객체를 가리킴
    • 메소드를 호출할 때, self 인자를 전달하지 않음
    • But, self의 값은 인터프리터가 제공
    • 인스턴스 변수를 속성으로 정의할 때, 접두사 self.을 붙여줌

4. 생성자(init)

🔔 '__' 언더바가 두 개씩 있는 메소드 ⇨ 매직 메소드

  • 인스턴스 객체의 속성값 초기화
  • "던더(Double Under) 이닛" 이라 발음함
  • __init__ 역시 def 키워드로 정의
  • 클래스 안의 메소드이므로 self 문법 중요!
  • 생성자에도 키워드 인자 설정 가능
class Car2:
    def __init__(self, color='red', category='sprots car'): # 키워드 인자 지정
        self.color = color
        self.category = category

5. 클래스 변수 & 인스턴스 변수

  • 클래스 내 변수 선언 방법
  1. 변수명 = 값
  2. __init__ 메소드 내에 self.과 함께 설정

  • 클래스 변수

    • 클래스에서 바로 선언된 속성
    • 모든 객체에서 같은 값을 조회 ⇨ 속성 공유
      ex) Manufacture : 클래스 변수
      car1 & car2 : Manufacture 속성을 공유
  • 인스턴스 변수

    • self를 사용해 선언된 변수.
    • 객체가 인스턴스화 될 때마다 새로운 값 할당. but 객체간 공유 ❌
      ex) color & category : 인스턴스 변수,
      car1 & car2 : color & category 속성을 공유❌

∴ 객체 단위로 변경되는 변수는 인스턴스 변수로 선언😀

6. 상속

  • 객체들 간의 관계를 구축하는 방법
  • 기존에 있는 코드를 재사용(상속) 하기 위한 기능

    • NewCar에는 아무런 기능도 코딩하지 않았는데 Car의 기능을 그대로 사용 ⇨ 속성
    • Car 클래스와 비슷한 기능과 속성을 유지 & maker 속성만 추가한 클래스 생성 ⇨ Car 클래스를 상속받은 뒤 maker 속성만 추가
  • 부모 클래스 : 기존 클래스 (= super class, base class)
  • 자식 클래스 : 상속받은 클래스 (= sub class, derived class 파생된 클래스)
  • 상속 방법
    • add : 부모 클래스에 없는 메소드 추가 정의
    • override : 상속받은 클래스에 있는 메소드 재정의(변경)
    • super() : 부모 메소드 호출
class NewCar(Car):
    def fly(self):				# 새로운 메소드 추가(add)
        print("I'm flying!! This is the new car!!")

    def drive(self): 				# 메소드 오버라이드(override 재정의)
        print("I'm driving and can fly")

7. 객체 지향 프로그램을 하는 이유

이유설명
추상화
(abstraction)
복잡한 자료, 모듈, 시스템 등으로 부터 핵심적인 개념 또는 기능을 간추려 내는 것
캡슐화
(encapsulation)
객체의 속성과 메소드를 하나로 묶어 실제 구현 내용 일부를 외부에 감추어 은닉함

8. N면체 주사위 만들기

1) 기획

  • 주사회의 면의 개수 n을 입력
  • 주사위를 던지면 1~n 눈의 수 중에서 랜덤으로 값 출력

2) 주 프로그램_main 함수

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

3) FunnyDice클래스

class FunnyDice:
    def __init__(self, n=6):	# 생성자__init__ 구현
        self.n = int(n)
        self.numbers = list(range(1, n+1))	# 주사위 눈 범위
        self.index = randrange(0, self.n)	# number의 index=> random 추출되도록함
        self.val = self.numbers[self.index]	# 추출된 랜덤 주사위 눈

    def throw(self):	# 주사위 눈이 나오는 메소드
        self.index = randrange(0, self.n)
        self.val = self.numbers[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)

4) FunnyDice 클래스 테스트 & get_input함수

  • FunnyDice 클래스 Test

  • get_input함수

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

5) 완성


오늘은 오랜만에 당일 정리 완료😁
하지만 상속의 super()부분 이해가 더 필요해서 공부를 해야겠다

그리고 오늘 ratsgo님의 "개발자를 위한 글쓰기" 세미나에서

  1. 주제 쪼개기
  2. 구성이 어려운 것 ⇨ 이해가 아직 안된 것
  3. 많이 이해하려고 하고 일단 써보고 다시 보면서 고쳐보자!

이 이야기가 인상이 깊었다! 다시 되새겨서 "글쓰기가 어렵다" 할 때 한 번씩 위 3개를 봐자❕❗❕❗

post-custom-banner

0개의 댓글