Python 중급 03. 객체지향,객체,얇은 복사, 깊은 복사

yoong·2023년 4월 14일

1. Python

목록 보기
12/21

Python 중급 3.

01.객체지향 프로그램

1. 객체의 정의

  • 객체(object)는 속성(attribute) + 기능(function) 구성. 클래스에서 생성됨.
  • 객체지향 프로그램:
    - '코드를 정리하는 방법, 데이터에 대한 생각 구조방식',
    • java나 C#등이 객체제지향 프로그램 언어
    • python과 javascript의 경우 객체 지향 언어 방식을 지원하고 있음.
  • 객체 사용의 장점:
    - 코드 재사용, 모듈화에 좋음.

< 참고: 예시 >

  • 객체(object) : 플레이어, 각 플레이어는 각각의 다른 데이터를 가짐 (ex.홍길동,김지은,90,legend)
  • 속성(property) : 객체들이 가지고 있는 공통된 특징의 카테고리 (ex.이름,나이,기술)
  • 클래스(Class) : 객체를 위한 팩토리 같은 것. 같은 속성을 지니지만 데이터가 다른 경우 효율적으로 데이터를 관리하기 위함. 일종의 구조,설계도. 데이터만 넣으면 적용해 주는 함수들
  • 매서드(method) : 함수 중 클래스 내에 있는 함수 ex)init

클래스에서 새로운 객체를 만들때 매서드는 파이썬에 의해 자동 호출 매서드에서 클래스를 어떻게 구성할지 정할수있음 (어떤 속성을 가지게 될지 인수를 받을 수있음
속성 및 매서드를 지칭하는 방법: this self



02.객체생성

1. 클래스(class) 만들기

  • 클래스는 class키워드와 속성(변수) + 기능(함수)를 이용하여 만듦

  • 객체는 클래스의 생성자를 호출함. (생산자를 호출해서 객체를 생성)



03.객체속성 변경

  • 객체 속성은 변경 할 수 있음.
class NewGenerationPC:

    def __init__(self,name,cpu,memory,ssd):
        self.name = name
        self.cpu = cpu
        self.memory = memory
        self.ssd = ssd

    def doExcel(self):
        print('EXCEL RUN!! ')

    def doPhotoshop(self):
        print('PHOTOSHOP RUN')

    def printPCInfo(self):
        print(f'self.name: {self.name}')
        print(f'self.cpu: {self.cpu}')
        print(f'self.memory: {self.memory}')
        print(f'self.ssd: {self.ssd}')

myPC = NewGenerationPC('myPc','i5','16G','256G')
myPC.printPCInfo()

friendPC = NewGenerationPC('friendPC','i7','16G','256G')
friendPC.printPCInfo()

myPC.cpu = 'i9'
myPC.memory = '64G'
myPC.ssd = '1T'
myPC.printPCInfo()

04.객체와 메모리

  • 객체: 클래스로부터 생성자를 호출해서 생성되고 메모리에 저장됨.
  • 변수 : 생성된 객체를 사용하기 위해서 변수를 설정 이때, 객체가 변수 데이터 안에 들어가는 것은 아님 즉, 변수 데이터와 객체 데이터는 각각 메모리에 저장되고 변수에는 객체의 '메모리 주소'가 변수에 저장됨. reference 변수라고 함.

[실습예제]

#국어,영어,수학 점수를 입력받아 리스트 저장하고 원본을 유지한 상태로 복사본을 만들어 과목별 점수를 10% 올렸을 경우 
scores = [int(input('국어점수')),int(input('수학점수')),int(input('영어점수'))]

print(scores)

copyScores = scores.copy()

for idx,score in enumerate(copyScores):
    result = score * 1.1
    copyScores[idx] = 100 if result > 100 else result

print(f'이전평균: {sum(scores) /len(scores)}')
print(f'이후평균: {sum(copyScores) / len(copyScores)}')

05.얕은복사와 깊은복사

1. 얕은 복사

  • 하나의 객체를 공유하고 있기 때문에 a의 변수의 속성값을 수정할 시 b또한 같이 수정됨
class TemCls:

    def __init__(self,n,s):
        self.number = n
        self.str = s

    def printClsInfo(self):
        print(f'self.number: {self.number}')
        print(f'self.str: {self.str}')

#얕은 복사(객체 그대로 메모리 주소만 변경)
tc1 = TemCls(10,'hello')
tc2 = tc1

tc1.printClsInfo()
tc2.printClsInfo() #출력값 동일

tc2.number = 3.14
tc2.str = 'bye'

tc1.printClsInfo()
tc2.printClsInfo() #tc2만 변경해도 tc1도 자동으로 변경

2. 깊은 복사


#깊은 복사
import copy

tc1 = TemCls(10,'hello')
tc2 = copy.copy(tc1)

tc1.printClsInfo()
tc2.printClsInfo() #출력값 동일

tc2.number = 3.14
tc2.str = 'bye'

tc1.printClsInfo()
tc2.printClsInfo() #tc2만 변경(새로운객체가 만들어짐) 
# 깊은 복사하는 여러 방법 
import copy

scores = [10,6,7,5,4]
scoresCopy = []

#방법1
for s in scores :
    scoresCopy.append(s)
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

#방법2
scoresCopy.extend(scores)
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

#방법3
scoresCopy = scores.copy()
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

#방법4
scoresCopy = scores[:]
print(f'id(scores): {id(scores)}')
print(f'id(scoresCopy): {id(scoresCopy)}')

[실습]

# 선수의 원본 점수를 이용해서 평균을 출력하고 최고값 최저값을 제외한 평균을 출력하는 프로그램

playerSco = [8.7,9.1,8.9,9.0,7.9,9.5,8.8,8.3]
playerSco2 = playerSco.copy() #얕은 카피


playerSco.sort()

playerSco2.sort()
playerSco2.pop(0) #최솟값 지움
playerSco2.pop( ) #최댓값 지움

print(f'playerSco: {playerSco}')
print(f'playesSco2: {playerSco2}')

ScoTot = round(sum(playerSco),2)
ScoMod = round((ScoTot / len(playerSco)),2)
print(f'오리지널 점수합: {ScoTot}')
print(f'오리지널 평균: {ScoMod}')


Sco2Tot = round(sum(playerSco2),2)
Sco2Mod = round((Sco2Tot/len(playerSco2)),2)
print(f'오리지널 점수합: {Sco2Tot}')
print(f'오리지널 평균: {Sco2Mod}')

print(f'ScoMod - Sco2Mod: {ScoMod - Sco2Mod}')


Reference

  • 이글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었음.
profile
데이터와 이미지로 세상을 공부하는 중입니다 :)

0개의 댓글