선미 파이썬 0402 16일차

hiblue
이동: 둘러보기, 검색
  1. 5. 변수와 매서드의 종류
  2. [부르는 명칭]
  3. 클래스 변수, 인스턴스 변수
  4. 클래스 매서드, 인스턴스 매서드
  5. 여태 우리가 사용해온 변수와 매서드는 인ㄴ스턴스변수, 인스턴스매서드였다.

   클래스 변수?
       1. 클래스 내부에 생성(engine)
       2. 클래스 매서드에서 생성 >>  cls.value=10 같은 경우라면 밸류는 인진처럼 클래스 변수가 된다.
       3. 클래스 밖에서도 생성이 된다. (Car.wheel을 외부에서 생성한것처럼)
   -인스턴스 변수
       1. 생성자에서 생성(self.asdf) : 이 때 생성자에서 생성시킨 변수는 모든 인스턴스가 공통적으로 가지게 된다. 생성자는 인스턴스 생성시 무조건 호출되니까
       2. 인스턴스 매서드에서 생성(self.~~) : 이 매서드를 호출한 인스턴스에게만 속성이 추가된다.
       3. 클래스 외부에서 생성(car1.sun_roof) : 해당 인스턴스에만 속성이 추가된다
   ###클래스 변수는 한 번 만들어지면 클래스명이나 인스턴스명으로 사용 가능하다. 이 변수는 클래스에 유일한 하나의 변수
   ###인스턴스 변수는 인스턴스별로 독립적이다. >>생성자에서 만들어서 공통적으로 속성이 존재할 수는 있겠지만 값은 인스턴스별로 다르다.
   엔진은 클래스변수이므로 어디서 호출해도 1000cc라는 같은 값을 같지만 asdf는 생성자이므로 인스턴스마다 값이 다르게 호출될 수 있다. 썬루프는 외부에서 카1에게만 독립적으로 부여한 변수이므로 카2에서는 호출할 수 없다.
   

class Car :

   engine = "1000cc" # 클래스 내부에 변수를 '선언' >>클래스 변수
                     # 함수(매서드)내부에 이런 식으로 만들면 그 변수는 지역변수가 된다.
   def __init__(self) :
       self.asdf = "asdf"
   @classmethod #장식자(데코레이터) : 이 코드가 있어야 클래스매소드가 된다.
   def cls_method() : #여태 우리가 만들었던 매서드
       print("클래스 매서드입니다.")
       cls.value=10 # 이 떄 cls는 클래스 자체가 대입된다. >>>cls가 car를 다 받으므로 클래스에서 만든 변수와 같다.
       value2=20 # 지역변수! 여기서만 쓰고 사라진다.
   def inst_method(self) : #tpfvmdp dlstmxjstmrk eodlqehlsms dlstmxjstm aotjem
       print("인스턴스입니다.")

print("클래스매소드의 사용") print(car.engine) #클래스 이름, 변수명

  1. 클래스 변수는 인스턴스 생성과 상관없이 클래스 이름으로 사용 가능하다.
  2. 클래스가 정의되면서 생겨나는 변수

car1=car()

  1. 인스턴스 생성

print(car1.engine) #인스턴스를 통한 클래스 변수 사용(>가능) 가능하지만 가급적이면 클래스변수는 클래스이름으로 사용한다(햇갈리니까0

Car.cls_method() #클래스 이름 사용, 클래스이름.매서드명 car1.cls_method() # 인스턴스로도 사용 가능하지만 위와 같은 논리로 사용을 자제

  1. Car.inst_method() # 오류! 클래스 이름으로 인스턴스 매서드 사용불가(셀프에 대입될 인스턴스가 없다.)

car1.inst_method() car1.sun_roof() = "선루프 옵션 추가함" # 이미 생성된 인스턴스에 새로운 속성 추가, 자바, C++에서는 안되는것 print(car.sun_foof)

  1. print(Car.sun_roof) # 오류! 클래스명, 인스턴스변수==>말이 안 되는 코드
  2. car1.value ??

car2=Car() print(car2.sun_roof) # errer ! 선루프 속성은 카1에만 추가되어있음

  1. 클래스명으로는 클래스ㅁ변수와 클래스매서드만 사용가능하다.
  2. 인스턴스명으로는 모두 사용은 가능하지만 가급적이면 클래스변수와 클래스매서드는 인스턴스명으로 사용하지 않는다.
  1. 6. 외부접근제어
  1. 외부조건제어란 클래스 외부에서 변수나 매서드를 사용/사용불가 하게 만드는 방법
  1. public : 접근제어 x 허용. 기본적으로 우리가 사용하던 방식과 같다.
  2. private : 클래스 외부에서 접근이 불가능하도록 만든다.
  3. 이름 앞에 __를 붙이면 된다.

class person :

   name = "dlahdfyd" # 클래스 변수, 퍼블릭
   __addr = "서울시 강남구" #클래스변수 프라이빗
   __age = 0 #프라이빗으로 만들어놓고 잘못된 값의 처리를 따로 하겠다! 프리이빗이면 외부 접근이 불가능하기 때무에 매서드를 통해 값을 대입하므로?
   def set_age(self, age) : #나이를 전달받아 __age에 대입하는 것
       if age < 1 :
           age = 1 #1보다 적은 나이를 전달받으면 일단 1로 변경
       age = __age
   #이러한 일(프라이빗에 값을 지정하는 매서드)는 세터(setter)라고 부른다. 관용적으로 set_으로 사용
   def get_age :
       return self.__age
   #프라이빗 함수의 값을 외부에서 모르니까 프라이빗 변수를 반환하는 역할을 한다.
   #>>>>getter라고 부른다.
   #setter와 getter는 거의 쌍으로 사용
   
   def print_info(selt) : #인스턴스 매서드
       print("{}님은 {}에 거주합니다.".format(self.name, self.__addr))
       #프라이빗 변수도 클래스 내부(매서드나 뭐 그런 데)에서는 사용 가능하다.
   def __print_info(self) :
      print("{}님은 {}에 거주합니다.".format(self.name, self.__addr))
   def print_all(self) :
       self.print_info() : #인스턴스 매서드이기 때문에 인스턴스를 통해 사용
       self.__print_info()
       ##놓쳤당...

