상위 목록: 하위 목록: 작성 날짜: 읽는 데 26 분 소요

클래스(class)

클래스(class)객체 지향 프로그래밍(OOP)에서 특정한 객체를 생성하기 위해서 변수, 함수, 메서드이벤트 등을 정의하는 틀입니다.

프로그램을 구성할 때, 동일한 코드나 알고리즘이 반복되거나 함수들을 하나로 묶어주는 공간이 필요하게 됩니다.

클래스를 사용하게 되면 재사용성, 가독성, 간결화된 코드를 구현할 수 있습니다.

예를 들어, 동일한 함수를 사용하더라도 변수를 추가로 더 많이 만들지 않아도 되며 어떤 함수를 실행하기 위해서 선행되어야 하는 함수 등도 중복해서 구문에 포함하지 않아도 됩니다.


class Human:
    def __init__(self):
        self.name = "알 수 없음"
        self.age = 99

    def man(self, name, age=10):
        self.name = name
        self.age = age

    def woman(self, name, age):
        self.name = name
        self.age = age

    def prt(self):
        print("이름은 " + self.name + "이고, 나이는 " + str(self.age))


a = Human()
a.man("박XX")

b = Human()
b.woman("김XX", 30)

c = Human()

a.prt()
b.prt()
print(vars(c))
결과
이름은 박XX이고, 나이는 10
이름은 김XX이고, 나이는 30
{‘name’: ‘알 수 없음’, ‘age’: 99}


class Human:

class 클래스 이름:을 사용하여 클래스의 이름을 설정할 수 있습니다.

Python의 클래스 이름 표기 방식은 카멜 표기법(CamelCase)을 따르며, 첫 글자를 대문자로 표기합니다.


def __init__(self):
    self.name = "알 수 없음"
    self.age = 99

def __init__(self)을 통해 클래스가 생성되었을 때의 변수나 조건 등을 초기화실행할 수 있습니다.

self 인자는 자기 자신을 의미합니다. 여기서의 자기 자신은 클래스를 통해 생성된 인스턴스(instance)를 의미합니다.

클래스도 함수처럼 할당해서 사용하게 됩니다. 이때 할당된 변수를 인스턴스라 볼 수 있습니다.

만약 Human 클래스를 두 번 사용해 각자 다른 인스턴스를 생성한다면, 첫 번째로 생성한 인스턴스와 두 번째로 생성한 인스턴스는 서로 영향을 미치지 않습니다.

즉, self는 인스턴스의 자기 자신을 의미합니다.

self.변수 이름을 통하여 인스턴스에서 사용될 변수들의 초기값을 할당할 수 있습니다.

name 변수와 age 변수에 아무런 값도 할당되지 않는다면, 알 수 없음99의 값이 각각 할당됩니다.


def man(self, name, age=10):
    self.name = name
    self.age = age

man 함수에는 self, nameage를 매개변수로 사용합니다.

self는 필수적으로 입력되어야 하는 변수이며, 인스턴스를 의미합니다.

self의 유/무로도 클래스의 메서드인지, 일반 사용자 정의 함수인지도 구별할 수 있습니다.

또한, self.namename은 서로 다른 변수입니다.

self.name은 인스턴스 전반에 걸쳐 영향을 미치며, name은 함수 내부에서만 영향을 미칩니다.

age의 값은 10으로 초기설정이 되어있으므로, age 값을 입력하지 않는다면 10으로 자동 할당됩니다.


def woman(self, name, age):
    self.name = name
    self.age = age

woman 함수에는 nameage를 매개변수로 사용하며 두 개의 변수를 모두 할당해야 오류가 발생하지 않습니다.

만약, 특정 함수에서 self.변수 이름으로 선언한다면, 인스턴스 내부의 함수에서도 불러와 사용할 수 있습니다.

__init__에서 초기화하지 않더라도 일반 함수에서도 초기화, 생성, 삭제, 변경 등이 가능합니다.


def prt(self):
    print("이름은 " + self.name + "이고, 나이는 " + str(self.age))

prt 함수는 출력용 함수이며, 값을 입력하지 않고 호출만으로도 함수가 실행됩니다.

