💻STUDY/PYTHON STUDY

10주차 수업 복습

coldNoodlePigeon 2021. 5. 13.

객체지향 프로그래밍

 

 

  • 객체지향 프로그램 : 실세계에 있는 객체들을 프로그램 상에 표현하고 이들 사이의 상호작용을 시뮬레이션 하기 위한 것 
  • 객체: 속성(attribute)[객체의 특성을 나타냄]  + 행동(behavior)[객체에 대해서 할 수 있는 행동]
  • 메소드: 객체를 대상으로 할 수 있는 행동들. 객체의 메소드는 함수로 정의됨.
  • 메소드 호출: 점 표기법으로 호출, 정의된 함수 내의 코드 실행. 함수와 마찬가지로 메소드 호출시 인자 전달 가능.

 

 

  • 클래스: 객체를 정의한 것 (객체의 속성행동을 정의) , 객체에 대한 설계도, 객체지향 언어에서 일종의 자료형(data type) 

ex> 자동차라는 객체/ 속성: 소유자명, 마일리지 / 행동: 주행, 마일리지 조회 

*이 객체의 속성은 어떤 행동을 함으로써 변경될 수 도 있고, 어떤 속성의 변경을 통해서 행동이 변경될 수도 있다. 

      (ex. 자동차 주행 시 (행동), 자동차(객체)의 마일리지(속성)이 변경됨) 

 

  • 속성-> 실체변수 / 행동-> 메소드  로 표현됨!

 

객체의 생성과 사용 

  • 실체화(instantiation) : 클래스로부터 객체들을 생성해내는 것. 객체는 클래스의 하나의 실체. 

        ex> 하나의 자동차 설계도(클래스)로 여러 대의 자동차(객체=실체(instance) ) 생성. 

 

from turtle import*
t=Turtle()	#거북이 객체를 생성
t.forward(100)	#forward는 거북이 객체의 메소드	
t.right(90)	#right는 거북이 객체의 메소드 
t.forward(100) 

 

word=[]
word.append('I')
word.extend(['love','chicken'])
word.insert(2,'delicious')
word
['I','love','delicious','chicken']
word.sort()
word.reverse()

문자열이나 리스트도 python 언어가 제공하는 일종의 객체로 볼 수 있음. 

 

 

클래스의 정의 

 

  • 클래스: 객체의 속성과 메소드를 정의한 것, like 객체의 설계도, class 예약어 사용 
class Account:
	def __init__(self,name):
    	self.name=name
        self.balance=0
    def getBalance(self):
    	return self.balance
    def deposit(self,amount):
    	self.balance+=amount
        return self.balance
    def withdraw(self,amount):
    	if amount<=self.balance:
        	self.balance-=amount
        else:
        	print("잔액 부족")
        return self.balance     

 

  • 생성자 __init__ 메소드: 실체변수 (ex. name)이 초기화되도록 할 수 있다. 

 

 

클래스를 사용하여 원하는 수만큼의 객체를 생성할 수가 있다. 

 

ex> 

acc1=Account("Kim")

에서 acc1 (변수)는 생성된 객체를 가리키는 객체 참조 변수 (object reference variable)이라고 한다. 

클래스명을 갖는 클래스의 객체를 생성 후, 이를 변수가 참조한다. 

 

필드 변수/ 메소드 호출

 

  • 참조변수.변수 (ex. acc1.getBalance() ) : 참조변수가 객체의 필드 변수를 접근
  • 참조변수.메소드(인수리스트) (ex. acc1.deposit(10000) ): 참조변수가 객체의 메소드 호출 

 

객체 변수와 클래스 변수

 

  • 객체 변수(object variable) (= 실체 변수(instance variable) ) : 각 객체마다 이 변수를 위한 기억공간이 별도로 존재하는 필드 변수
  • 클래스 변수(class variable)(= 정적 변수(static variable) ) : 클래스에 하나 존재하여 그 클래스의 모든 객체가 공유하는 변수 

 

ex> 

 

class Account: 
	counter=0
    def __init__(self,myname):
    	self.name=myname 
        self.balance=0
        Account.counter+=1
    def __delf__(self):
    	Account.counter-=1
    def getCounter(self):
    	return Account.counter 

counter 변수는 클래스 변수(정적 변수) 로, 이 클래스로부터 생성된 객체의 개수를 세는 데 사용된다. 클래스의 객체가 생성될 때마다 __init__ 메소드에서 1씩 증가시키고 객체가 소멸될때마다 실행되는 __del__ 메소드에서 1씩 감소시킨다. getCounter 메소드는 이 개수를 리턴. 

kim=Account('kim')
lee=Account('lee')
park=Account('park')
kim.getCounter()
3
Account.counter
3 

 

캡슐화 

  • 추상 자료형(abstract data type): 데이터(자료구조)와 관련된 연산(메소드)들을 한데 묶어 캡슐화하여 정의한 자료형
  • 클래스: 데이터(자료구조)와 관련된 연산(메소드)들을 한데 묶어 캡슐화하여 정의한 일종의 추상 자료형
  • 캡슐화(encapsulation): 데이터와 관련된 메소드들을 함께 선언하고 이 메소드들만 데이터를 사용케 함.  

 