print(person.name)

  1. print(person.__addr) # 프라이빗이기 때무에 접근불가 >사용불가, 숨겨져있음

p=person() #인스턴스 생성 p.print_info

  1. p.__print_info : #오류! 프라이빗 매서드라서
  2. 외부에서 호출이 안 되는 매서드 사용법 : 접근 가능한 애서드를 통해 사용한다.(>>>print_all 참고)
  1. 프라이빗을 사용하는 이유
  2. 클래스 외부에서 클래스의 값을 잘못 다루는 것을 방지하기 위해 >>>>객체지향에서는 매우 중요한 개념
  3. 예를 들어 나이라는 변수가 있을 때 이 변수가 퍼블릭이면(외부에서 접근 가능하면) -1이나 0처럼 있을 수 없는 값을 외부에서 마음대로 대입할 수 있다. >>클래스를 만든 사람이 잘못된 값의 대입을 방지하는 것

p.set_age(-10) print("-10을 전달했을 때 나이 :", p.get_age())

  1. >> 이렇게 제어가 가능하기 때문에 객체지향 언어가 신뢰성이 높다. 접근권한을 막아놓고 잘못된 것을 개발자(클래스 만든 사람)가 처리할 수 있기 때문에
  2. 자바나 씨쁠쁠에서는 변수명 맨 앞에 프라이빗 이런식으로 명시를 한다. 파이써은 이름 앞에 __
  1. 7. 상속(inheitance)

   -기본적으로 뭔가를 물려받는 개념이다. 클래스에서의 상속이란 기존에 만들어놓은 클래스의 모든 기능을 그대로 물려받는 새로운 클래스를 정의하는 것
       기반 클래스 : 기존에 마들어진 클래스=부모클래스, 슈퍼클래스
       파생클래스 : 새로 만들어진 클래스=자식클래스, 서브클래스
   -자식 클래스에서는 부모클래스의 변수나 매서드를 사용할 수 있다.

class person :

   def __init__(self, name, age) :
       self.name=name
       self.age=age
       #매개변수로 전달받은 값을 이용하여 인스턴스변수 생성>>모든 인스턴스 공통
   def print_info(self) :
       print("person클래스의 print info")
       print("이름 : ",self.name)
       print("나이 : ",self.age)
   def sleep(self) : #사람은 잠을 잔다는 것을 기능으로 표현
        print("person클래스의 sleep")
        print("{}님은 {}시간 잡니다.".format(self.name, 8))
       

hong=person("홍길동", 20) hong.print_info() hong.age()

  1. person클래스를 상속받는 자식클래스를 만들자

class student(person) :

   aaa=1 #대충만든 변수. 그냥 클래스를 만드는 형태
   def study(self) :#학생은 공부를 합니다.
        print("student클래스의 study")
        print("{}님은 {}시간 공부를 합니다.".format(self.name, 8))
   def sleep(self) : #펄슨의 슬립을 바꿈
        print("person클래스의 sleep을 스튜던트의 슬립으로")
        print("{}님은 {}시간 잡니다.".format(self.name, 6))


  1. 서브클래스를 만드는 규칙 :서브클래스명(상속받을 클래스명)

lee=student("이몽룡", 17) #펄슨을 상속받은 자식클래스로 인스턴스 생성 lee.print_info() lee.sleep()

  1. 상속받은 클래스의 인스턴스를 사용할 수 있다.
  2. 자식클래스에는 코어클래스에 없는 다른 인스턴스를 생성할 수 있음(합집합의 형태)
  3. 슈퍼클래스가 고쳐지면 서브클래스는 영향을 받지만 서브가 수정되더라도 슈퍼는 영향이 없다. (sql의 뷰와 유사한)
  4. 부모클래스라는 표현은 상속받은 자식클래스에만 의미가 있다. 스튜가 펄슨을 상속받건말건 펄슨은 그대로(영향력x) >>>>펄슨에서는 스터디 사용x

lee.study()

  1. 동일한 매서드를 추가할때

lee.sleep # 추가 전에는 8시간이었는데 스튜던트 클래스에 슬립을 만든 후에는 수면시간이 변한다.

  1. 오버라이딩(매서드 재정의)
  2. 부모클래스에서 이미 정의된 매서드를 섭클에서 다시 재정의 >>> 섭클로 만들어진 인스턴스로 오버라이딩된 매서드를 호출하면 부모클래스의 매서드는 무시되고 섭클에 재정이된 매서드가 호출된다.
        1. 오버라이딩 했을 때 매서드를 호출하는 주체인 인스턴스가 어떤 클래스로 만들어져있는지가 중요! 슬립은 펄슨, 스튜던트에도 있다. 홍>>펄슨의 슬립, lee는 스튜던트의 슬립이 호출된다.
  1. 오버라이딩은 기존에 만들어진 부모클래스의 매서드를 보충하고 싶을 때 사용한다.