파이썬 독학/입문 강의

[파이썬독학강의] 16. 클래스(Class) feat.파이썬

데니 by danny 2023. 5. 21. 01:21
반응형

클래스(Class)

 

님들 안녕하세요. 14년 차 IT 개발자 데니예요. 이번 시간에는 객체 지향 프로그래밍(Object-oriented programming) 개념인 클래스(Class)를 학습해 볼게요. 클래스(Class) 실습은 그동안 사용해 왔던 파이썬 IDLE(Integrated development evironment)를 사용하지 않고 주피터 노트북(Jupyter notebbok)를 사용해서 실습해 볼게요. 님들이 꼭 설치하셔야 하는건 아니므로 원하지 않으시는 님들은 현재 실습 환경에서 계속 실습 진행하셔도 무관해요. 아래 링크는 아나콘다 설치 방법을 쉽게 안내해 주고 있고, 주피터 노트북 실행과 간단한 사용 방법이 포스팅되어 있으니 꼭 아래 링크 접속하셔서 학습하신 후 본 파이썬 클래스(Class) 강의를 학습해 주세요.

 

아나콘다는 파이썬 입문자부터 데이터 분석 전문가까지 모두를 만족시키는 All-in-one 파이썬 프로그래밍 실습/개발/데이터 분석 환경을 제공해요. 파이썬 클래스(Class) 강의까지 잘 따라오신 님들은 이제 입문자라기보단 초급자라는 표현이 더 어울릴 거라 생각해요.  그러므로 앞으로 님들이 파이썬 중급 개발자나 데이터 분석가로서 성장하기 위해서 그들이 주로 사용하는 개발 환경에 익숙해질 필요가 있으므로 아래 아나콘다 설치 방법을 참고하셔서 설치 및 사용하시길 추천드려요.

 

*아나콘다 설치 및 주피터 노트북 사용해 보기

 

아나콘다(Anaconda) 매우 쉬운 1분 설치 feat.파이썬 실습 환경 구축(주피터 노트북)

아나콘다는 파이썬 입문자부터 데이터분석 전문가까지 모두를 만족시킬 수 있는 All-in-one 파이썬 프로그래밍 실습/개발/데이터분석 환경을 제공합니다. 파이썬으로 무언가를 하고 싶으시다면

danny-edu.tistory.com

 

 

16. 클래스(Class) feat.파이썬

  ▶ 클래스(Class)란?

클래스는 일상생활에서 존재하여 인식할 수 있는 사물이나 동물의 일반적인 특징(속성)동작(기능)정의한 설계도 또는 템플릿이라고 할 수 있어요. 어떠한 사물이나 동물의 공통적인 속성과 기능을 추출하여 클래스로 정의하는 과정을 추상화(Abstraction)이라고 해요. 복잡한 시스템이나 개념을 단순화하는 추상화 과정을 거쳐 클래스를 만들 수 있어요. 

예를 들어, 아래 그림 왼쪽처럼 '강아지' 여러 마리가 있다고 가정해 봐요. 이들은 각자 다른 특성을 가지지만, 공통적으로 '이름'과 '나이'라는 속성을 가질 수 있어요. 그리고 이들은 '짖다', '앉다'와 같은 동작(기능)을 할 수 있어요. 추상화를 통해 '이름', '나이' 속성과 '짖다', '앉다' 동작(기능)을 가진 'Dog'클래스를 만들 수 있어요.

추상화(Abstraction) 과정
추상화(Abstraction) 과정

 

방금 전 클래스를 정의할 때, 클래스는 객체를 정의하기 위한 설계도 또는 템플릿이라고 말씀드렸어요. 왜 클래스를 설계도 또는 템플릿이라고 말할 수 있냐면, 클래스를 사용하면 붕어빵틀로 붕어빵을 계속해서 만들 수 있듯이 객체를 무한히 생성할 수 있기 때문이에요.  예를 들면, 위 그림에서 추상화 과정을 통해 정의한 'Dog' 클래스를 사용해서 '루시', '밀로', '벨라'라는 강아지 객체를 생성할 수 있어요. '루시', '밀로', '벨라'는 강아지 이름이고 이들의 나이는 각각 1살, 5살, 3살이에요. 이 강아지들은 '짖다', '앉다'와 같은 동작을 할 수 있어요.

