선미 파이썬 0330 15일차

azuremei
이동: 둘러보기, 검색
#10_OOP

#1. 클래스를 왜 사용할까? (클래스 사용하지 않고 코드 만들기)
#자동차  두 대를 만들고 주행하는 함수를 만들어서 주행시킬 것임

#주행하는 함수 : 주행할 자동차의 모델, 최고속도 속도를 매개변수로 받음
'''
def dirve_car(model, max_speed, speed) :
    # 만약 주행할 자동차의 속도가 최고속도를 넘으면
    if speed > max_speed :
        print("{}의 최고속도는 {}km입니다. 속도를 줄입니다". format(model, max_speed))
        speed = max_speed # 최고속도 스피드를 조절
    print("{}는 {}km로 주행합니다.".format(model, speed))
cal1_model = "bmw"
cal1_max_speed = 200
car2_moeel = "tico"
car2_max_speed = 150
#위의 네 변수는 그저 변수명만 비슷하게 지었을 뿐 서로 아무 연관성이 없다. a, b, c, d로 했어도 상관 없다.

drive_car(car1_model, car1_max_speed, 180)
drive_car(car2_model, car2_max_speed, 180)
'''

#2. 클래스의 사용 (1)
class car : # 주행하는 기능이 있는 클래스로 설계
    pass # 클래스 사용하지 않음
'''
    def dirve_car(model, max_speed, speed) :
        # 만약 주행할 자동차의 속도가 최고속도를 넘으면
        if speed > max_speed :
            print("{}의 최고속도는 {}km입니다. 속도를 줄입니다". format(model, max_speed))
            speed = max_speed # 최고속도 스피드를 조절
        print("{}는 {}km로 주행합니다.".format(model, speed))


car1 + car() #car 코드를 통해 인스턴스 생성,
#car1인스턴스에 속성(변수) 추가
car1.model = "bmw"
car1.max_speed = 200
#다른 객체지향 언어에서 이런 행위는 안된다. 이미 설계된 클래스를 통해서 만들어진 인스턴스에 속성을 추가할 수 없다. >설계뙨 대로만 사용할수 있음. 그러나 파이썬에서는 설께도에 없는 인스턴스를 사요할 수 있다
car1.a=1
car1.b=2 # 이런 코드는 안 된다.

car2=car()
#코드를 여기까지만 보면 카원에는 모델, 맥스스피드 a b라는 네개의 속성이 있지만 카2에는 아무것도 없음>>>인스턴스별로 지닌 속성이 다를 수 있다(다른 언어와의 차잊덤)
#예를 들면 클래스로 이미 만들어진 자동차a에 썬루프를 사용하는 st
'''

#2. 클래스의 사용 (1) 인스턴스에 속성(변수) 추가하기(다른 언어와의 차이점)
'''
class car : # 주행하는 기능이 있는 클래스로 설계
    def dirve_car(self, model, max_speed, speed) :
        # 만약 주행할 자동차의 속도가 최고속도를 넘으면
        if speed > self.max_speed :
            print("{}의 최고속도는 {}km입니다. 속도를 줄입니다". format(model, max_speed))
            speed = self.max_speed # 최고속도 스피드를 조절
        print("{}는 {}km로 주행합니다.".format(model, speed))

car1=car()
car1.model = "bmw"
car1.max_speed = 200
#셀프 : 자기자신이 대입
#car1.drive_car(car1.model, car1.max_speed, 180)
#self, model을 사용하면 밖에서 생성한 카1.모델을 그대로 사용할 수 있다. 셀프는 카1이기 때문, 대신 속성을 생성하기 전에 사용하면 안된다.
#드라이브카가 호출되는 시점에는 셀프때문에 카원의 정보가 그대로 전달된다. 그러므로 위와 같이 모델, 맥스스피드를 굳이 쓸 필요 없어서

car1.drive_car(180)

#셀프를 쓰면 반드시 수행문 안에 셀프.를 붙여야함
car2=car()
car2.model = "tico"
car2.max_speed = 150
car2.drive_car(180)

car3=car()
# car3.drive_car( 200) # 이렇게 하면 오류! 맥스스피드와 모델 속성이 없는 상태라 오류
#이러한 오류가 발생하는 이유는 매서드(드라이브_카)에서 공통적으로~~~
'''

# 3. 클래스 사용 (2) 생성자
# 생성자 : 인스턴스 생성 시 '자동으로' 호출되는 매서드(함수) >>>자동으로 생성되기 때문에 무조건 호출
        #인스턴스 생성과 동시에 공통적으로 처리하고 싶은 코드를 작성


'''
class car :
    #생성자 생성
    def __init__(self) : #__를 무조건 앞뒤로 사용(init :약자;초기화;프로그래밍에서 많이 사용)
        print("저는 인스턴스 생성시 무조건 호출됩니다.")
    def dirve_car(self, model, max_speed, speed) :
       if speed > self.max_speed :
            print("{}의 최고속도는 {}km입니다. 속도를 줄입니다". format(model, max_speed))
            speed = self.max_speed # 최고속도 스피드를 조절
        print("{}는 {}km로 주행합니다.".format(self.model, speed))

car1= car()
#1 카()코드를 통해 인스턴스 '생성'(자동차 한 대)
#2. 이닛 생성자 함수(매서드)가 '호출'
#3. 카1=코드에 의해 인스턴스가 '대입'

#우리가 카()<<이렇게 인스턴스를 생섷아는 행위는 생성자 함수를 호출하는 것
#생성자는 우리가 직접 만들지 않으면 기본으로 def__init__평태로 생성
'''

