파이썬 클래스

JHKim·2023년 10월 16일
0

Python_study_note

목록 보기
4/7

단상

클래스로 들어가면서 개념이 조금씩 이해 안 가는 것들이 생겼다. 이전엔 내가 먼저 풀어보고 해설을 보는 게 가능했었는데 지금은 그게 좀 힘들다. 그래서 시간도 너~무 많이 걸리고 스트레스를 많이 받았는데, 일단 마음을 좀 가볍게 가지기로 했다. 수영할 때 그랬던 것처럼, 연습해야 늘지 않겠어? 강의 한 번 듣고 내 걸로 만들면 난 지금쯤 알파벳이나 MS에 있겠지.


객체지향 프로그래밍

  • 객체object = 속성attribute + 기능function으로 구분
    - 예) 가상의 계산기를 프로그래밍 = 속성: 숫자, 연산자 정보 + 기능: 연산 기능
  • 객체는 어떻게 만드나? => class를 만들면 된다(객체는 클래스에서 생성됨)
  • 클래스 1개 만들어두면 여러 개의 객체를 생성할 수 있다.
  • 클래스는 객체를 만들기 위한 툴.
    - 툴을 만든 이후 생성자를 호출해서 객체 생성
    • 붕어빵틀에서 붕어빵 찍어내는 것과 같다.

객체 사용의 장점

  • 코드 재사용, 모듈화에 좋다.
  • 아래 그림에서, 배터리 = 모듈
  • 상황에 맞춰 골라 쓸 수 있도록, 프로그램은 객체와 객체 간의 결합도가 낮은 것이 좋다.

클래스와 객체 Class & Objects

클래스 만들기

  • 클래스 = class 키워드 + 속성(변수) + 기능(함수)
  • 클래스를 만들 때, 첫 글자 대문자 사용

객체 생성하기

  • 변수에 클래스를 할당하여 객체를 생성한다.
    calculator1 = Calculator()
  • 참고) 리스트도 객체!
class Car:   # 객체를 만들기 위해 클래스를 만듦

    # Car() <- 이라는 생성자가 숨어있는 것 호출하면 자동으로 __init__함수를 호출

    def __init__(self, col, len):
        self.color = col  # self는 Car를 말함
        self.length = len

	# 얘는 기능. 함수와 같음. 클래스 안에 있을 때는 매개변수로 self를 받아야 함
    def doStop(self):  
        print('stop!')
	
    # 여기까지 선언했다고 결과가 출력되진 않음. 클래스를 만든 것 뿐
    def doStart(self):
        print('start!')   

    def printCarInfo(self):
        print('색: {}'.format(self.color))
        print('길이: {}'.format(self.length))

# 서로 관계 없는 객체 2개를 메모리에 생성
# 유저가 넣은 속성값으로 초기화됨, 객체가 가진 기능도 사용 가능
# car1을 레퍼런스 변수라고 함
car1 = Car('red', 300)
car2 = Car('black', 350)

# 레퍼런스 변수를 통해, 클래스 기능에 접근 가능
car1.printCarInfo()
car2.printCarInfo()

car1.doStop()
car1. doStart()
<result>: red
길이: 300: black
길이: 350
stop!
start!

객체의 속성

  • 클래스 생성 시, __ init __함수 안에 매개변수 안 넣어도 됨
    - 사용되는 속성 변수를 생성만 해 둔 다음,
    - 객체 생성 후 선언해 둔 속성에 접근해서 값을 할당할 수 있다.
  • 객체의 속성은 변경할 수 있다.
calculator = Calculator()   # Calculator 클래스로 객체 생성
calculator.number1 = 10     # 속성값 변경
calculator.number2 = 20

print(f'calculator.add(): {calculator.add()}')
print(f'calculator.sub(): {calculator.sub()}')
print(f'calculator.mul(): {calculator.mul()}')
print(f'calculator.div(): {calculator.div()}')
<result>
calculator.add(): 30
calculator.sub(): -10
calculator.mul(): 200
calculator.div(): 0.5

객체와 메모리

  • 변수는 객체의 메모리 주소를 저장하고, 이를 이용해서 객체를 참조한다.
  • 객체를 생성하면 메모리에 객체가 생성되고, 해당 객체의 메모리 주소가 생김
  • 변수는 메모리의 다른 위치에 저장되고, 객체가 가진 메모리 주소를 저장한 다음 이를 이용해 객체를 참조함
    - 변수에 직접 저장되는 것이 아님
  • 그래서 아래의 robot1, 2, 3을 레퍼런스 변수라고 부름
robot1 = Robot('red', 200, 80)   
robot2 = Robot('blue', 300, 120)
robot3 = robot1   
  • 이 경우 robot1과 robot2가 각각 메모리에 생성됨
  • robot3에 robot1을 할당했다는 것은 Robot('red', 200, 80)의 주소를 robot1과 robot3이 바라보고 있다는 것 = 하나의 객체를 공유
  • robot1의 속성값을 변경하면, robot3 값도 함께 변경되어 출력됨

scores = [int(input('국어 점수 입력: ')),
          int(input('영어 점수 입력: ')),
          int(input('수학 점수 입력: ')) ]
copyScores = scores.copy()

for idx, score in enumerate(copyScores):   
    score = int(score * 1.1)   # 스코어에 10% 가산 
   # 가산된 값을 copyScore 리스트에 대체해서 넣어주기 위해 copyScore[idx] 사용
   # 100점이 최대치이므로 if ~ else 사용
    copyScores[idx] = 100 if score > 100 else score

print('평균: {}'.format(round(sum(scores) / len(scores),2)))

print(f'10% 가산 후 점수: {copyScores}')
print('10% 가산 후 평균: {}'.format(round(sum(copyScores) / len(copyScores),2)))
<result>
국어 점수 입력: 77
영어 점수 입력: 82
수학 점수 입력: 91
평균: 83.33
10% 가산 후 점수: [84, 90, 100]
10% 가산 후 평균: 91.33

객체의 얕은 복사와 깊은 복사

  • 얕은 복사: 객체 주소를 복사하는 것으로 객체 자체가 새로 생성되는 것이 아님
    - 2개 변수가 동일한 객체 주소를 가짐
  • 깊은 복사: 객체 자체를 복사하여 새로운 객체를 생성하는 것
    - 2개 변수가 각각의 객체 주소 가짐
# 리스트 복사해보자
scores = [1, 4, 7, 9, 15]
scoresCopy = []

# 얕은 복사하기
scoresCopy = scores
print(id(scores))
print(id(scoresCopy))   //id() 객체 주소 출력 함수

# for문으로 깊은 복사하기
for s in scores:
    scoresCopy.append(s)

print(scoresCopy)
print(id(scores))   
print(id(scoresCopy))  

# extend로 깊은 복사하기
scoresCopy.extend(scores)
print(scoresCopy)
print(id(scores))  
print(id(scoresCopy))  

# 리스트 자체의 copy함수로 깊은 복사하기
scoresCopy = scores.copy()
print(scoresCopy)
print(id(scores))   
print(id(scoresCopy))   

# 리스트를 슬라이싱[:]해서 깊은 복사하기
scoresCopy = scores[:]
print(scoresCopy)
print(id(scores))   
print(id(scoresCopy))   
<result>
//얕은 복사 결과
1878895517376
1878895517376
//깊은 복사들 결과
[1, 4, 7, 9, 15]
1841062239936
1841063940544

0개의 댓글