본문 바로가기
Programming/Python

[Python] class 개념 재정리 (pre course)

수업 내용이 이해가 전혀 안가서 플레이 데이터 프리코스 내용을 바탕으로 작성한 정리한 내용

 

 

 

객체(object);개념적 = 클래스내 메소드를 실체화 하는 것 = 인스턴스(instance); 특정 클래스와 연관지어 말할 때

 

메서드(method): 클래스 내 정의된 함수

 

self: 클래스 내 정의된 함수(method)의 첫 번째 파라미터(변수;인자). 파이썬이 알아서 넣어주는 값

        = 인스턴스 자기 자신

        클래스 내 모든 함수의 첫 번째 파라미터 = self

 

생성자 = (__init__): 클래스가 만들어질 때 최초에 단 한 번 호출되는 것. 

                                인스턴스가 실체화될 때 최초에 한 번 수행되는 함수. 클래스 생성자 정의를 위한 함수

모든 클래스 첫 함수 = 생성자 정의 함수 __init__  

 

클래스 속성(attribute) 

  def __init__(self):
     self.속성 = "안녕하세요."     # <- attribute에 "안녕하세요" 값 할당

 

 

클래스 속성 추가

def __init__(self, param1, param2):
    self.attr1 = param1           #   <- self에 attr1, attr2 (임의) 속성 추가 可.
    self.attr2 = param2           # param은 값 할당

 

 

 

기초예제)

class Person:                                                                            반드시 언더바 양쪽 2개여야만 작동 可

      def __init__(self):                  <- 생성자, 클래스 생성 시 최초 한 번 실행되는 파이선 특수 매소드

            self.hello = "안녕하세요."   <- 인스턴스 속성 hello로 추가하고(만들고), 그 값으로 "안녕하세요" 초기화

   

      def greeting(self):

           print(self.hello)


james = Person()   <- 클래스를 인스턴스화(함수 실체화, 객체화) 하는 부분. 여기서 생성자 호출

 

-> james가 가진 메소드(함수): greeting

 

james.greeting()   -> 안녕하세요.

 

 

작동원리: Person() -> 생성자의 self -> 인스턴트 속성 hello -> 부여된 "안녕하세요."

                 -> 이 전체가 james변수로 정의 -> greeting()이라는 메소드 호출

 

 

 

 

 

클래스 속성 추가(생성자에 파라미터 추가) 된 예제

class Person2:
       def __int__(self, name, age, address):
          self.hello = "안녕하세요."     # 좌변 = class field(=attribute)  필드
          self.name = name              # 우변 = __init__()의 parameters.
          self.age = age
          self.address  = address

     def greeting(self):
         print(f"{self.hello} 제 이름은 {self.name}입니다." )
         
         
# 여러 변수 있으면 변수지정시 self 외 모든 파라미터 꼭 넣어야 함!
maria = Person2("마리아", 20, "서울시 서초구 반포동")

maria.greeting()

 

안녕하세요. 제 이름은 마리아입니다.

 

print(f"이름: {maria.name}")

print(f"나이: {maria.age}")

print(f"주소:  {maria.address}")

이름: 마리아

나이: 20

주소: 서울시 서초구 반포동

 

 

 

비공개 속성: 쉽게 파라미터를 할당(인스턴스 속성 수정) 못하게 코드짜기

앞선 예제에서

  class Person2:
       def __int__(self, name, age, address):

             self.hello = "안녕하세요."                 <- 좌변 = class field(=attribute),     우변 = __init__()의 parameters.
             self.__name = name                        <- 던더(double under; dounder) 삽입

       -> 이 경우 class 내부에서 지정해야만 반영됨. 기존엔 밖에서 self.attr = 속성  그냥 입력해도 반영 可

 

 

 

ex) 예제

class Person3:
       def __int__(self, name, age, address, wallet):

             self.hello = "안녕하세요."                        <- 좌변 = class field(=attribute),     우변 = __init__()의 parameters.
             self.name = name

             self.age = age

             self.address  = address

             self.__wallet = wallet

 

     def greeting(self):

           print(f"{self.hello} 제 이름은 {self.name}입니다." )

 

hong = Person3("홍길동", 18, "서울시", 10000)

 

이떄 그냥 hong.__wallet  입력시, 오류 발생(비공개 속성)

 

 

ex) 비공개 속성은 class내에서만 사용 可

class Person3:
      def __int__(self, name, age, address, wallet):
          self.hello = "안녕하세요."   # 좌변 = 클래스 필드, 우변 = init의 파라미터
          self.name = name
          self.age = age
          self.address  = address
          self.__wallet = wallet

     def pay(self, amount):
         if amount > self.__wallet:
            return  print("돈이 부족합니다.")
         self.__wallet -= amount            
         print(f"이제 {self.__wallet}원 남았네요.")

     def greeting(self):
         print(f"{self.hello} 제 이름은 {self.name}입니다." )


hong = Person3("홍길동", 18, "서울시", 10000)
hong.pay(3000)

 

이제 7000원 남았네요.

 

 

 

Object oriented(객체지향) = 큰 문제를 잘게 나눠(객체로) 그 작은걸 조합해서 문제 해결하는 방식.

  -> 큰 프로젝트 유지보수 방법

 

객체 기능 = 매서드(method)

객체 데이터 = 클래스 속성(attribute)

클래스 = 사용자 정의 객체 설계도

 

 

Ex) 자동자와 그 데이터 변수 

 자동차: 바퀴 4개(속성) , 색상(속성), 가속페달시 차가 앞으로 가는 특성(메소드)

                                                            sunroof(특성)이 있다.

wheels =4

color = "white"

acc = lambda x: "차가 앞으로 갑니다." if x else "차가 멈춰있습니다."   <-이걸 일일이 수정하고 추가하기 번거로움

 

이런 구조를 한번에 수정하고 설계를 위한 것이 클래스

 

 

 

  (파이썬처럼 자동상속개념은 java에 없습니다.)

클래스 상속: 기존 클랙스(부모클래스) 확장 by 새 클래스(자식 클래스), 재사용(코드중복줄임) 방법 -> 유지보수 용

방법 Ex)  class 부모클래스:                 <- 정의 후

               class 자식클래스(부모클래스):  <- 이러면 상속됨 (자식 클래스는 모든 부모클래스 사용 可)

 

Ex)

class Character:               <- parent class

      def __init__(self, name, health):

            self.name = name

            self.health = health

 

      def attack(self):

           print(f"{self.name}이(가) 공격합니다!")

 

 

class Warrior(Character):             <- 자식 클래스 1

     def __init__(self, name, health, strength):                  <- strength 추가

         super().__init__(name. health)                               <-super()로 부모 클래스 init 호출

         self.strength = strength

 

    def attack(self):

         super().attack()

         print(f"{self.name}의 강력한 공격!")

 

class Mage(Character):             <- 자식 클래스 2

         def __init__(self, name, health, magic_power):         <- magic_power 추가

             super().__init__(name, health)

             self.magic_power = magic_power 

 

        def attack(self):

            super().attack()

            print(f"{self.name}의 마법 공격!")

 

=========================================== 클래스 설정 끝

player1 = Warrior("전사", 100, 10)

player2 = Mage("마법사", 80, 15)

 

player1.attack()         

전사이(가) 공격합니다!

전사의 강력한 공격!

 

player1.name  -> '전사'

player1.strength   -> 10

 

 

player2.attack()

마법사이(가) 공격합니다!

마법사의 마법 공격!

 

 

 

 

========================수업 문제풀이 중에서..

 

 

728x90
반응형