본문 바로가기

Python

Python - Class

''' 
    클래스 : 사용자 정의 자료형.
            구조체 + 함수
            멤버 변수 + 멤버 함수 이루어짐 
            
    추상화 과정 : 클래스 생성의 과정.
        예 :계좌 
          일반인 : 계좌번호, 은행명, 잔액, 거래내력, 대출가능, ...
          은행원 : 계좌번호, 지점명, 고객명, ...
          
    객체지향언어 => 파이썬은 불완전 객체 지향 
        상속 : 기존 클래스를 이용하여 새로운 클래스 생성 
        캡슐화 : 접근제어자. 파이썬에서는 없다. 
        다형성 : 상속에 의해서 객체를 다른 형태로 봄 
                오버로딩(메서드의 다형성)
'''

# 클래스 
# 기본 생성자
# __int__(self) : => 생성자를 구현하지 않으면 자동으로 제공되는 생성자
# pass 
# self 자기 참조 변수, 객체 내부에서 사용됨 

class Car : 
    color = "" # 멤버 변수
    speed = 0  # 멤버 변수 
    def upSpeed(self,value): #멤버 함수 or 멤버 메서드
        self.speed += value
    def downSpeed(self,value): #멤버 함수 or 멤버 메서드
        self.speed -=value

mycar1 = Car() #mycar1 객체는 Car 클래스의 객체다.
mycar1.color="빨강"
mycar1.speed = 0

mycar2 = Car() #mycar2 객체는 Car 클래스의 객체다.
mycar2.color="노랑"
mycar2.speed = 0

mycar3 = Car() #mycar3 객체는 Car 클래스의 객체다.
mycar3.color="파랑"
mycar3.speed = 0

mycar1.upSpeed(30)
print("자동차 1의 색상은 %s 이며, 현재 속도는 %dkm입니다" 
      %(mycar1.color,mycar1.speed))

mycar2.upSpeed(60)
print("자동차 2의 색상은 %s 이며, 현재 속도는 %dkm입니다" 
      %(mycar2.color,mycar2.speed))

mycar3.upSpeed(10)
print("자동차 3의 색상은 %s 이며, 현재 속도는 %dkm입니다" 
      %(mycar3.color,mycar3.speed))

mycar2.color
mycar2.speed

### 생성자 : 객체화시 관여하는 메서드 
###         클래스의 가장 중요한 기능은 객체 생성
###         생성자 없는 객체 생성은 불가함 
###         __int__ 형태로 생성자를 구현함 
### 기본생성자 : 클래스 정의시 생성자를 구현하지 않으면 기본으로 제공됨
###           : def __init__(self) : 
###                  pass 

class Car : 
    color = ""
    speed = 0
    def __init__(self,v1,v2) : # 생성자. 객체 생성시 2개의 변수 값을 입력하도록 
        self.color = v1
        self.speed = v2
    def upSpeed(self,value) : 
        self.speed += value
    def downSpeed(self,value) :
        self.spped -= value
    
mycar1 = Car("빨강",0) #Car() : 생성자 호출 
# mycar1.color="빨강"
# mycar1.speed=0
mycar1.upSpeed(30)
print("자동차 1의 색상은 %s 이며, 현재 속도는 %dkm입니다" 
      %(mycar1.color,mycar1.speed))

mycar2 = Car('노랑',60) #Car 생성자 호출
print("자동차 2의 색상은 %s 이며, 현재 속도는 %dkm입니다" 
      %(mycar2.color,mycar2.speed))

# 쿨래스 멤버와 인스턴스 멤버 
# Car. / self. 인지에 따라서 클래스 멤버인지 인스턴스 멤버인지 달라진다. 


class Car : 
    color = "" #인스턴스 멤버
    speed = 0 #인스턴스 멤버
    num = 0 #인스턴스 멤버
    count = 0  #클래스 멤버
    def __init__(self,v="") : # 생성자 v="" 매개변수 없는 경우
        self.color = v #인스턴스 멤버
        self.spped = 0 #인스터스 멤버
        Car.count += 1 #클래스 멤버
        self.num = Car.count #인스턴스 멤버
    
    def printMessage(self) :
        print("색상: %s, 속도: %dkm, 번호:%d, 생산번호 :%s" %
              (self.color,self.speed,self.num,Car.count))


mycar1,mycar2 = None,None
mycar1 = Car()
mycar1.speed = 30
mycar1.printMessage()
mycar2 = Car()
mycar2.speed = 50
mycar2.printMessage()

 

#Car 클래스의 count 변수를 변경
Car.count += 10
mycar1.count += 10
print(mycar1.count)
print(mycar2.count)
print(Car.count)
print(mycar2.count)

mycar1.printMessage()
mycar2.printMessage()

# mycar3 객체 생성하기. 색상은 빨강색으로 speed는 0으로 
mycar3 = Car("빨강")
mycar3.speed = 0
mycar3.printMessage()

# 문제
# Card 클래스 구현하기
# 멤버 변수 : kind, number, no, count
# 멤버 함수 : printMessage()

#1번째 풀이
class Card: 
    kind = ""
    number = 1
    no = 0
    count = 0
    def __init__(self,v1="",v2=""):
        self.kind = "Spade" if v1 =="" else v1
        self.number = "1" if v2=="" else v2
        Card.count += 1
        self.no = Card.count
    
    def printMessage(self) :
        print("kind:%s, number:%s, no:%d, count:%s" %
              (self.kind,self.number,self.no,Card.count))
    
card1 = Card()
card2 = Card("Heart")
card3 = Card("Spade",10)
card1.printMessage() #kind:Spade, number:1, no:1, count:3
card2.printMessage() #kind:Heart, number:1, no:2, count:3
card3.printMessage() #kind:Spade, number:10, no:3, count:3

# 2번째 풀이
class Card: 
    kind = ""
    number = 1
    no = 0
    count = 0
    def __init__(self,v1="Spade",v2=1):
        self.kind = v1
        self.number = v2
        Card.count += 1
        self.no = Card.count
    
    def printMessage(self) :
        print("kind:%s, number:%d, no:%d, count:%s" %
              (self.kind,self.number,self.no,Card.count))
    
card1 = Card()
card2 = Card("Heart")
card3 = Card("Spade",10)
card1.printMessage() #kind:Spade, number:1, no:1, count:3
card2.printMessage() #kind:Heart, number:1, no:2, count:3
card3.printMessage() #kind:Spade, number:10, no:3, count:3