아래 그럼처럼 클래스를 객체로 만드는 과정을 인스턴스화라고 해요. 인스턴스화를 통해 1살인 '루시', 5살인 '밀로', 3살인 '벨라'가 객체로 생성되었어요.

객체 생성(인스턴스화)
객체 생성(인스턴스화)

위에서 보여드린 2가지 그림과 클래스 개념을 잘 이해하고 계셔야 이어서 진행할 클래스 실습을 따라오실 수 있어요. 이해되지 않으셨다면 꼭 이해하시고 실습 진행해 주시면 감사하겠어요.

 

  ▶ 클래스 만들기

파이썬 실습을 통해서 클래스를 만들어보는 시간을 가져볼게요. 실습을 진행하기에 앞서 포스팅 초반에 언급드렸던 파이썬 실습 환경인 주피터 노트북으로 실습 진행해 볼게요. 만약 님들께서 다른 파이썬 실습 환경에서 진행하시고자 하신다면 실습 내용 및 결과에 영향을 미치는 부분은 없으니 원하시는 환경에서 실습하셔도 무관함을 다시 한번 알려드려요.

 

파이썬에서 클래스는 다음과 같은 구조로 정의돼요.

 

1
2
3
4
5
6
7
8
9
10
#클래스 기본 구조
class ClassName:
    
    # 생성자 (optional)
    def __init__(self, parameters):
# 속성(변수) 초기화
    
    # 메서드 (동작) 정의
    def method_name(self, parameters):
        # 메서드 코드
cs

 

라인[1]  ‘ClassName’은 클래스의 이름을 나타내요. 

라인[4]~[6] 생성자(‘__init__’ 메서드)는 클래스로부터 객체를 생성할 때 호출되는 특별한 메서드예요. 생성자는 ‘self’ 키워드를 첫 번째 매개변수로 받아야 하고 객체의 초기화를 담당하며, 필요한 속성을 초기화하거나 객체 생성 시 필요한 다른 작업을 수행할 수 있어요. 속성(변수)은 클래스 내부에 저장되는 데이터를 나타내요. 이러한 속성은 클래스의 모든 메서드에서 접근할 수 있어요. 속성은 클래스 내에서 ‘self’ 키워드를 사용하여 정의해요.

 

라인[8]~[10] 메서드는 클래스 내에서 정의되는 함수로, 객체가 수행할 수 있는 동작을 정의해요. 메서드는 ‘self’ 키워드를 첫 번째 매개변수로 받아야 하며, 객체의 속성에 접근하고 조작하는 데 사용돼요. 메서드는 필요에 따라 매개변수를 가질 수 있어요.

 

 

방금 설명드린 클래스 구조를 사용해서 'Dog'클래스를 정의해 볼게요.

1
2
3
4
5
6
7
8
9
10
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def bark(self):
        print(f'{self.name}가 짖고 있어요.')
 
    def sit(self):
        print(f'{self.name}가 앉아 있어요.')
cs

 

라인[1]  "Dog" 클래스를 정의하는 소스코드예요. "Dog" 클래스는 강아지 객체의 속성과 동작을 정의해요.

라인[2]~[4]

1. 생성자(__init__ 메서드):

▸ 객체가 생성될 때 호출되는 메서드입니다.

▸ name과 age 매개변수를 받아 객체의 name과 age 속성을 초기화합니다.

속성(변수) 설명:

     - name: 강아지의 이름을 나타내는 속성

     - age: 강아지의 나이를 나타내는 속성

 

라인[6]~[10]

2. 동작(메서드):

▸ bark 메서드:

    강아지가 짖는 동작을 나타내는 메서드입니다.

    {self.name}가 짖고 있어요.라는 메시지를 출력합니다.

▸ sit 메서드:

    강아지가 앉는 동작을 나타내는 메서드입니다.

    {self.name}가 앉아 있어요.라는 메시지를 출력합니다.

 

 

