[제로베이스] [파이썬] 객체지향 프로그래밍

한결·2023년 12월 13일
0
post-thumbnail

1. 객체

객체를 이용한 프로그램으로 객체는 속성기능으로 구성된다.

객체 (Object) = 속성 (Attribute) + 기능 (Function)

✅ 객체 사용은 코드 재사용, 모듈화에 좋다.


2. 클래스와 객체 생성

✅ 클래스 만들기

class Car: # 클래스 선언
	
    def __init__(self,color,length): # 생성자, 속성
    	self.color = col
        self.length = len
    
    def doStop(self): # 멈추는 기능
    	print('STOP!!')
    
    def doStart(self): # 출발하는 기능
    	print('START!!')
        
    def printCarInfo(self): #차량의 정보를 나타내는 함수
    	print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')
        
car1 = Car('red', 200) #car1 는 색상은 빨강 길이는 200
car2 = Car('blue', 300) #car2 는 색상은 파랑 길이는 300

car1.printCarInfo()
car2.printCarInfo()
self.color: red
self.length: 200
self.color: blue
self.length: 300

3. 객체 속성 변경

class Car:

    def __init__(self, color, length):
        self.color = color
        self.length = length

    def printCarInfo(self):
        print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')


car1 = Car('red', 200)

car1.printCarInfo()

car1.color = 'green' #car1의 색깔을 'green'으로 바꿈
car1.length = '400' #car1의 길이를 '400'으로 바꿈

car1.printCarInfo()
self.color: red
self.length: 200  #car1	 바꾸기전
self.color: green
self.length: 400  #car2  바꾼후

✅ 변수는 객체의 메모리 주소를 저장하고 이를 이용해 객체를 참조한다.


4. 얕은 복사와 깊은 복사

얕은 복사
얕은 복사란, 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않는다.

깊은 복사
깊은 복사란, 객체 자체를 복사하는 것으로 또 하나의 객체가 만들어진다.


  • 얕은 복사
class Car:

    def __init__(self, color, length):
        self.color = color
        self.length = length

    def printCarInfo(self):
        print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')


car1 = Car('red', 200)

car1.printCarInfo()

car2 = car1 # 얕은 복사

car2.printCarInfo()

car2.color = 'green' #car2의 색깔을 'green'으로 바꿈
car2.length = '400' #car2의 길이를 '400'으로 바꿈

car1.printCarInfo()
car2.printCarInfo()
self.color: red
self.length: 200
self.color: red
self.length: 200
self.color: green
self.length: 400
self.color: green
self.length: 400

car2의 정보를 바꾸면 car1 또한 동일하게 정보가 바뀌는 것을 확인할 수 있다.


  • 깊은 복사
class Car:

    def __init__(self, color, length):
        self.color = color
        self.length = length

    def printCarInfo(self):
        print(f'self.color: {self.color}')
        print(f'self.length: {self.length}')


car1 = Car('red', 200)

car1.printCarInfo()

# 깊은 복사
import copy

car2 = copy.copy(car1)

car2.printCarInfo()

car2.color = 'green' #car2의 색깔을 'green'으로 바꿈
car2.length = '400' #car2의 길이를 '400'으로 바꿈

car1.printCarInfo()
car2.printCarInfo()
self.color: red
self.length: 200
self.color: red
self.length: 200
self.color: red
self.length: 200
self.color: green
self.length: 400

이번 결과에서는 car2가 새로운 객체를 만들었기 때문에 car1이 바뀌지 않는 것을 확인할 수 있다.


5. 클래스 상속

상속
클래스는 또 다른 클래스를 상속해 내 것처럼 사용할 수 있다.

class normalCar:

    def drive(self):
        print('[NormalCar] drive() called!!')

    def back(self):
        print('[NormalCar] back() called!!')

class turboCar(normalCar) : # 클래스 상속

    def turbo(self):
        print('[TurboCar] turbo() called!!')

myTurboCar = turboCar()

