[Python] 클래스 class 연습문제

미남잉·2021년 10월 20일
0

저는 초보자를 위한 파이썬 300제라는 온라인 교재📕로 학습하고 정리합니다. 문제 출처를 미리 밝힙니다.

초보자를 위한 웅앵웅이래서 쉬운 줄 알았더니... 착각은 자유.


251 ~ 260

251 클래스, 객체, 인스턴스

클래스, 객체, 인스턴스에 대해 설명해봅시다.

  • 클래스는 객체의 구조와 행동을 결정합니다. 복잡하거나 반복되는 문제를 다루기 쉽게 도와줍니다.
  • 클래스로 만들었고 각 객체들은 고유한 성격을 가진다. 동일한 클래스로 만든 객체는 서로 영향을 주지 않는다.
  • 인스턴스는 어떤 클래스 A의 객체 a가 있을 때, a는 클래스 A의 인스턴스이다. 라고 말할 때 사용된다. 즉, a가 어떤 클래스인지 관계 위주로 설명할 때 사용한다.

정답👏

이건 사실 풀이는 없는데 책을 통한 비유를 적어도 될 것 같고, 개념 정리를 찾아보아도 좋을 것 같습니다


252 클래스 정의

비어있는 사람 (Human) 클래스를 "정의" 해보세요.

class Human:
	pass

정답👏


253 인스턴스 생성

사람 (Human) 클래스의 인스턴스를 "생성" 하고 이를 areum 변수로 바인딩해보세요.

class Human:
	pass

areum = Human()

정답👏


254 클래스 생성자-1

사람 (Human) 클래스에 "응애응애"를 출력하는 생성자를 추가하세요.

>>> areum = Human()
응애응애
class Human:
	print("응애응애")

땡💢

class Human:
	def __init__(self):
    	print("응애응애")

정답👏

해당 오답의 경우, 클래스 안에서 출력하려면 메서드가 필요함을 알 수 있다.


255 클래스 생성자-2

사람 (Human) 클래스에 (이름, 나이, 성별)을 받는 생성자를 추가하세요.

>>> areum = Human("아름", 25, "여자")
class Human:
	def __init__(self, name, age, sex):
    		self.name = name
        	self.age = age
        	self.sex = sex

areum = Human("아름", 25, "여자")로 바로 부르려면 init 메서드가 필요함을 알 수 있다.

>>> areum = Human("아름", 25, "여자")
>>> print(areum.name)
아름

정답👏


256 인스턴스 속성에 접근

255에서 생성한 인스턴스의 이름, 나이, 성별을 출력하세요.

인스턴스 변수에 접근하여 값을 출력하면 됩니다.

이름: 조아름, 나이: 25, 성별: 여자

인스턴스 변수에 접근하여 값을 가져오는 예

>>> areum.age
25

문제가 좀 헷갈리게 되어 있는데, 위에서 만든 클래스를 가지고 이름, 나이, 성별을 입력하여 인스턴스 변수로 호출하라는 의미입니다.

>>> class Human:
	def __init__(self, name, age, sex):
    		self.name = name
        	self.age = age
        	self.sex = sex
>>> areum = Human('조아름', 25, '여자')
>>> areum.age
25

정답👏


257 클래스 메소드 - 1

사람 (Human) 클래스에서 이름, 나이, 성별을 출력하는 who() 메소드를 추가하세요.

>>> areum.who()
이름: 조아름, 나이: 25, 성별: 여자
>>> class Human:
	def __init__(self, name, age, sex):
    		self.name = name
        	self.age = age
        	self.sex = sex
            
	def who(self):
    		print("이름: {}, 나이: {}, 성별: {}".format(self.name, self.age, self.sex))

정답👏


258 클래스 메소드 - 2

사람 (Human) 클래스에 (이름, 나이, 성별)을 받는 setInfo 메소드를 추가하세요.

땡💢

>>> areum = Human("모름", 0, "모름")
>>> areum.setInfo("아름", 25, "여자")
>>> class Human:
	def __init__(self, name, age, sex):
    		self.name = name
        	self.age = age
        	self.sex = sex
            
	def who(self):
    		print("이름: {}, 나이: {}, 성별: {}".format(self.name, self.age, self.sex))
            
	def setInfo(self):
   	        self.name = name
        	self.age = age
        	self.sex = sex
            
>>> areum = Human("모름", 0, "모름")
>>> areum.name
모름
>>> areum.setInfo("아름", 25, "여자")
>>> areum.name
아름

그런데 왜 setInfo의 메서드를 추가했을까요? init 생성자가 있지만, 정보를 잘못 입력했을 경우 다시 입력해주는 메서드입니다.

객체를 생성할 때 이름을 몰라서 '모름'이라고 했다가, 나중에 이름을 알아서 넣어줄 때 setInfo 메서드를 이용하면 됩니다.


259 클래스 소멸자

사람 (human) 클래스에 "나의 죽음을 알리지 말라"를 출력하는 소멸자를 추가하세요.

>>> areum = Human("아름", 25, "여자")
>>> del areum
나의 죽음을 알리지 말라

땡💢 틀렸음. 소멸자라 그래서 뭐지? 했는데 안 배운 개념이었다.

객체가 생성될 때 자동으로 init이라는 생성자 메서드가 호출되는 것처럼

객체가 메모리에서 소멸될 때 자동으로 호출되는 메소드가 있는데 이를 소멸자라고 부른다고 합니다.

class Human:
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __del__(self):
        print("나의 죽음을 알리지마라")

    def who(self):
        print("이름: {} 나이: {} 성별: {}".format(self.name, self.age, self.sex))

    def setInfo(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

areum = Human("아름", 25, "여자")
del(areum)

소멸자는

def __del__(self):

이런식으로 사용하는 것 같습니다.

사용은 불러온 객체를 삭제하는

del(areum)

해당 방법이 있습니다.


260 에러의 원인

아래와 같은 에러가 발생한 원인에 대해 설명하세요.

class OMG : 
    def print() :
        print("Oh my god")

myStock = OMG()
myStock.print()

TypeError Traceback (most recent call last)
<ipython-input-233-c85c04535b22> in <module>()
----> myStock.print()

TypeError: print() takes 0 positional arguments but 1 was given

내가 생각한 답: 매개변수가 1개도 설정되어 있지 않아서

class OMG : 
    def print() :
        print("Oh my god")

myStock = OMG()		
myStock.print()		# OMG.print(mystock)

위의 코드를 실행하면 실제로 호출하는 값은 'OMG.print(myStock)'입니다. 하지만 print 메서드 안에는 인자가 없기 때문에 error가 발생합니다.

그렇다면 위의 코드를 고쳐준다면 어떻게 고쳐줘야 할까요?

class OMG : 
    def print(self) :
        print("Oh my god")

myStock = OMG()		
myStock.print()		# OMG.print(mystock)

print() 라는 메서드 안에 self를 넣어주면 됩니다!

profile
Tistory로 이사갔어요

0개의 댓글