Week2-3 | class.py

Seongeun·2023년 6월 22일

week2

목록 보기
3/9
post-thumbnail

Week2-3. class(클래스)

  • class(클래스): class는 객체지향 프로그래밍(Object Oriented programming)의 표준기능으로, 속성과 기능을 가진 객체를 여러개 만들어 낼 수 있는 blueprint이다.

  • object(객체): class의 instance(실제로 메모리상에 할당되는 것), 속성(attribute), 기능(function)을 수행할 수 있다.

 #예제: 피트니스센터의 회원 class와 회원을 관리하는 class를 선언하고 객체를 생성하는 코드
 ----------------------------------------------------------------------
 fitnesscenter.py
 
 class Member:                       #class name은 대문자로 시작

    def __init__(self,id,pw):        #id,pw를 속성을 갖는 객체 생성 가능
        self.id = id
        self.pw = pw

 class MemberRepository:             

    def __init__(self):
        self.members = {}             #dictionary를 속성으로 갖는 객체 생성 가능

    def addMember(self,member):       #id,pw를 속성으로 갖는 member객체를 parameter로 갖는다.
        self.members[member.id] = member.pw

    def login(self,id,pw):
        result = id in self.members    #True or False

        if result  and self.members[id] == pw:
            print('Login success')

        else:
            print('Losin fail')

    def remove(self,id,pw):
        result = id in self.members

        if result and self.members[id] == pw:
            del self.members[id]
        else:
            print('Wrong access')

    def printMembers(self):
        for key, value in self.members.items():
            print('ID : {} - PW : {}'.format(key,value))
  ----------------------------------------------------------------------
 import fitnesscenter

 members = fitnesscenter.MemberRepository()   #dictionary를 속성으로 갖는 객체

 for i in range(3):                           #회원가입 3번 반복
     id = input('ID : ')
     pw = input('PW : ')
     member = fitnesscenter.Member(id,pw)     #id,pw를 속성을 갖는 객체
     members.addMember(member)

 members.printMembers()


 members.login('abc','123')
 members.login('def','455')
 members.login('ghi','789')


 members.remove('abc','123')

 members.printMembers()
  • shallow copy(얕은 복사): 객체 주소를 복사하는 것으로 객체 자체가 복사되지 않는다.(객체1개, 변수2개)

  • deep copy(깊은 복사): 객체 자체를 복사하는 것으로 또 하나의 객체가 생성된다.(객체2개, 변수2개)

 #예제: robot class를 생성하고 robot 객체를 선언하여, shallow copy와 deep copy를 실행하는 코드
 ----------------------------------------------------------------------
 robot.py
 
 class Robot:
    def __init__(self,name, color, height, weight):   #name,color,height,weight 속성을 가지는 객체생성 가능
        self.name = name
        self.color = color
        self.height = height
        self.weight = weight

    def printRobotInfo(self):
        print('Color : {}'.format(self.color))
        print('Height : {}'.format(self.height))
        print('Weight : {}'.format(self.weight))

 ----------------------------------------------------------------------
 import robot

 #shallow copy
 
 rb1 = robot.Robot('rb1', 'white', '70cm', '1kg')
 rb2 = rb1       #shallow copy, 객체 1개에 rb1,rb2 변수 2개가 할당되었다.

 print(rb1)
 print(rb2)      #같은 객체 주소를 가지고 있다. 즉, 객체 주소만 복사되었다.


 #deep copy

 import copy #copy_module

 rb1 = robot.Robot('rb1', 'white', '70cm', '1kg')
 rb2 = copy.copy(rb1)

 print(rb1)
 print(rb2)        #각자 다른 객체 주소를 가지고 있다.

  • class 상속: 물려주는 클래스(Parent Class, Super class)의 속성,기능을 물려받는 클래스(Child class, sub class)가 가지게 되는 것이다.