myTurboCar.turbo()
myTurboCar.drive()
myTurboCar.back()
[TurboCar] turbo() called!!
[NormalCar] drive() called!!
[NormalCar] back() called!!

6. 생성자

✅ 객체가 생성될 때 생성자를 호출하면 __init__()가 자동 호출된다.

class Calculator :
	def __init__(self):
    	print('[Calculator] __init__() called!!')
>
cal = Calculator() # 생성자 호출
[Calculator] __init__() called!!

__init__()가 속성을 초기화 한다.

class Calculator :

    def __init__(self, n1, n2):
        print('[Calculator] __init__() called!!')
        self.num1 = n1
        self.num2 = n2

cal = Calculator(10, 20)
print(f'cal.num1: {cal.num1}')
print(f'cal.num2: {cal.num2}')

실습
중간고사 클래스와 기말고사 클래스를 상속관계로 만들고 각각의 점수를 초기화하자. 또한 총점 및 평균을 반환하는 기능도 만들어보자.

class midExam: #중간고사 클래스

    def __init__(self, s1, s2, s3):

        print('[MidExam __init__()')

        self.mid_kor_score = s1
        self.mid_eng_score = s2
        self.mid_mat_score = s3

    def printScore(self):

        print(f'mid_kor_score : {self.mid_kor_score}')
        print(f'mid_eng_score : {self.mid_eng_score}')
        print(f'mid_mat_score : {self.mid_mat_score}')

class endExam(midExam): #중간고사 클래스를 상속하는 기말고사 클래스

    def __init__(self, s1, s2, s3, s4, s5, s6):
        print('[EndExam] __init__()')

        super().__init__(s1, s2, s3)

        self.end_kor_score = s4
        self.end_eng_score = s5
        self.end_mat_score = s6

    def getTotalScore(self):

        total = self.mid_kor_score + self.mid_eng_score + self.mid_mat_score
        total += self.end_kor_score + self.end_eng_score + self.end_mat_score

        return total

    def getAverage(self):

        return self.getTotalScore() / 6

A1 = endExam(10,20,30,40,50,60)

print(endExam.printScore(A1)) # 각 점수 반환
print(endExam.getTotalScore(A1)) # 총점 반환
print(endExam.getAverage(A1)) # 평균 반환
[EndExam] __init__()
[MidExam __init__()
mid_kor_score : 10
mid_eng_score : 20
mid_mat_score : 30
None
210
35.0

7. 다중 상속

class car1:
    def drive(self):
        print('drive() method called')

class car2:
    def turbo(self):
        print('turbo() method called')

class car3:
    def curve(self):
        print('curve() method called')

class car(car1, car2, car3): # 다중 상속
    def __init__(self):
        pass

myCar = car()
myCar.drive()
myCar.turbo()
myCar.curve()
drive() method called
turbo() method called
curve() method called

8. 클래스 오버라이드

오버라이딩
하위 클래스에서 상위 클래스의 메서드를 재정의(override) 하는 행위

class robot: # 상위 클래스

    def __init__(self, c, h, w):
        self.color = c
        self.height = h
        self.weight = w

    def fire(self):
        print('총알 발사!!')

class newRobot(robot) : # 하위 클래스

    def __init__(self, c, h, w):
        super().__init__(c, h, w)

    def fire(self):
        print('레이저 발사!!') # 오버 라이드

robot1 = newRobot('red',100,200)

robot1.fire()
레이저 발사!!

9. 추상클래스

추상클래스
상위 클래스에서 하위 클래스에 메서드 구현을 강요한다.

from abc import ABCMeta
from abc import abstractmethod

class airPlane(metaclass=ABCMeta):
    
    @abstractmethod
    def flight(self):
        pass


class airliner(airPlane):
    
    def flight(self): # 메서드 구체화
        print('시속 400km/h 비행')

추상 클래스는 왜 사용하나요??
상위 클래스를 하위 클래스에서 입맛에 맞게 사용할 때 사용.

profile
낭만젊음사랑

0개의 댓글