위 "Dog"클래스 주피터 노트북에서 정의하고 실행하면 아래와 같이 아무 일도 일어나지 않아요.  클래스를 정의하고 실행하는 경우에는 클래스를 정의한 셀에서는 아무런 결과가 나타나지 않아요. 클래스의 정의는 그 자체로는 실행되는 것이 아니라, 해당 클래스를 사용하여 객체를 생성하고 메서드를 호출하는 등의 동작을 통해 실제로 실행되기 때문이에요. 따라서 주피터 노트북에서 다음과 같이 클래스를 정의한 셀에서는 아무 결과가 나타나지 않을 수 있어요.

 

 

클래스(Class) 정의
클래스(Class) 정의

 

 

  ▶ 클래스 인스턴스화

 

다음 실습에서 클래스 인스턴스화를 통해 my_pet이란 객체를 생성하고 my_pet 객체의 속성과 메서드를 사용해 볼게요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def bark(self):
        print(f'{self.name}가 짖고 있어요.')
 
    def sit(self):
        print(f'{self.name}가 앉아 있어요.')
 
my_pet = Dog('루시'1)
 
print(f'내 애완견의 이름은 {my_pet.name} 입니다.')
print(f'내 애완견은 {my_pet.age}살 입니다.')
cs

*출력 결과*

내 애완견의 이름은 루시 입니다.
내 애완견은 1살 입니다.

 

라인[12] Dog 클래스를 사용하여 name 속성 '루시', age 속성 1로 루시라는 이름과 3살이라는 나이를 가지는 my_pet 객체가 생성되었어요. 해당 라인이 실행되면 Dog 클래스의 __init__ 생성자 메서드를 호출하여 인자를 전달해서 객체의 속성을 초기화시켜 줘요. 여기서는 '루시'와 1을 전달하여 __init__생성자 메서드에서 해당 속성을 초기화시켜 주었어요.

 

 

위 소스에 이어서 아래 소스를 수행시켜 보았어요.

 

1
2
my_pet.bark()
my_pet.sit()
cs

*출력 결과*

루시가 짖고 있어요.
루시가 앉아 있어요.

 

라인[1] my_pet 객체의 bark()메서드가 호출되어 수행되었어요.

라인[2] my_pet 객체의 sit()메서드가 호출되어 수행되었어요.

 

 

주피터 노트북에서 추가로 객체를 생성해서 실습을 진행해 보았어요. 확인해 보시고 어떤 객체가 생성되었는지 그리고 해당 객체로 어떤 메서드를 호출했는지 살펴보는 시간을 가져보시면 클래스를 이해하시는데 도움 되실 거예요.

클래스 실습
클래스 실습

 

 

 

  ▶ 클래스 기본 구조

해당 내용은 이미 클래스 개념 설명에서 언급한 내용이므로 다시 한번 확인하는 차원에서 아래 그림을 첨부하니 확인해 주세요.

클래스 기본 구조
클래스 기본 구조

 

 

  ▶ 클래스 상속

 

클래스 상속은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 기존에 정의된 클래스를 기반으로 새로운 클래스를 만드는 과정이에요.. 이를 통해 코드의 재사용성과 구조화를 향상할 수 있어요.

 

파이썬에서 클래스 상속은 다음과 같은 구조로 정의해요.

 

1
2
class ChildClass(ParentClass):
    # 추가적인 속성 및 메서드 정의
cs

 

위의 구조에서 ChildClass는 새로운 클래스의 이름을 나타내며, ParentClass는 상속받을 부모 클래스의 이름을 나타내요. ChildClass는 ParentClass의 모든 속성과 메서드를 상속받아 사용할 수 있어요.

상속을 통해 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 이용하면서, 필요한 경우에는 새로운 속성이나 메서드를 추가할 수 있어요. 자식 클래스는 부모 클래스의 모든 기능을 물려받아 확장하거나 수정할 수 있어요.

 

아래는 클래스 상속을 사용한 간단한 실습이에요::

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Animal:
    def __init__(self, name):
        self.name = name
 
    def sound(self):
        pass
 
class Dog(Animal):
    def sound(self):
        print("멍멍!")
 
class Cat(Animal):
    def sound(self):
        print("야옹!")
 
