[Python] 클래스(class)

Jeongyun Heo·2020년 12월 17일
0

Python

목록 보기
10/36
post-thumbnail

점프 투 파이썬 참고: https://wikidocs.net/28

클래스를 사용하면 객체를 생성만 하면 되기 때문에 함수를 사용하는 경우와 달리 매우 간단해진다.

기능을 더하려면 클래스에 함수를 추가해 주면 된다.

클래스 쓰는 방법
1. Class 입력
2. 대문자로 시작하는 클래스의 이름 작성
3. 안에 들어갈 함수, 변수 설정

✍️  클래스와 객체

쿠키 틀 ➡️ 클래스(class)
쿠키 틀에 의해 만들어진 쿠키 ➡️ 객체(object)

클래스란 똑같은 무언가를 계속해서 만들어 낼 수 있는 설계도면(쿠키 틀)
객체란 클래스로 만든 피조물(쿠키 틀을 사용해 만든 쿠키)

클래스로 만든 객체는 객체마다 고유한 성격을 가진다.
동일한 클래스로 만든 객체들은 서로 영향을 주지 않는다.
다른 객체에는 상관없이 독립적인 값을 유지한다.

객체는 클래스로 만들며,
1개의 클래스로 무수히 많은 객체를 만들어낼 수 있다.

class Calculator: # class class이름(대문자로 시작)
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator() # cal1, cal2는 '객체'라고 부른다.
cal2 = Calculator()

print(cal1.add(1))
print(cal1.add(2))
print(cal2.add(5))
print(cal2.add(3))

👉 
1
3
5
8

계산기 기능을 추가하고 싶으면 Calculator 클래스에 함수를 추가하면 된다.
그러면 클래스로 만든 객체에도 다 적용된다.

📕  객체와 인스턴스의 차이

클래스로 만든 객체를 인스턴스라고도 한다.
인스턴스라는 말은 특정 객체가 어떤 클래스의 객체인지 관계 위주로 설명 할 때 사용

a = Cookie()

a는 객체
a는 Cookie의 인스턴스


✍️  사칙연산 클래스 만들기

사칙연산을 쉽게 해주는 클래스 만들기

✏️   클래스를 어떻게 만들지 먼저 구상하기

클래스로 만든 객체를 중심으로 어떤 식으로 동작하게 할 것인지 미리 구상하기
생각한 것들을 하나씩 해결하면서 완성해 나가기

클래스는 아직 생각하지 말고
객체를 사용해서 사칙연산을 하는 것을 구상한다

✏️   클래스 구조 만들기

앞에서 구상한 것처럼 동작하는 클래스를 만든다.
제일 먼저 a = FourCal()처럼 객체를 만들 수 있게 한다.

클래스 기능은 생각하지 말고 일단 객체를 만들 수 있게 한다.

※ pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용한다.

class FourCal:
    pass ⬅️ pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용

a = FourCal() ⬅️ 객체 a 생성
print(type(a)) ⬅️ 객체 a의 타입 출력

👉 <class '__main__.FourCal'>
객체 a가 FourCal 클래스의 객체임을 알 수 있다.

✏️   객체에 숫자 지정할 수 있게 만들기

우선 객체 a에 사칙연산을 할 때 사용할 숫자 2개를 알려주어야 한다.
연산을 수행할 대상(4, 2)을 객체에 지정할 수 있게 만든다.

a.setdata(4, 2)
class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second

클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다.

메서드(Method): 클래스 내부의 함수

메서드도 클래스에 포함되어 있다는 점만 제외하면 일반 함수와 다를 것이 없다.

✅  setdata 메서드의 매개변수

a = FourCal()  ⬅️ 객체 a 생성
a.setdata(4, 2)  ⬅️ setdata 메서드 호출

위와 같이 객체를 통해 클래스의 메서드를 호출하려면 도트(.) 연산자를 사용해야 한다.

객체.메서드 형태로 호출하면 메서드의 첫 번째 매개변수 self에는 메서드를 호출한 객체가 자동으로 전달된다. 그러므로 객체.메서드 형태로 호출할 때는 self를 반드시 생략해서 호출해야 한다.

파이썬 메서드의 첫 번째 매개변수 이름은 아무 이름이나 사용 가능하나
관례적으로 객체 자신이 전달된다는 의미로 self를 사용한다.

✅  setdata 메서드의 수행문

    def setdata(self, first, second):
        self.first = first
        self.second = second

객체에 생성되는 객체만의 변수를 객체변수라고 부른다.

객체변수는 그 객체의 고유 값을 저장할 수 있는 공간이다.
클래스로 만든 객체의 객체변수는 다른 객체의 객체변수에 상관없이 독립적인 값을 유지한다.

class FourCal:
    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result


