[python] 객체지향 프로그래밍

Song A·2024년 6월 13일

객체지향 프로그래밍

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

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

객체는 클래스에서 생성된다

객체 사용의 장점

코드 재사용, 모듈화에 좋음
'부품'과 프로그램의 결합도가 낮을수록 가장 이상적인 프로그램이 될 수 있음. -> 확장성이 높다.
상황에 맞춰 '부품'을 변경할 수 있어 재사용에 유용함.

클래스란?

객체를 만들기 위한 속성과 기능을 설정
'객체 생성자 호출'을 통해 클래스는 하나여도 여러 객체 생성 가능
(클래스는 '부품 틀', 객체는 '부품')

class 키워드, 속성(변수), 기능(함수)

# 클래스 선언, 클래스 첫 글자는 '대문자'사용하는 것이 관례
class Car:

    # 생성자, 속성(__init__메서드)
    def __init__(self, color, length):
        self.color = color # 초기화, self.color-속성, color-매게변수
        self.length = length

    # 기능
    def doStop(self): # 클래스 안의 기능은 'self'라는 것을 매개변수로 받아야 한다. -> self가 있다!: 클래스 안에 포함된 기능이다.
        print("stop")
        
    def doStart(self):
        print("start")

    def printCarInfo(self):
        print(self.color)
        print(self.length)


# Car()-클래스 이름과 동일 : 눈에 보이지 않는 Car() 클래스의 생성자, 생성자가 자동으로 __init__메서드를 호출해준다.
car1 = Car('red', 200) # 객체 초기화, 속성 초기화
car2 = Car('blue', 200)

car1.printCarInfo()
car2.printCarInfo()

객체는 클래스의 생성자를 호출한다.
생성자는 클래스 안에 숨어있다. car()

객체 속성 변경

PCinfo = NewPC('myPC', 'i5','16','256')
PCinfo.cpu = 'i9'
PCinfo.printPcInfo()

# myPC i9 16 256

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

레퍼런스 변수 = 객체의 메모리 주소
객체가 생성되면
메모리에 객체 저장
객체의 레퍼런스 변수엔 객체의 메모리 주소가 저장된다.

rb1 = Robot('red', 80)
rb3 = rb1 # rb1의 주소가 복사됨, 얕은 복사
print(rb1)
print(rb3)
결과 =================
<__main__.Robot object at 0x0000024FFB747FD0>
<__main__.Robot object at 0x0000024FFB747FD0>

얕은 복사 vs 깊은 복사

얕은 복사

객체 주소를 복사하는 것으로 객체 자체가 복사되지 않는다.
한쪽 속성 변경시 다른쪽도 영향 받음.

깊은 복사

객체 자체를 복사하는 것으로 또 하나의 객체가 만들어진다.
메모리 주소가 달라진다.

rb1 = Robot('red', 80)
rb1.printInfo()
rb2 = rb1 # 얕은 복사 : rb1의 주소가 복사됨
rb2.printInfo()

import copy # 깊은 복사
rb3 = copy.copy(rb1)

print("rb1", rb1)
print("rb2", rb2)
print("rb3", rb3)

============== 결과 =================
rb1 <__main__.Robot object at 0x0000020C17B07FD0>
rb2 <__main__.Robot object at 0x0000020C17B07FD0>
rb3 <__main__.Robot object at 0x0000020C17B06B30>

리스트 깊은 복사

scores = [5,4,5,7]
scoresCopy1 = scores
print("원본\t\t\t", id(scores))
print("scoresCopy1\t", id(scoresCopy1)) # id() 메모리 주소 id 확인

scoresCopy2 = []
for s in scores:
    scoresCopy2.append(s)
print("scoresCopy2\t", id(scoresCopy2))

scoresCopy3 = []
scoresCopy3.extend(scores)
print("scoresCopy3\t", id(scoresCopy3))

scoresCopy4 = scores.copy()
print("scoresCopy4\t", id(scoresCopy4))

scoresCopy5 = scores[:]
print("scoresCopy5\t", id(scoresCopy5))
결과 =================
원본			 2849060319808
scoresCopy1	 2849060319808
scoresCopy2	 2849060319552
scoresCopy3	 2849060654336
scoresCopy4	 2849060656832
scoresCopy5	 2849060656768

+a
변수.copy() # copy는 객체를 다른 메모리에 복사함, 메모리 주소 달라짐
for idx, i in enumerate(리스트): 리스트의 변수와 값을 같이 가져옴

profile
진행중

0개의 댓글