캡슐화를 지원하기 위한 3가지 접근 제어 (access modifier)

 

  • 공용(public) 접근 제어: 기반, 파생, 외부 클래스의 메소드 접근 / 언더바로 시작하지 X 
  • 보호(protected) 접근 제어: 기반클래스, (상속받은) 파생 클래스의 메소드 접근 / 언더바 한개로 시작
  • 전용(private) 접근 제어: 기반 클래스의 메소드 접근/ 언더바 2개로 시작 

ex> name, balance 의 정보는 매우 중요하고 민감하기에, 다른 클래스에서 임의로 접근하지 못하게 해야함. 따라서 아래와 같이 필드 변수 이름을 변경해야만 클래스 내부에서 사용될 수 있는 private 변수로 바꿀 수 있다. 

이 변수들을 외부에서 접근하거나 수정하려면 반드시 보호(protected) 또는 공용 (public) 메소드들을 사용해야함.

 

class Account:
	def __init__(self,name):
    	self.__name=name
        self.__balance=0
    def getBalance(self):
    	return self.__balance
    def deposit(self,amount):
    	self.__balance+=amount
        return self.__balance 

이때, my.__balance로 접근시 에러가 발생하면서 접근을 막는다.

 

객체 출력을 위한 __str__() 메소드: 출력하고자 하는 내용을 문자열의 형태로 리턴

 

ex> 

class Account:
    def __init__(self, name):
        self.name = name
        self.balance = 0
    def getBalance(self):
        return self.__balance
    def deposit(self, amount):
        self.balance += amount
        return self.balance
    
    def __str__(self):
        msg=self.name+"의 계좌"
        return msg
acc1=Account('KIM')
print(acc1)
KIM의 계좌 

 

 

상속

 

기존 클래스를 상속받아 새로운 클래스를 정의하는 것. 

 

기존 클래스 = 부모 클래스 OR 슈퍼 클래스 

상속받아 새로 정의된 클래스 = 자식 클래스 OR 서브 클래스 

자식 클래스가 부모 클래스의 기능을 상속 받아 쓰는 것으로, 자식 클래스는 부모 클래스를 확장한 (Extend) 클래스라고 할 수 있다. 

 

is-a 관계 

부모 클래스와 자식 클래스 사이에는 반드시 is-a 관계가 성립해야 한다. 자식 클래스는 부모 클래스보다 구체적인 버전 

ex> The child is a more specific version of the parent 

ex> Manager is an employee. 

 

단일 상속  

 

부모 클래스를 상속 받아 새로운 자식 클래스를 정의한다.

 

class Employee:
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary
    def pay(self):
        return self.salary

class Manager(Employee):
    def __init__(self,name,salary,bonus):
        Employee.__init__(self,name,salary)
        self.bonus=bonus
    def pay(self):
        return self.salary+self.bonus
    def getBonus():
        return self.bonus 
>>> e=Employee('kim',300)
>>> e.pay()
300
>>> e=Manager('lee',300,100)
>>> e.pay()
400

메소드 재정의 (method overriding) : 자식 클래스는 부모로부터 상속받은 메소드를 자신이 원하는 대로 재정의 가능

 

위와 같은 경우, 클래스 안에서 호출된 이름의 메소드를 먼저 찾고 존재하지 않으면 부모 클래스의 메소드를 찾게 된다. 

첫번째의 경우, 부모 클래스의 pay가 실행, 두번째의 경우에는 자식 클래스에서 재정의한 pay가 실행되었다.

 

ex> 

turtle 클래스를 상속받는 my_turtle 클래스. 

 

from turtle import*
class my_turtle(Turtle):
	def set_turtle(self,color):
    	self.color(color)
        self.shape('turtle')

 

다중 상속(multiple inheritance)

 

여러 개의 클래스를 상속 받는 것 

 

 

ex> 

class Person:
    def sleep(self):
        print('잠을 잡니다')
class Student(Person):
    def study(self):
        print('공부합니다')
    def play(self):
        print('친구와 놉니다')
class Worker(Person):
    def work(self):
        print('일합니다')
    def play(self):
        print('치맥을 먹습니다')
class Arbeit(Student,Worker):
    def myjob(self):
        print('나는 알바 학생입니다')
        self.sleep()
        self.play()
        self.study()
        self.work() 
>>> a=Arbeit()
>>> a.myjob()
나는 알바 학생입니다
잠을 잡니다
친구와 놉니다
공부합니다
일합니다

play()에서 메소드 충돌이 발생시, 왼쪽 (즉 Student,Worker 중 Student)의 메소드를 사용합니다. 

'💻STUDY > PYTHON STUDY' 카테고리의 다른 글

12주차 수업복습  (0) 2021.05.29
11주차 수업 복습  (0) 2021.05.22
9주차 수업 복습  (0) 2021.05.09
8주차 배운거 복습  (0) 2021.04.28
7주차 수업 복습  (0) 2021.04.14

댓글