TIL-019 | Python_클래스(class)

Lee, Chankyu·2021년 10월 2일
0
post-thumbnail

📝 클래스(class)

  • 클래스에 대해 설명한 글이나 강의들을 보면 흔히 쿠키를 만드는 쿠키 틀에 비유하곤 한다. 그리고 그 틀로 만들어낸 피조물(쿠키)은 객체(object)를 의미한다.
  • 클래스에 의해 만들어진 객체들은 서로 영향을 주지 않으며 고유한 성격을 가지고 있다.

✅ 인스턴스라는 단어가 자주 등장한다. 인스턴스와 객체는 거의 동일한 의미로 사용되는 경우도 있지만, 인스턴스는 객체와 클래스의 관계를 설명할때 주로 쓰인다. 예를 들자면, 어떤 A라는 클래스에서 생성한 객체 B가 있다고 가정해보자. "객체 B는 클래스 A의 인스턴스 이다" 라고 표현할 수 있다.


클래스의 기본 구조 및 만드는 방법

  • 간단한 클래스 구조를 살펴보겠다.
class MyCar:
    BMW = "520i"
    Audi = "A6"
    Hyundai = "Sonata"
    Kia = "K5"

a = MyCar
print(a) # <class '__main__.MyCar'>
print(a.BMW) # "520i"
  • 클래스를 선언할때는 첫 글자는 대문자로 시작하는 이름을 선정해주도록 한다.
  • a 라는 객체를 생성하여 위와 같이 클래스 내의 변수를 불러올 수 있다.

클래스 내의 메소드(method)

class MyCar:
    BMW = "520i"
    Audi = "A6"
    Hyundai = "Sonata"
    Kia = "K5"

    def dreamCar():
        print("Porche is good")
        
a = MyCar()
print(a.dreamCar()) # TypeError: dreamCar() takes 0 positional arguments but 1 was given
  • 위와같이 클래스내의 포함되어 있는 함수, dreamCar() 메소드는 0개의 arg를 받지만 1개의 arg가 주어져서 에러가 생겼다고 뜨는 것을 볼 수 있다. 나는 arg를 입력하지 않았지만 이렇게 뜨는 이유는 메서드를 호출할때 객체 자기자신이 전달되기 때문이다. 즉 a.dreamCar()a.dreamCar(a)로 입력되는 꼴이다.
    그러므로 클래스내에 메소드를 정의할때는 아래의 코드와 같이parameter로 (self)를 지정해준다.
class MyCar:
    BMW = "520i"
    Audi = "A6"
    Hyundai = "Sonata"
    Kia = "K5"

    def dreamCar(self):
        print("Porche is good")
        
a = MyCar()
print(a.dreamCar()) # "Porche is good"

클래스의 생성자(Constructor)

  • 생성자는 객체가 생성 될때 자동으로 호출되는 메서드이며, 메서드의 이름으로 __init__을 사용하면 생성자이다.
  • 즉, 클래스를 선언함과 동시에 __init__ 함수가 실행되는 것이다.
class Constructor:
    def __init__(self):
        print("정말 자동으로 실행되네!?")
    def test(self):
    	print("난 생성자가 아니라서 따로 호출을해야해")

a = Constructor()
print(a) #" 정말 자동으로 실행되네!?"
print(a.test()) # "난 생성자가 아니라서 따로 호출을해야해"

class Constructor2:
    def __init__(self):
        self.name = input("너의 이름은: ")
    def speak(self):
    	print("니 이름은 {} 구나~".format(self.name))

a = Constructor2()
print(a.speak()) # 이름 입력하면, "니 이름은 000 구나~"
  • 위 코드에서 self.name객체(여기서는 "a").name의 의미라고 볼 수 있다. 즉 굳이 쉽게 이해하려고 노력해보면, 메소드 내의 name 변수를 호출하기 위해서는 a.name과 같은 방식으로 호출해야하는데 a가 메서드안으로 가면 self 인거나 마찬가지니 self.name 인 것이다.

클래스의 상속

  • 상속이란, 새로운 클래스를 생성할 때 기존의 존재하는 클래스의 기능을 물려받는 것을 의미한다.
class Constructor2:
    def __init__(self):
        self.name = input("너의 이름은: ")
    def speak(self):
    	print("니 이름은 {} 구나~".format(self.name))

class inheritance(Constructor2):
    pass

b = inheritance()
print(b) // # Constructor2 클래스와 동일하게 동작한다.

# 상속 및 super() 함수의 사용 예제
class inheritance(Constructor):
    def __init__(self):
        super().__init__()
        self.age = input("너의 나이는 : ")
    def test(self):
        super().test()
        print("너의 나이는 {}살 이구나!".format(self.age))

b = inheritance()
print(b) # "너의 이름은: "->"너의 나이는 : " 
print(b.test()) # "니 이름은 000 구나~" -> "너의 나이는 00살 이구나!" 
  • super() 함수는 상속받는 클래스의 메소드를 그대로 물려받는 함수이다. 위의 예제코드를 보면 Constructor 클래스의 __init__ 메소드와 test 메소드의 내용을 그대로 받으면서 같은 메소드 내에 새로운 내용이 추가 됨을 볼 수 있다.

메소드 오버라이딩(overriding)

  • 자식클래스에서 부모클래스에서 사용된 메소드 명을 그대로 사용하되, 다른 기능을 구현해야 할때 메소드 오버라이딩을 한다.
  • 동일한 이름으로 덮어쓰기 하는 것이다.
class inheritance(Constructor):
    def __init__(self):
        super().__init__()
        self.age = input("너의 나이는 : ")
    def test(self):
        print("너의 이름은 {} 이고, 나이는 {}살 이구나!".format(self.name, self.age))

b = inheritance()
print(b)
print(b.test()) # "너의 이름은 000이고, 나이는 00살 이구나!"
profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 댓글