a = FourCal()
b = FourCal()

a.setdata(4, 2)
b.setdata(3, 8)

print(a.add())
print(a.sub())
print(a.mul())
print(a.div())
print(b.add())
print(b.sub())
print(b.mul())
print(b.div())

👉
6
2
8
2.0
11
-5
24
0.375

✍️  생성자 (Constructor)

생성자(Constructor)란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.

파이썬 메서드 이름으로 __init__를 사용하면 이 메서드는 생성자가 된다.
생성자는 객체가 생성되는 시점에 자동으로 호출된다.

class FourCal:
    def __init__(self, first, second):  ⬅️  __init__ 추가함
        self.first = first
        self.second = second

    def setdata(self, first, second):
        self.first = first
        self.second = second

    def add(self):
        result = self.first + self.second
        return result

    def sub(self):
        result = self.first - self.second
        return result

    def mul(self):
        result = self.first * self.second
        return result

    def div(self):
        result = self.first / self.second
        return result

생성자 __init__ 메서드를 추가하면 객체가 생성되는 시점에 자동으로 호출되기 때문에 객체를 생성할 때 괄호 안에 매개변수에 해당하는 값도 입력해야 한다.

매개변수 first와 second에 해당하는 값을 생성자의 매개변수에 전달해 줘야 한다.
첫 번째 매개변수 self에는 생성한 객체가 자동으로 전달되므로 값을 생략한다.

a = FourCal(4, 2) ⬅️ 이렇게 객체를 생성할 때 값을 줘야 오류 안 남

__init__ 메서드가 호출되면 setdata 메서드를 호출했을 때와 마찬가지로 first와 second라는 객체변수가 생성된다.

a = FourCal(4, 2)

print(a.first) ⬅️ 4
print(a.second) ⬅️ 2

👉
4
2
a = FourCal(4, 2)
b = FourCal(6, 3)

print(a.first) ⬅️ 4
print(a.second) ⬅️ 2

print(b.first) ⬅️ 6
print(b.second) ⬅️ 3

👉
4
2
6
3

   add나 div 등의 메서드도 잘 동작한다.

a = FourCal(4, 2)

print(a.add()) ⬅️ 6

print(a.div()) ⬅️ 2.0

👉
6
2.0

✍️  클래스의 상속

어떤 클래스를 만들 때 다른 클래스의 기능을 물려받게 만들 수 있다.

앞에서 만든 클래스를 상속하는 클래스를 만들어본다.

class MoreFourCal(FourCal):  ⬅️ 괄호 안에 상속할 클래스 이름을 넣어준다.
    pass

class 클래스이름(상속할 클래스이름)

상속받은 클래스의 기능은 모두 사용할 수 있다.

a = MoreFourCal(4, 2)
print(a.add())

👉 6

상속은 기존 클래스는 그대로 놔둔 채 클래스의 기능을 확장시킬 때 주로 사용한다.


✍️  메서드 오버라이딩 (덮어쓰기)

부모 클래스에 있는 메서드를 동일한 이름으로 다시 만드는 것을 메서드 오버라이딩이라고 한다.

메서드를 오버라이딩 하면 부모클래스의 메서드 대신 오버라이딩한 메서드가 호출된다.

class SafeFourCal(FourCal):
    def div(self):
        if self.second == 0: 
            return 0  ⬅️ 나누는 값이 0인 경우 0을 리턴
        else:
            return self.first / self.second


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

👉 0

✍️  클래스 변수

클래스 변수는 클래스 안에 변수를 선언하여 생성한다.

클래스 변수는 클래스이름.클래스변수로 사용

클래스로 만든 객체를 통해서도 클래스 변수 사용

클래스 변수 값을 변경하면 클래스로 만든 객체의 클래스 변수 값도 모두 변경된다.

클래스는 변수는 클래스로 만든 모든 객체에 공유된다.

id함수를 이용해서 객체들의 클래스 변수 주소를 출력해보면 모두 같은 주소가 나온다.

>>> id(Family.lastname)
140686808637232
>>> id(a.lastname)
140686808637232
>>> id(b.lastname)
140686808637232

클래스 변수보다는 객체변수를 사용하는 비율이 훨씬 높다.


✍️  메서드 안에서 메서드 호출하기

메서드 안에서 메서드를 호출할 때는 다음과 같이 self.메서드() 형식으로 호출해야 합니다.
self 없이 메서드 이름만 사용하면 클래스 바깥쪽에 있는 함수를 호출한다는 뜻이 되므로 주의해야 합니다.

class Person:
    def greeting(self):
        print('Hello')
 
    def hello(self):
        self.greeting()  # self.메서드() 형식으로 클래스 안의 메서드를 호출
 
james = Person()
james.hello()    # Hello

0개의 댓글