[Python] 클래스

Teon·2022년 9월 13일
0

매번 붕어빵 틀로 단팥이 들어간 붕어빵과 슈크림이 들어간 붕어빵을 만들며 클래스를 설명해 주시던 대학교 2학년 때 교수님을 떠올리며 복습을 해봅니다. (아련)
왜 맨날 헷갈리니! 파이썬 클래스.. 이제는 잘 기억해 보자!

Ⅰ. 클래스 사용하기

1. 클래스와 메서드 만들기

class 클래스이름:
	def 메서드(self):
    	코드
        
#예시 클래스
class Person:
	def greeting(self):
    	print('Hello')

1) 클래스 사용하기

클래스에 ()(괄호)를 붙인 뒤 변수에 할당한다.

  • 인스턴스 = 클래스()
james = Person()

클래스는 특정 개념을 표현할 뿐,
사용하기 위해선 인스턴스를 꼭 생성해야 한다.

2) 메서드 호출하기

메서드는 인스턴스를 통해 호출한다.

  • 인스턴스.메서드()
james.greeting() #Hello

위와 같이 인스턴스를 통해 호출되는 메서드를 인스턴스 메서드라고 한다.

3) 메서드 안에서 메서드 호출하기

self.메서드() 형식으로 호출한다.
self없이 메서드 이름만 사용하면 클래스 바깥쪽에 있는 함수를 호출한다는 뜻이 된다.

Class Person:
	def greeting(self):
    	print('Hello')
       
    def hello(self):
    	self.greeting()
        
james = Person()
james.hello()

2. 속성 사용하기

속성을 만들 때는 __init__ 메서드 안에 self.속성에 값을 할당한다.

class 클래스이름:
	def __init__(self):
    	self.속성 =

사용예시

class Person:
    def __init__(self):
        self.hello = '안녕하세요.'

    def greeting(self):
        print(self.hello)

james = Person()
james.greeting() #안녕하세요.
  • __init__ 메서드는 james=Person() 처럼 클래스에 괄호를 붙여서 인스턴스를 만들 때 호출되며 인스턴스를 초기화하는 특별한 메서드이다.
  • self는 인스턴스 자기 자신을 의미한다.

1) 인스턴스 만들 때 값 받기

class 클래스이름:
	def __init__(self, 매개변수1, 매개변수2):
    	self.속성1 = 매개변수1
        self.속성2 = 매개변수2

사용 예시

class Person:
    def __init__(self, name, age, address):
        self.hello = '안녕하세요.'
        self.name = name
        self.age = age
        self.address = address

    def greeting(self):
        print('{0} 저는 {1}입니다.'.format(self.hello, self.name))
        
maria = Person('마리아', 20, '서울시 서초구 반포동')
maria.greeting() #안녕하세요 저는 마리아입니다.

print('이름:', maria.name)
print('나이:', maria.age)
print('주소:', maria.address)
  • Person의 괄호 안에 넣은 값은 __init__ 메서드에서 self뒤에 있는 매개 변수에 차례대로 들어간다.
  • 클래스 안에서 속성에 접근할 때는 self.속성
  • 클래스 바깥에서 속성에 접근할 때는 인스턴스.속성
  • 인스턴스를 통해 접근하는 속성을 인스턴스 속성이라 한다.

2) 클래스의 위치 인수와 키워드 인수

클래스로 인스턴스를 만들 때 위치 인수와 키워드 인수를 사용할 수 있다.

① 위치 인수와 리스트 언패킹 사용법

  • *args 를 사용
  • 매개변수 갖고 올 때는 args[0]처럼 사용
Class Person:
	def __init__(self, *args):
    	self.name = args[0]
        self.age = args[1]
        self.address = args[2]

maria = Person(*['마리아',20,'서울시 서초구 반포동'])

② 키워드 인수와 딕셔너리 언패킹 사용법

  • **kwargs 사용
  • 매개변수 갖고 올 때는 kwargs['name']처럼 사용
class Person:
	def __init__(self, **kwargs): #키워드인수
    	self.name = kwargs['name']
        self.age = kwargs['age']
        self.address = kwargs['address']
        
maria1 = Person(name='마리아', age=20, address='서울시 서초구 반포동')
maria2 = Person(**{'name': '마리아', 'age':20, 'address':'서울시 서초구 반포동'})

Ⅱ. 클래스 속성과 인스턴스 속성

1. 클래스 속성과 인스턴스 속성

속성에는 클래스 속성와 인스턴스 속성 2가지 종류가 있다.
__init__ 메서드에서 만들었던 속성은 인스턴스 속성이다.

1) 클래스 속성 사용하기

클래스 속성은 클래스에 바로 속성을 만들면 된다.

def 클래스 이름:
	속성 =

사용예시

class Person:
    bag = []

    def put_bag(self, stuff):
        self.bag.append(stuff)

james = Person()
james.put_bag('책')

maria = Person()
maria.put_bag('열쇠')

print(james.bag) #['책','열쇠']
print(maria.bag) #['책','열쇠']

클래스 속성은 클래스에 속해 있으며 모든 인스턴스에서 공유한다.

class Person:
	bag = []
    
    def put_bag(self, stuff):
    	Person.bag.append(stuff) #클래스 이름으로 클래스 속성 접근