#4. 클래스의 쇼ㅏ용 (3) 생성자를 통한 인스턴스의 변수 생성 및 초기갚 대입

class car :
    #생성자 생성
    def __init__(self, model, max_speed) : #__를 무조건 앞뒤로 사용(init :약자;초기화;프로그래밍에서 많이 사용)
        self.model = model
        self.max_speed = max_speed
        
        print("저는 인스턴스 생성시 무조건 호출됩니다.")
    def drive_car(self, speed) :
       if speed > self.max_speed :
            print("{}의 최고속도는 {}km입니다. 속도를 줄입니다". format(self.model, self.max_speed))
            speed = self.max_speed # 최고속도 스피드를 조절
       print("{}는 {}km로 주행합니다.".format(self.model, speed))

        #self.~ 는 인스턴스에 속성을 추가
        # =model 는 매개변수, 전달된 값을 대입
        #>>>인스턴스에 속성을 생성하면서 전달된 값을 대입하겠다.

#생성자는 함수이기 때문에 매개변수를 통해 값을 전달받을 수 있다. 이 때 전닯랃는 값은 인스턴스별로 다르게 전달하여 초기값을 다르게 대입할 수 있다.ㅣ
        #우리는 공통적으로 모델과 맥스스피드 속성을 사요할 예정 >>>생성자에서 생성
car1=car( "bmw", 200)
car2 = car("tico", 150)

car1.drive_car(180)
car2.drive_car(180)

#클래스를 쓰지 않으면 첫 번채처럼 단순한 변수(연결고리 없는)를 만들어서 하나하나 대입해야 하는데 클래스를 쓰면 하나의 인스턴스에 공통된 속성을 설게하고 이 속성을 함수에 통째로 전달되어 별개로 있던 것들이 하나가 됨

#클래스 연습
'''
    1. 학생 클래스 만들기(Student)
        속성(변수) : 이름name, 나이age, 전화번호phone, 과목sub
        기능(변수)
            1. 생성자
                이름, 나이, 전화번호, 과목을 전달받고 인스턴스에 속성 생성 및 대입
            2. 학생 정보 출력(print_info)
                이름 :홍길동
                나이 :20세
                전화번호 : 010-1234-5678
            3. 공부하기study
                홍길동 님이 파이썬 공부를 시작합니다.
            -3명의 학생 인스턴스를 만든 뒤 학생 정보를 출력하고 공부시키기
[예]
hong=student()라고 가정하고
hong.print_info()
hong.study() 이런 식으로
'''

class student :
    def __init__(self, name, age, phone, sub="파이썬~~!") :
        self.name = name
        self.age = age
        self.phone = phone
        self.sub = sub
    def print_info(self) :
        print("이름 : {} \n나이 : {} \n전화번호 : ".format(self.name, self.age, self.phone))
    def study(self) :
        print("{}님이 {}을 공부중입니다".format(self.name, self.sub))


hong= student("홍길동", 20, "01043322167")
hong.print_info()
hong.study()
'''
    2. 계산기 클래스 만들기(Calc)
      >계산기의 인스턴스를 생성한다는 것은 하나의 계산기를 샀다고 가정하는 것
      >인스턴스를 하나 더 생성한다는 것은, 또 다른 계산기를 샀다는 것

      - 속성 : 4개 >각 사친연산 계산의 수행 횟수를 기억하는 변수
              add_count, min_count, mul_count, dic_count
      - 기능 : 6개
            1. 생성자 :무엇을 해야할지 생각해보기
            2. 사칙연산 매서드들
            3. 계산 횟수 정보 출력(print_info)

        >계산기 인스턴스 생성 후 내 마음대로 연산을 수행시킴
        >프린트 인포를 호출했을 때 위에서 수행시킨 횟수와 일치한 결과를 출력해야함
        >인풋으로 숫자 입력받지 말고 add(1, 2) 이런식으로 그냥 만들자
        >수행 횟수가 재대로 나오는지 확인하는게 중요
~~.add(1, 2)  >>1 + 2 = 3 출력
~~.add(3, 4)
~~.mul(10, 3)
덧셈 : 2
뺄셈 : 0
곱셈 : 1
나눗셈 : 0 >>>이렇게 사식연산 횟수 출력
>호출했을 때 쇳수(덧셈 몇번했는지 같은 것들)출력이 중요
'''

class calc:
    def __init__(self, add_count, min_count, mul_count, div_count) :
        self.add_count = add()
        self.min_count = min()
        self.mul_count = mul()
        self.div_count = div()
    def add(a, b) :
        print("{} + {} = {}", format(a, b, a+b))
        return a+b
    def min(a, b) :
        print("{} - {} = {}", format(a, b, a-b))
        return a-b
    def mul(a, b) :
        print("{} * {} = {}", format(a, b, a*b))
        return a*b
    def div(a, b) :
        print("{} / {} = {}", format(a, b, a/b))
        return a/b
    def count (self) :
        print("덧셈 : ".format(sys.getrefcount(add)))

clac1 = clac