선미 파이썬 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