함수에서 어떤 값도 입력받지 않고 싶더라도, self는 선언해야 사용할 수 있습니다.


a = Human()
a.man("박XX")

b = Human()
b.woman("김XX", 30)

c = Human()

a.prt()
b.prt()
print(vars(c))

클래스 이름을 변수에 할당하여 클래스의 내부 함수를 실행시킬 수 있습니다.

변수명.클래스 함수명(매개변수1, 매개변수2)를 이용하여 ab 변수에 값을 할당할 수 있습니다.


a.prt()
b.prt()
print(vars(c))

*.prt() 함수는 아무런 인자를 필요로 하지 않으므로, 바로 사용이 가능합니다.

vars(변수이름)을 사용하여 사전 형식으로 할당된 값을 확인할 수 있습니다.

c 변수에는 __init__(self)를 통하여 초기화한 값인 알 수 없음99의 값이 할당되어 있습니다.



상속(inheritance)

상속(inheritance)은 클래스가 다른 클래스로 부터 생성된 모든 속성을 가져올 수 있는 기능입니다.

부모 클래스(Parent Class, Super Class)에서 생성된 속성을 자식 클래스(Child Class, Sub Class)에서 사용할 수 있습니다.

상속을 하더라도, 부모 클래스의 기능을 그대로 사용할 수 있습니다.

상속을 통해 코드를 구성한다면 중복되는 코드가 사라져 더 간결한 코드가독성 높은 프로그램을 구성할 수 있습니다.

  • Tip : 부모 클래스를 슈퍼 클래스라고도 부르며, 마찬가지로 자식 클래스도 서브 클래스로도 부를 수 있습니다.


class Human:
    def __init__(self):
        self.name = "알 수 없음"
        self.age = 99

    def set_name(self, name):
        self.name = name
        print("Human Class")

    def set_age(self, age):
        self.age = age


class Man(Human):
    def set_name(self, name):
        if "XX" in name:
            self.name = name.replace("XX", " 모 씨")
            print("Man Class")

    def prt(self):
        print("이름은 " + self.name + "이고, 나이는 " + str(self.age))


a = Man()
a.set_name("김XX")
a.prt()
결과
Man Class
이름은 김 모 씨이고, 나이는 99

class Man(Human):
    ...

class 클래스 이름(상속 받을 클래스 이름):을 사용하여 부모 클래스로부터 속성을 상속받을 수 있습니다.

만약 상속 받는 클래스가 여러 개라면, class 클래스 이름(클래스1, 클래스2, ...):의 형태로 다중으로 상속받을 수 있습니다.

다중 상속시 상속 받을 클래스의 이름이 앞 쪽에 있는 클래스가 우선권을 얻습니다.

즉, 클래스1클래스2, 클래스3에 동일한 이름의 메서드가 있다면 클래스1의 메서드를 상속해옵니다.

부모 클래스에 정의된 내용을 그대로 사용할 수 있으며, 추가적인 기능(prt 메서드)을 포함할 수도 있습니다.


class Man(Human):
    def set_name(self, name):
        if "XX" in name:
            self.name = name.replace("XX", " 모 씨")
            print("Man Class")

만약 부모 클래스에 정의된 메서드의 이름과 동일한 이름으로 자식 클래스에 생성한다면, 부모 클래스의 메서드는 무시되고 자식 클래스의 메서드가 실행됩니다.

이를 메서드 오버라이딩(Method Overriding)이라 부릅니다.

즉, 자식 클래스에서 메서드를 재정의해 사용할 수 있습니다.

메서드를 재정의하지 않는다면 부모 클래스의 메서드를 호출합니다.


class Man(Human):
    def set_name(self, name):
        if "XX" in name:
            self.name = name.replace("XX", " 모 씨")
            print("Man Class")
            super().set_name(self.name + "(가명)")

super().메서드 이름을 사용해 부모 클래스의 메서드를 호출할 수 있습니다.

또한, super().속성으로 부모 클래스의 name이나 age를 접근할 수도 있습니다.

메서드 오버라이딩을 하더라도, 부모 클래스에 접근해 재정의하기 전의 메서드나 속성을 사용할 수 있습니다.

댓글 남기기