#예제: NormalTV class를 상속받는 TV4K,TV8K class를 선언하고, 객체를 생성하는 코드
----------------------------------------------------------------------
 tv.py
 
 class NormalTV:       

     def __init__(self,inch = 52, color='black', resolution='full-HD'):  #기본 setting
         self.inch = inch
         self.color = color
         self.resolution = resolution
         self.smartTV = 'off'
         self.aiTV = 'off'

     def turnOn(self):
         print('Turn on TV')

     def turnOff(self):
         print('Turn off TV')

     def printTVInfo(self):
         print('Inch : {}inch'.format(self.inch))
         print('Color : {}'.format(self.color))
         print('Resolution : {}'.format(self.resolution))
         print('SmartTV : {}'.format(self.smartTV))
         print('AITV : {}'.format(self.aiTV))


 class TV4K(NormalTV):
     def __init__(self,inch,color,resolution = '4k'):
         super().__init__(inch,color,resolution)

     def setSmartTV(self,s):
         self.smartTV = s


 class TV8K(NormalTV):
     def __init__(self, inch, color, resolution='8k'):
         super().__init__(inch,color,resolution)

     def serAiTV(self,a):
          self.aiTV = a
 ----------------------------------------------------------------------
 import tv

 my4kTV = tv.TV4K(65,'silver','4k')

 my4kTV.setSmartTV('on')
 my4kTV.turnOn()
 my4kTV.turnOff()
 my4kTV.printTVInfo()


 friend8kTV = tv.TV8K(75,'black','8k')

 friend8kTV.serAiTV('on')
 friend8kTV.turnOn()
 friend8kTV.turnOff()
 friend8kTV.printTVInfo()
  • overridiing(오버라이딩): super class의 기능(function)을 sub class에서 재정의(override)하는 것이다.
  • abstract class(추상클래스): abstract class(super class)는 한개 이상의 abstract method를 가지며, sub class가 해당 abstract method를 반드시 구현하도록 강제한다. abstract method를 구현하지 않으면 객체를 생성할 시 에러가 발생한다.
 #예제: 추상클래스를 이용해서 한영, 한일 사전 class를 선언하고 객체를 생성하는 코드
 ----------------------------------------------------------------------
 dic.py
 
 from abc import *        #abc(abstract base class) package를 import 해야한다.

 class AbsDictionary(metaclass=ABCMeta):

     def __init__(self):
         self.words = {}  #dictionary 속성을 갖는 객체 생성 가능

     @abstractmethod
     def register(self,w1,w2):
         pass

     @abstractmethod
     def remove(self,w1):
         pass

     @abstractmethod
     def update(self,w1,w2):
         pass

     @abstractmethod
     def search(self,w1):
         pass


 class KorToEng(AbsDictionary):

     def __init__(self):
         super().__init__()
        

     def register(self,k,e):
         print('Register: {} - {}'.format(k,e))
         self.words[k] = e

     def remove(self,k):

         result = k in self.words

         if result:
             del self.words[k]
             print('Remove: {}'.format(k))
         else:
             print('Wrong access')


     def update(self, k,e):
         print('Update: {} - {}'.format(k, e))
         self.words[k] = e

     def search(self,k):
         print('{} - {}'.format(k,self.words[k]))

     def printWords(self):
         for k,e in self.words.items():
             print('{} - {}'.format(k,e))



 class KorToJpa(AbsDictionary):
     def __init__(self):
         super().__init__()

     def register(self, k, j):
         print('Register: {} - {}'.format(k, j))
         self.words[k] = j

     def remove(self, k):

         result = k in self.words

         if result:
             del self.words[k]
         else:
             print('Wrong access')

         print('Remove: {}'.format(k))

     def update(self, k, j):
         print('Update: {} - {}'.format(k, j))
         self.words[k] = j

     def search(self, k):
         print('{} - {}'.format(k, self.words[k]))

     def printWords(self):
         for k,j in self.words.items():
             print('{} - {}'.format(k,j))
 ----------------------------------------------------------------------
 import dic

 kTe = dic.KorToEng()

 kTe.register('나비', 'butterfly')
 kTe.register('친구', 'friend')
 kTe.register('사랑', 'love')
 kTe.register('가족', 'family')

 print('-'*10)
 
 kTe.search('나비')

 print('-'*10)

 kTe.printWords()

0개의 댓글