📖 UNIT 34. 클래스 사용하기
📒클래스와 메서드
클래스란 객체를 표현하기 위한 문법이다.
객체란, 특정한 개념이나 모양으로 존재하는 것을 객체라고 한다. 그리고 클래스를 이용하여 객체를 만든다.
데이터를 클래스의 속성, 기능을 메서드라고 한다.
코딩도자에 있는 그림이다. 참고해서 이해를 해보자.
먼저 클래스와 메서드를 만들어보자.
class Person:
def greeting(self): print('Hello')
그래서 이렇게 사용할 수 있겠다.
James = Person()
James.greeting()
이렇게 사용할 수도 있다 !!
인스턴스와 객체는 같은 말이다.
📒클래스와 속성
class Person:
def __init__(self):
self.hello = 'Hello.'
def greeting(self):
print(self.hello)
james = Person()
james.greeting()
메서드에서와 비슷하게 코딩이 되었다. 물론 메서드도 정의는 되었다. 중요한 것은 self.hello라는 그냥 값을 설정해주었다는 것이다.
약간 c언어에서 struct가 연상된다.
그럼 왜 이런 클래스, 메서드, 속성을 이용하는 것일까
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) # 20
print('주소:', maria.address) # 서울시 서초구 반포동
코딩도장에서의 예시 코드이다. 그냥 보고 바로 이해가 될 수 있다.
maria라는 사람이 있으면, person 객체에 값을 넣어주면 된다. 이후 안녕하세요. 저는 마리아입니다.
이렇게 출력이 되고, 밑에서 마리아에 관한 개인정보가 출력될 것이다.
비공개 속성도 만들 수 있다. __xxxx 이렇게 선언이 되면 비공개 속성으로 사용이 되고,
바깥에서 건드리는 용도로 사용되는 기능이 아닐 때 비공개 속성으로 사용해주면 된다.
📖 UNIT 35. 클래스속성과 정적, 클래스 메서드 사용하기
📒클래스 속성과 인스턴스 속성
지금까지 우리는 인스턴스 속성에 대해서 알아보았다. 이제 클래스 속성에 대하여 알아보자.
class Person:
bag = []
def put_bag(self, stuff):
self.bag.append(stuff)
이렇게 선언을 해주면 클래스 속성으로 사용이 되는것이다. 즉 그냥 바로 선언해주면 된다.
bag이라는 클래스 속성 리스트가 생겼고, 밑의 put_bag 메서드에서 bag에 넣어준다.
bag은 리스트라 append 메서드를 또 사용할 수 있다. 문제는 다음 코드에 있다.
james = Person()
james.put_bag('책')
maria = Person()
maria.put_bag('열쇠')
print(james.bag)
print(maria.bag)
이 코드를 실행해보자.
뭔가 이상하다. 분명히 제임스와 마리아의 가방에 넣은게 다른데 같이 들어가졌다.
그럼 그렇지 ㅉㅉ. self.bag이라고 지칭을 하는 순간 개념이 좀 모호해지는 경향이 있다.
이를 해결하기 위해 코드를 바꾸도록 하자.
class Person:
def __init__(self):
self.bag = []
def put_bag(self, stuff):
Person.bag.append(stuff)
이렇게 해주면 인스턴스로 만들어져 서로 독립적이게 된다.
📒동적 메서드 만들기
정적메서드도 만들 수 있다. 주의할 점은 정적메서드는 속성에는 접근할 수 없으므로, 이런 정보를 사용하지 않을 때 사용해주면 좋다.
class Calc:
@staticmethod
def add(a, b):
print(a + b)
@staticmethod
def mul(a, b):
print(a * b)
Calc.add(10, 20)
Calc.mul(10, 20)
이것도 코딩도장의 예시이다. @staticmethod 를 사용해주면 정적태그로 선언해줄 수 있다.
아직까지는 왜 이렇게 사용해야하는 지 모르겠다. ㅎㅎ
📒클래스 메서드 만들기
클래스 메서드는 @classmethod를 붙이면 된다.
class 클래스이름:
@classmethod
def 메서드(cls, 매개변수1, 매개변수2):
코드
이렇게 해주면 클래스 메서드를 사용할 수 있다. 아아아아아 메서드를 사용할 때는 항상 저렇게 표시해줘야 하는구낭
📖 UNIT 36. 상속
먼저 사람 클래스로 학생 클래스를 만들어보자.
class Person:
def greeting(self):
print('Hello')
사람 클래스는 이렇게 만들어 볼 수 있겠다.
여기서 학생 클래스는 Person 클래스 밑에 들어가야 한다.
class Student(Person):
def study(self):
print('Study')
이렇게 표현해주면 된다.
그럼 james = Student()라고 해주어도, Person()의 메서드도 가져간다.
하지만 me=Person() 이렇게 표현하게 되면 Student 클래스의 메서드는 사용하지 못한다. 조심하자.
속성의 경우에는 좀 더 작업이 필요하다.
class Person:
def __init__(self):
print('Person __init__ is gone')
self.hello = 'Hello'
class Student(Person):
def __init__(self):
print('Student __init__ is gone')
self.school = 'Study'
james = Student()
print(james.school)
print(james.hello)
이 코드가 있다. 현재 james.hello를 출력함으로써 상위 클래스인 Person의 속성을 갈 수 있는지 확인해본다.
하지만 안된다. 이럴 때는 super()를 사용해주면 된다. self.hello는 Person.__init__ 메서드 안에 있다.
그러므로 super().__init__() 이 코드를 Student 메서드 안에 넣어주면 된다. 그럼 자신의 상위 클래스의 __init__() 메서드 내의 속성을 읽어온다.
만약에 파생 클래스의 __init__이 생략되어 있다면 자동으로 상위 클래스의 __init__을 불러오므로 자동으로 문제해결이 된다.
📒메서드 오버라이딩
이번엔 파생 클래스에서 기반 클래스의 메서드를 오버라이딩 해보자.
class Person:
def greeting(self):
print('안녕하세요.')
class Student(Person):
def greeting(self):
print('안녕하세요. 저는 파이썬 코딩 도장 학생입니다.')
james = Student()
james.greeting()
그냥 이렇게 되어있다면 Person의 greetin 메서드를 무시하고 Student의 greeting 메서드를 사용하게 된다.
근데 좀 비효율적이라고 할 수 있다. 그러므로 Person에서 안녕하세요를, Student에서 파이썬 코딩도장 학생입니다. 를 출력하게 해보자.
class Person:
def greeting(self):
print('안녕하세요.')
class Student(Person):
def greeting(self):
super().greeting()
print('저는 파이썬 코딩 도장 학생입니다.')
james = Student()
james.greeting()
이렇게 된다면 super()를 이용하여 Person의 greeting을 한 번 출력해주고, 다시 파이썬 코딩 도장 학생임을 출력해준다.
그럼 중복을 없애줄 수 있다. 근데 시간이 효율적으로 작동할 지는 모르겠당
📖 UNIT 37. 두 점 사이 거리 구하기
클래스를 이용하여 두 점 사이의 거리를 구해보자. 먼저 2차원 좌표의 점을 받는다고 생각해보자.
import math
class Location:
def __init__(self, x, y):
self.x = x
self.y = y
p1 = Location(33, 54)
p2 = Location(30, 50)
이 코드를 통해 점을 Location에 넣어줄 수 있다. 이제 거리계산을 해야한다.
첫 번째로, 거리는 절댓값을 적용해야 한다. 두 번째로, 루트는 math의 sqrt를 이용하여 구할 수 있다.
import math
class Location:
def __init__(self, x, y):
self.x = x
self.y = y
p1 = Location(33, 54)
p2 = Location(30, 50)
d1 = abs(p2.x - p1.x)
d2 = abs(p2.y - p1.y)
res = math.sqrt(d1**2 + d2**2)
print(res)
완성했다.
2주치 과제가 끝났다. 더 달려보자.
'스터디 그룹 > ProjectH4C' 카테고리의 다른 글
ProjectH4C 1개월 3,4주 과제 (코드업 11~20) (0) | 2021.02.03 |
---|---|
ProjectH4C 1개월 3,4주 과제 (코드업 1~10) (0) | 2021.02.02 |
ProjectH4C 1개월 2주차 과제 (UNIT 32, 33) (0) | 2021.01.31 |
ProjectH4C 1개월 2주차 과제 (UNIT 29,30,31) 여기도 스택프레임이. (0) | 2021.01.31 |
ProjectH4C 1개월 2주차 과제 (UNIT 27, 28) (0) | 2021.01.29 |