print(Person.bag) #클래스 바깥에서도 클래스 이름으로 클래스 속성에 접근
  • 위처럼 클래스 속성에 접근할 때에는 현재 인스턴스를 뜻하는 self가 아닌 클래스 이름으로 접근하면 코드가 명확해지기 때문에 클래스 속성에 접근할 때는 클래스 이름을 사용한다.

클래스 속성과 인스턴스 속성 차이점 정리

  • 클래스 속성: 모든 인스턴스가 공유. 인스턴스 전체가 사용해야 하는 값을 저장할 때 사용.
  • 인스턴스 속성: 인스턴스별로 독립되어 있음. 각 인스턴스가 값을 따로저장해야 할 때 사용.

Ⅲ. 클래스 상속 사용하기

1. 사람 클래스로 학생 클래스 만들기

class 기반클래스이름:
	코드

class 파생클래스이름(기반클래스이름):
	코드

사용예시

class Person:
    def greeting(self):
        print('안녕하세요.')

class Student(Person):
    def study(self):
        print('공부하기')

james = Student()
james.greeting() #안녕하세요: 기반 클래스 Person의 메서드 호출
james.study() #공부하기: 파생 클래스 Student에 추가한 study 메서드
  • Student 클래스를 만들 때 class Student(Person):과 같이 괄호 안에 기반 크랠스인 Person 클래스를 넣으면, Person 클래스의 기능을 물려받은 Student 클래스가 된다.
  • Student 클래스에는 greeting 메서드가 없지만 Person 클래스를 상속받았으므로 greeting 메서드를 호출 할 수 있다.

2. 상속 관계와 포함 관계

1) 상속 관계

class Person:
	def greeting(self):
    	print('안녕하세요.')

class Student(Person):
	def study(self):
    	print('공부하기')
  • 상속은 명확하게 같은 종류이며 동등한 관계일 때 사용한다.
  • 상속 관계를 is-a관계라고도 부른다.

2) 포함 관계

class Person:
	def greeting(self):
    	print('안녕하세요.')

class PersonList():
	def __init__(self):
    	self.person_list = [] #리스트 속성에 Person인스턴스를 넣어서 관리

	def append_person(self, person): #리스트 속성에 Person인스턴스를 추가하는 함수
    	self.person_list.append(person)
  • 위 코드는 상속을 사용하지 않고 속성에 인스턴스를 넣어서 관리하므로 PersonList가 Person을 포함하고 있다.
  • 이런 관계를 포함관계라고 하며 영어로 has-a 관계라고도 부른다.

3. 기반(부모) 클래스의 속성 사용하기

class Person:
    def __init__(self):
        print('Person __init__')
        self.hello = '안녕하세요'

class Student(Person):
    def __init__(self):
        print('Student __init__')
        super().__init__() #super()로 기반 클래스의 __init__ 메서드를 호출한다.
        self.school = '파이썬 코딩 도장'

james = Student()
print(james.school)
print(james.hello)
  • 자식 클래스에서 부모 클래스의 __init__메서드를 호출하고 싶을 때는 super().메서드() 를 사용한다.
  • 만약, 자식 클래스에서 __init__ 메서드가 없다면, 부모 클래스의 __init__이 자동으로 호출되기 때문에 super()는 생략될 수 있다.

4. 메서드 오버라이딩 사용하기

✔ 오버라이딩(overriding)
오버라이딩은 무시하다, 우선하다는 뜻을 가지고 있으며 기반 클래스의 메서드를 무시하고 새로운 메서드를 만든다는 의미이다.

class Person:
    def greeting(self):
        print('안녕하세요')

class Student(Person):
    def greeting(self):
        print('안녕하세요. 저는 파이썬 코딩 도장 학생입니다.')

james = Student()
james.greeting() #안녕하세요. 저는 파이썬 코딩 도장 학생입니다.

오버라이딩 잘 사용하기

class Person:
    def greeting(self):
        print('안녕하세요')

class Student(Person):
    def greeting(self):
        super().greeting()
        print('저는 파이썬 코딩 도장 학생입니다.')

james = Student()
james.greeting()

기반 클래스의 메서드를 재활용하여 중복되는 문구를 줄일 수 있다. (super() 사용)

5. 다중 상속 사용하기

다중 상속은 여러 기반 클래스로부터 상속을 받아서 파생 클래스를 만드는 방법이다.

class 기반클래스이름1:
	코드

class 기반클래스이름2:
	코드
    
class 파생클래스이름(기반클래스이름1, 기반클래스이름2):

사용예시

class Person:
    def greeting(self):
        print('안녕하세요')

class University:
    def manage_credit(self):
        print('학점 관리')

class Undergraduate(Person, University):
    def study(self):
        print('공부하기')

james = Undergraduate()
james.greeting() #안녕하세요 : 기반 클래스 Person의 메서드 호출
james.manage_credit() #학점 관리: 기반 클래스 University의 메서드 호출
james.study() #공부하기: 파생 클래스 Undergraduate에 추가한 study 메서드

⨳ 참고
파이썬 코딩 도장 UNIT34~36

profile
웹 개발자를 향하여

0개의 댓글