개발자식

[Python] 클래스 (Class) 본문

Data/Python

[Python] 클래스 (Class)

밍츠 2022. 3. 27. 04:16

클래스 (Class)

- 객체를 표현하기 위한 문법, 자료형을 위한 일종의 템플릿

- 객체 지향 언어 : 객체를 사용한 프로그래밍 언어

 

클래스 정의

class TestClass:
	pass

- 클래스 이름 TestClass는 대문자로 작성한다. (PEP 8 Style Guide for Python Code 권고 방식)

+ 함수를 정의할 땐 대문자를 안 쓴다.

 

인스턴스(객체) 생성

- 어떤 템플릿(클래스)을 불러와서 그걸 다른 이름의 객체로 저장한다.

- 여러 개 인스턴스를 호출하는 것도 가능

 

test_instance1 = TestClass()
test_instance2 = TestClass()
test_instance3 = TestClass()

 

 

type()을 사용하여 어떤 클래스의 인스턴스인지 확인

print(type(test_instance))
# <class '__main__.TestClass'>

- 파이썬에서 __main__은 "현재 실행 중인 파일"을 의미

 

클래스 변수

- 클래스를 정의할 때 그 안에서 변수를 정의하면 모든 인스턴스에서 동일한 데이터를 사용할 수 있다.

 

class Restaurant:
    food="beef"
guest = Restaurant()
guest1 = Restaurant()

print(guest.food)
print(guest1.food)

- 모두 "beef" 출력됨

 

메서드

- 클래스 안에서 정의된 함수

- 함수를 정의할 때와 다르게 메서드를 정의할 때 첫 번째 인수를 항상 self로 지정해야 한다.

 

class Restaurant:
    food="beef"
    
    def order(self):
        print("I want to eat {}!".format(self.food))

guest = Restaurant()
guest1 = Restaurant()

guest.order()
guest1.order()

- 모두 "I want to eat beef"가 출력된다.

- 함수 안에서 클래스 변수를 사용할 대는 self.food와 같은 형식으로 불러온다.

 

+다른 인수가 있는 메서드

class Restaurant:
    food="beef"
    
    def order(self,add):
        print("I want to eat {}! and {} please.".format(self.food,add))

guest = Restaurant()
guest1 = Restaurant()

guest.order("water")
guest1.order("coke")

결과 :

I want to eat beef! and water please.
I want to eat beef! and coke please.

 

- order 메서드를 정의할 때 필요한 인수를 받기 위해 add를 넣어줬다.

- 메서드의 첫 번째 인수는 self이다.

+ 다른 메서드를 정의하고 여기서 add를 사용하지는 못한다. -> 해결 : self 이용 (인스턴스 변수의 활용)

 

 

생성자

- 클래스를 호출할 때 자동으로 어떤 함수를 실행하거나 값을 호출하고 싶을 때 정의한다.

- 메서드 정의할 때와 똑같지만 메서드 이름을 __init__으로 한다.

 

class Restaurant:
    def __init__(self):
        print("Excuse me")
        
guest=Restaurant()

- "Excuse me" 출력

- Restaurant 클래스를 객체로 불러올 때마다 "Excuse me" 출력

- __init__은 클래스 생성과 동시에 실행

 

 

클래스를 호출할 때 다른 매개변수를 받는 방식

class Restaurant:
    def __init__(self,name):
        print("Excuse me {}".format(name))
guest=Restaurant("minju")

- "Excuse me minju" 출력

- 생성자 __init__에서 self 말고 name 인수도 받기 때문에 객체를 생성할 때 괄호 안에 인수를 넣어줘야 한다.

 

 

인스턴스 변수

- 각 개체가 클래스 변수와 메서드로만 이루어져 있다면 객체들을 구별해야 할 필요가 없다.

- 클래스를 구별해서 인스턴스를 생성하는 이유는 각 인스턴스가 다른 종류의 데이터인 인스턴스 변수를 보유할 수 있기 때문이다. 관리하기 편하다

  • 클래스를 이력서 양식이라고 비유하면 인스턴스는 이력서 데이터이고 이 데이터는 각각 다르며 이를 인스턴스 변수(이름, 성별, 나이 등)로 관리할 수 있다.

- 인스턴스 변수는 클래스 변수와 달리 모든 인스턴스가 공유하는 것이 아니라 각 개체가 보유한 데이터이다.

 

class FakeClass:
    pass

fake_class1 = FakeClass()
fake_class2 = FakeClass()
fake_class1.fake_key = "Hi!"
fake_class2.fake_key = "Hello!"

print(fake_class1.fake_key,fake_class2.fake_key)

결과 :

Hi! Hello!

 

- 클래스에 선언된 인수와 별개로 인스턴스 변수 선언이 가능하다.

 

 

self의 활용 (인스턴스 변수 활용)

class Restaurant:
    def __init__(self,food):
        self.food=food
   
guest=Restaurant("beef")
print("food : ",guest.food)

- "food : beef"가 출력된다.

- 인스턴스를 생성할 때 food를 넣어줬기 때문에 각 인스턴스의 food에서 인자를 그대로 가지고 있다.

- self 자리에 인스턴스(객체) 이름을 넣어주면 해석하기 편하다.

 

class Restaurant:
    intro ="May I help you?"
    
    def __init__(self,name):
        self.name=name
        print("Excuse me {}".format(self.name))
    
    def order(self):
        print("I'm {}, {}".format(self.name,self.intro))
   
guest=Restaurant("minju")
guest.order()

결과 :

Excuse me minju
I'm minju, May I help you?

- 클래스 변수와 인스턴스 변수 모두 자유롭게 사용이 가능하다.

 

 

클래스 상속

#부모 클래스
class Restaurant:
    def __init__(self):
        self.name=input("name : ")

#자식 클래스
class Menu(Restaurant):
    def __init__(self,food):
        super().__init__()
        self.food=food
    def order(self):
        print("{}'s food is {}".format(self.name,self.food))
   
guest=Menu("chicken")
guest.order()

결과 :

name : minju
minju's food is chicken

- 클래스 상속은 자식 클래스를 선언할 때 소괄호로 부모 클래스를 포함시킨다.

- 자식 클래스에서는 부모 클래스의 속성과 메서드는 기재하지 않아도 포함이 된다.

- super()는 부모 클래스라고 생각하면 쉽다.

 

class Country:
    """Super Class"""

    name = '국가명'
    population = '인구'
    capital = '수도'

    def show(self):
        print('국가 클래스의 메소드입니다.')


class Korea(Country):
    """Sub Class"""

    def __init__(self, name):
        self.name = name

    def show_name(self):
        print('국가 이름은 : ', self.name)
        
a = Korea('대한민국')
a.show()
a.show_name()
print(a.name)
print(a.population)
print(a.capital)

결과 :

국가 클래스의 메소드입니다.
국가 이름은 :  대한민국
대한민국
인구
수도

 

Comments