dog = Dog("멍멍이")
dog.sound()  # 출력: 멍멍!
 
cat = Cat("야옹이")
cat.sound()  # 출력: 야옹!
cs

 

라인[1]~[6] Animal 클래스는 동물 객체의 공통 속성을 정의해요.

라인[8]~[14] Dog 클래스와 Cat 클래스는 Animal 클래스를 상속받아서 sound 메서드를 각각 재정의하였어요. 이렇게 하면 Dog 클래스와 Cat 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받으면서, sound 메서드를 각각 개별적으로 구현할 수 있어요.

 

이와 같이 클래스 상속을 사용하면 코드의 재사용성을 높일 수 있으며, 유지보수와 확장성을 개선할 수 있어요. 부모 클래스의 기능을 활용하면서 필요한 기능을 추가하거나 수정할 수 있기 때문에, 객체 지향 프로그래밍의 핵심 개념 중 하나라고 할 수 있어요.

 

클래스 상속 실습
클래스 상속 실습

 

 

  ▶ 클래스 오버라이딩

 

메서드 오버라이딩(Method Overriding)클래스 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 과정을 말해요. 이를 통해 부모 클래스의 메서드를 자식 클래스에서 필요에 맞게 수정하거나 확장할 수 있어요.

 

파이썬에서 메서드 오버라이딩은 다음과 같은 구조로 작성돼요:

 

1
2
3
4
5
6
7
8
class ParentClass:
    def some_method(self):
        # 부모 클래스의 메서드 구현
 
class ChildClass(ParentClass):
    def some_method(self):
        # 자식 클래스에서 부모 클래스의 메서드를 재정의하여 구현
        # 추가적인 동작 수행
cs

 

라인[1]~[3] ParentClass는 부모 클래스를 나타내요.

라인[2]~[8]  ChildClass는 자식 클래스를 나타내요. ChildClass에서는 ParentClass의 some_method 메서드를 재정의하고 필요한 추가 동작을 수행해요.

 

아래는 메서드 오버라이딩을 사용한 간단한 실습이에요:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Animal:
    def sound(self):
        print("동물이 소리를 냅니다.")
 
class Dog(Animal):
    def sound(self):
        print("멍멍!")
 
class Cat(Animal):
    def sound(self):
        print("야옹!")
 
animal = Animal()
animal.sound()  # 출력: 동물이 소리를 냅니다.
 
dog = Dog()
dog.sound()  # 출력: 멍멍!
 
cat = Cat()
cat.sound()  # 출력: 야옹!
cs

 

라인[1]~[3] Animal 클래스는 sound 메서드를 정의하고 있어요.

라인[5]~[11] Dog 클래스와 Cat 클래스는 Animal 클래스를 상속받아 sound 메서드를 재정의하고 있어요. 이렇게 하면 Dog 클래스와 Cat 클래스는 Animal 클래스의 sound 메서드를 오버라이딩하고, 각각 개별적인 동물 소리를 출력하도록 구현할 수 있어요. 주목할 점은 ChildClass에서 오버라이딩된 메서드의 구현 내용은 부모 클래스의 메서드와 동일한 이름을 가져야 해요. 이를 통해 파이썬은 메서드 오버라이딩을 인식하고 자식 클래스에서 재정의된 메서드를 호출할 수 있어요.

 

메서드 오버라이딩 실습
메서드 오버라이딩 실습

 

님들 이번 시간은 객체 지향 프로그래밍의 개념인 클래스(Class)에 대해서 학습해 보았어요. 클래스, 상속, 메서드 오버라이딩까지 많은 부분을 학습했네요. 클래스, 상속, 메서드 오버라이딩과 같은 객체 지향 프로그래밍의 개념들은 처음 배우기에는 조금 복잡할 수 있어요. 그럼에도 불구하고 열심히 학습하고 이해하려고 노력하신 님들께 박수를 보내드려요. 지금까지의 학습이 여러분들의 파이썬 프로그래밍 기반을 튼튼히 다지는데 큰 도움이 되었을 거라고 믿어요. 앞으로도 제 강의 자주 찾아주시고 오늘도 너무 고생하였어요. 푹 쉬시고 다음에 뵐게요.

반응형