파이썬기초-12 클래스
클래스
- 프로그램이 실행되어을 때 실행되는 객체가 어떤 멤버변수와 메소드를 가지는지 정의해둔것
- 간단히 말해서 변수와 함수를 모아놓고 필요할 때 가져다 쓰는 것
- 객체마다 고유의 성격을 가지기 때문에, 동일한 클래스로 만든 객체들은 서로 영향을 주지 않음
클래스 정의
class
는 클래스를 만들때 사용되는 예약어- 클래스의 이름은 만드는 사람이 임의로 설정 가능
class Abc:
pass
객체와 인스턴스
- 객체를 만드는 방법은 클래스를 임의의 변수에 할당하면됨
- 밑에 코드에서 a는 객체임
- 객체 a는 클래스의 인스턴스임
인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지를 관계 위주로 설명할 때 사용. 즉, a는 객체이고 a는 클래스의 인스턴스임
a = Abc()
b = Abc()
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
댓글남기기