클래스

  • 프로그램이 실행되어을 때 실행되는 객체가 어떤 멤버변수와 메소드를 가지는지 정의해둔것
  • 간단히 말해서 변수와 함수를 모아놓고 필요할 때 가져다 쓰는 것
  • 객체마다 고유의 성격을 가지기 때문에, 동일한 클래스로 만든 객체들은 서로 영향을 주지 않음

클래스 정의

  • class는 클래스를 만들때 사용되는 예약어
  • 클래스의 이름은 만드는 사람이 임의로 설정 가능
class Abc:
    pass

객체와 인스턴스

  • 객체를 만드는 방법은 클래스를 임의의 변수에 할당하면됨
  • 밑에 코드에서 a는 객체임
  • 객체 a는 클래스의 인스턴스임

    인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용. 즉, a는 객체이고 a는 클래스의 인스턴스임

a = Abc()
b = Abc()

self

  • 메서드에서 속성 값을 사용할 경우 메서드의 첫 번째 매개변수 이름은 관례적으로 self를 사용
  • 객체를 호출할 때 호출한 객체 자신이 self에 전달됨
    self
class Name:
    str = "abc"
    def abc(self):
        return f"{self.str} hello"

a = Name()
print(a.str)
print(a.abc())

class Calc:
    def data(self, first, second):
        return first, second
    
a = Calc()
print(a.data(4, 2))


class Test:
    def data(first, second):
        return first, second
a = Test()
# print(a.data(4, 2))   # 오류 발생
# data() takes 2 positional arguments but 3 were given -> data()메서드는 2개의 인자를 가졌는데 3개의 인자가 주어졌다
# 1개의 인자는 self로 지정해 줘야함
abc
abc hello
(4, 2)

self를 사용하지 않을때

  • 메서드 내에서 속성값을 사용하지 않을 때 self를 생략 가능
class Book:
    author = ""
    name = ""
    def print():
        return f"Author: {Book.author}, name: {Book.name}"
    
Book.author = "Mr.kim"
Book.name = "Awesome Python"
print(Book.print())
Author: Mr.kim, name: Awesome Python

메서드

  • 클래스 내에서 사용하는 함수를 메서드 라고함
  • 메서드를 사용할 때는 객체 뒤에 .을 이용하여 호출
class Method:
    def say_hello(self):
        return "hello"
    
a = Method()
print(a.say_hello())
hello

생성자

  • def __init__(self): 메서드를 통해 객체를 만들 때 기본적으로 실행되는 함수를 만들 수 있음
class Myname:
    def __init__(self):
        print("이 문장은 객체를 만들 때 기본적으로 실행됨")
        
a = Myname()

이 문장은 객체를 만들 때 기본적으로 실행됨

멤버 변수

  • 클래스에서 멤버변수를 선언할 수 있음
  • 멤버변수는 클래스 안에서 사용이 가능
class Mem_var:
    def data(self, num1, num2):
        self.num1 = num1    # 멤버변수
        self.num2 = num2    # 멤버변수
    def print(self):
        return self.num1, self.num2

a = Mem_var()
a.data(10, 20)
print(a.num1)
print(a.num2)
print(a.print())
10
20
(10, 20)

클래스 파라미터

  • 객체를 생성할 때 클래스에 맞는 파라미터를 정할수 있음
class Hello:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def say_hello(self):
        return f"name: {self.name}, age: {self.age}"

a = Hello("Mr.kim", 23)
print(a.say_hello())

name: Mr.kim, age: 23

클래스 예제

class Calculator:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
    def add(self):
        return self.num1 + self.num2
    def sub(self):
        return self.num1 - self.num2
    def mul(self):
        return self.num1 * self.num2
    def div(self):
        return self.num1 / self.num2
    
calc1 = Calculator(10, 5)
print(calc1.add())
print(calc1.sub())
calc2 = Calculator(20, 2)
print(calc2.mul())
print(calc2.div())
15
5
40
10.0

클래스 상속

  • 어떤 클래스를 만들 때 다른 클래스의 기능을 물려받게 만드는 것
  • 클래스를 생성할 때 이름 옆의 ()에 상속할 클래스를 입력
class Calculator:
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2
    def add(self):
        return self.num1 + self.num2
    def sub(self):
        return self.num1 - self.num2
    def mul(self):
        return self.num1 * self.num2
    def div(self):
        return self.num1 / self.num2

class MoreCalculator(Calculator):
    def pow(self):
        return self.num1 ** self.num2

a = MoreCalculator(2, 10)
print(a.pow())
print(a.add())
1024
12

메소드 오버라이딩

  • 부모 클래스의 메서드를 동일한 이름으로 다시 만드는 것
  • 오버라이딩하면 부모 클래스의 메서드 대신 오버라이딩한 메서드가 호출
# Calculator클래스에서 (4, 0)을 인자로 주고 div()메서드를 실행하면 오류가 발생
class Method_overriding(Calculator):
    def div(self):
        if self.num1 == 0 or self.num2 == 0:
            return 0
        else:
            return self.num / self.num2

a = Method_overriding(4, 0)
print(a.div())
0

super()

  • 부모 클래스의 인스턴스 속성(멤버변수)은 자식 클래스에 상속되지 않음
  • 부모 클래스의 임시적인 객체를 반환하여 부모클래스의 메서드를 사용할 수 있게 하는 것
  • 부모 클래스의 메서드를 불러와서 사용하는 것이지, 부모 클래스의 인스턴스 속성 자체를 변경하는건 아님
class Mother:
    def __init__(self):
        self.name = "이름"
        self.age = "나이"
    def show(self):
        return "부모 클래스의 메소드"
    
class Child(Mother):
    def __init__(self, name):
        self.name = name
    def show_name(self):
        return f"이름: {self.name}"
    def show_age(self):
        return f"나이: {self.age}"
    
a = Child("Mr.kim")
print(a.show())
print(a.show_name())
# print(a.show_age())   # 부모 클래스의 인스턴스 속성은 자식 클래스에 상속되지 않음
부모 클래스의 메소드
이름: Mr.kim
class Mother:
    def __init__(self):
        self.name = "이름"
        self.age = "나이"
    def show(self):
        return "부모 클래스의 메소드"
    
class Child(Mother):
    def __init__(self, name):
        super().__init__()  # 부모 클래스의 생성자를 자식클래스의 생성자에서 실행
        self.name = name
    def show_name(self):
        return f"이름: {self.name}"
    def show_age(self):
        return f"나이: {self.age}"
    
a = Child("Mr.kim")
print(a.show())
print(a.show_name())
print(a.show_age())
부모 클래스의 메소드
이름: Mr.kim
나이: 나이
class Mother:
    def __init__(self):
        self.name = "이름"
        self.age = "나이"
    def show(self):
        print(f"이름: {self.name}, 나이: {self.age}")
    
class Child(Mother):
    def __init__(self, name):
        super().__init__()  # 부모 클래스의 생성자를 자식 클래스의 생성자에서 실행
        self.name = name
    def show_name(self):
        super().show()  # 부모 클래스의 메서드를 자식 클래스의 메서드를 상속
        return f"이름: {self.name}"
    def show_age(self):
        return f"나이: {self.age}"
    
a = Child("Mr.kim")
print(a.show_name())
이름: Mr.kim, 나이: 나이
이름: Mr.kim

카테고리:

업데이트:

댓글남기기