당신은 멋쟁이, 우리는 장고쟁이~

0%

Python 기초 19편 - 파이썬 클래스 선언

Python 클래스 정의


객체 지향 프로그래밍에서 클래스와 객체들은 주요 특징입니다

*객체지향 프로그래밍의 꽃 이라고 할수 있습니다 *


하나의 클래스는 새로운 데이터 타입과 객체들을,

클래스안에 정의된 것들을 따르는 클래스의 인스턴스들로 생성합니다.

새로 생성된 클래스의 인스턴스는, 클래스에 정의되어 있는 속성들을 가지고 있습니다.


클래스안에 있는 문장들은 함수 정의, 데이터, 혹은 다른 기능을 하는 문장이 될수 있습니다.


어떠한 클래스가 정의되었을때, 클래스 내부는 하나의 새로운 namespace(이름공간) 이고, 이는 local scope 로 사용됩니다.


클래스 생성하기


클래스를 생성하는 방법은 간단합니다. class 키워드를 사용하여 정의하고, 클래스 내부의 문장들은 들여스기 해서 생성됩니다. 예를들면,


1
2
3
4
5
6
# 클래스 생성하기 

class Student:
student_class = '1'
student_number = 108801
student_name = 'Djangojeng-e'

위의 예시에서 생성된 클래스는 Student 라는 이름을 가지고, 클래스 내부에 3개의 변수들을 가지고 있습니다.

student_class, student_number 그리고 student_name 입니다.


클래스 객체들


클래스 객체들은 두가지 종류의 동작을 지원합니다.


  1. attribute references (속성 참조)
  2. instantiation (인스턴스화)

속성 참조는, 표준 문법을 사용합니다. 예를들면, objects.name 형태의 문법을 사용하여, object 라는 객체의 name 속성에 접근할수 있습니다.


예시를 들면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 클래스에서 attribute reference (속성 참조)

class Student:
name = "Djangojeng-e"
student_class = '1반'
student_number = 306108801

# Student.name 을 사용하여, Student 객체의 name 속성을 접근합니다
print(Student.name)


# Student.student_class 를 사용하여, Student 객체의 student_class 속성을 접근합니다
print(Student.student_class)

# Student.student_number 를 사용하여, student_number 속성을 접근합니다
print(Student.student_number)

__init__ 메서드


파이썬에서는, 특별하게 중요한 파이썬 메서드들이 존재합니다. 클래스는, __init__ 이라고 불리는 특별한 메서드를 정의할수 있습니다.


__init__ 메서드는,

초기화 작업을 해주고, 클래스를 위한 생성자로써 동작 합니다.

다른 함수 혹은 메서드와 비슷하게도, __init__ 도 몇가지 갯수의 인자들을 받을수 있습니다


__init__ 메서드는, 클래스의 객체가 인스턴스화 되자마자 실행되고, 클래스의 인스턴스화는 자동으로 __init__() 을 새롭게 생성되는 클래스 인스턴스를 위해 실행합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 클래스 인스턴스화 그리고 __init__ 메서드 

# Student 라는 클래스를 정의

class Student:
def __init__(self, name, student_class, student_number):
self.name = name
self.student_class = student_class
self.student_number = student_number

s = Student('Djangojeng-e', '1반', 306108801) # Student 클래스의 인스턴스를 생성

# Student 클래스의 인스턴스인 s 가 실행되자 마자,
# def __init__ 이 실행되어, name, student_class, student_number 값들을 자동으로 할당합니다

# 따라서, 아래와 같이, 인스턴스 생성후에, 해당 인스턴스 속성값으로, 할당된 값들에 접근할수 있습니다

# s.name 을 사용하여, name 에 접근
print(s.name)

# s.student_class 를 사용하여, student_class 접근
print(s.student_class)

# s.student_number 를 사용하여, student_number 를 접근
print(s.student_number)

inheritance (상속)


상속의 개념은, 객체지향 프로그래밍에서 코드의 재사용성에 중요한 영향을 미칩니다.


상속은, 새로운 클래스를 생성할때, 기존에 존재하고 있는 클래스를 기반으로 생성할수 있게 해줍니다.

기존에 존재하고 있는 클래스를 상속받는 새로운 클래스는, 기존 클래스의 모든 속성과 메서드들을 상속 받습니다.


다른 객체 지향 프로그래밍 언어들과 비슷하게도, 파이썬은 부모 클래스와 다른 다수의 클래스들을 상속받는것을 허용합니다. 다중 상속의 개념으로, 단일 상속과 다중 상속의 문법 예시는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 단일상속, 다중상속 

class BaseClass:
base_class = "기본 클래스"

class OtherClass:
other_class = '다른 클래스'

# 단일 클래스 상속
class SingleInheritance(BaseClass):
pass

single = SingleInhertiance # 단일 클래스 상속 인스턴스 생성
print(single.base_class) # BaseClass 에 있는 변수값을 접근할수 있습니다

# 다수의 클래스를 상속받는 클래스를 생성 (다중상속)

class MultipleInheritance(BaseClass, OtherClass):
pass

multiple = MultipleInheritance # 다중상속 클래스 생성

print(multiple.base_class) # BaseClass 의 base_class 값을 출력합니다
print(multiple.other_class) # OtherClass 의 other_class 값을 출력합니다

클래스 예시


  1. 공장에서, 생산직원과 사무직원들은 모두 공통된 속성들을 가지고 있습니다.

    • 모든 직원들은 - name, designation, age 같은 정보들을 가지고 있습니다

    • 회사직원 (CompanyStaff) 라고 부를수 있는 클래스를 하나 생성할수 있습니다

      CompanyStaff 클래스를 생성해 줍니다.

  2. 이런 공통된 사항들을 떠나서, 생산직과 사무직은 다른 수당 구조를 가지고 있습니다

    • FactoryStaff(생산사원) 은 야근 혹은 추가 근무 수당을 받고

    • OfficeStaff (사무직)은 출장비 수당을 받을수 있습니다

      FactoryStaff 클래스와 OfficeStaff 클래스를 생성해 줍니다.

  3. FactoryStaff 클래스와 OfficeStaff 클래스는, ComapnyStaff 클래스를 상속받을수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 클래스 예시 

class CompanyStaff:
def __init__(self, name, designation, age):
self.name = name
self.designation = designation
self.age = age

def detail(self):
print(f'Name : {self.name} \n Designation : {self.designation} \n Age : {self.age}')


class FactoryStaff(CompanyStaff):
def __init__(self, name, designation, age, overtime_allowance):
CompanyStaff.__init__(self, name, designation, age)
self.overtime_allow = overtime_allowance
CompanyStaff.detail(self)
print('추가 근무 수당 : ', self.overtime_allow)


class OfficeStaff(CompanyStaff):
def __init__(self, name, designation, age, travel_allowance):
CompanyStaff.__init__(self, name, designation, age)
self.travel_allow = travel_allowance
CompanyStaff.detail(self)
print('출장근무 수당 : ', self.travel_allow)

위와 같이 생성된 클래스를 테스트 해봅니다.


1
2
3
4
5
# 생산직원 인스턴스 생성 
FactoryStaff('주호영', '전기공', 39, 20000)

# 사무직원 인스턴스 생성
OfficeStaff('이성경', '마케팅', 30, 50000)