본문 바로가기
IT/Python

객체지향 프로그래밍-03. 클래스의 상속과 다형성

by 무녈 2021. 6. 20.

자료의 출처는 엘리스 AI 트랙(https://aitrack.elice.io/) '파이썬 객체지향 프로그래밍'  이며, 학습 후 정리한 내용입니다.

⚡️올바르지 않은 내용이 있을 경우 댓글로 남겨주시면 감사하겠습니다.⚡️


클래스 더 알아보기

클래스의 상속

왜 상속이 필요한가요?

여러 클래스가 비슷한 속성과 메소드를 공유해야 할 때

 

서로 다른 클래스 간의 계층 구조가 확실할 때

페이스북 게시물

게시물 글만 있는 게시물
사진을 포함한 게시물
동영상을 포함한 게시물
링크를 포함한 게시물

게시물

class Post:
	def __init__(self, content):	# 생성자
    	self.content = content

이미지가 있는 게시물

class ImagePost:
	def __init__(self, content, images):
    	self.content = content
        self.images = images
        
# 상속을 배우지 않는다면 이런식으로 정의를 할 것

상속을 하지 않을 경우 단점

  • 코딩시간
  • 실수할 확률이 높아짐
class ImagePost:
	def __init__(self, content, images):
		...
       
	def num_images(self):			# 중복된 내용의 속성을 정의하지 않는 메소드 - 이미지의 개수 메소드
    	return len(self.images)

# Post에는 없는 메소드 생성

클래스의 상속

부모   (부모의 속성, 메소드)  -> 자식 (부모+ 자식의 속성, 메소드)

# 자식은 기본적으로 부모의 모든 것을 상속받을 수 있고, 원하지 않으면 상속받지 않을 수 있다.

# 파이썬 에서만 부모의 속성을 모두 상속받을 수 있다.(자바의 경우, 부모에게도 결정권이 있음 - private)

청출어람의 법칙

부모 클래스보다 자식 클래스가 더 많은 데이터와 기능을 갖고 있다!

상속 따라하기1

클래스 선언

class ImagePost(Post):	#()안에 들어가 있다는 것이 차이 - (부모 class)
	...

생성자  

class ImagePost(Post):	
	def __init__(self, content, images):
    	super().__init__(content)	# super(): 파이썬의 기본 함수, 부모 클래스에 접근할 때 사용
        self.images = images

# 생성자는 이 클래스가 어떤 속성들을 가지는지 정리해주는 메소드이다

# 생성자가 잘못되면 나머지 메소드도 작동하지 않게 된다.

부모 인스턴스 동시 생성

class ImagePost(Post):	
	def __init__(self, content, images):
    	super().__init__(content)	
        self.images = images

자식을 생성하면 연결되는 부모 인스턴스도 생성됨.

속성 상속

class Post:
	def __init__(self, content):
    	self.content = content
        self.likers = []	# 생성 시점에는 빈 likers가 들어감.
class ImagePost(Post):	
	...
    
my_post = ImagePost(alice, "강남맛집")
print(my_post.likers) # []

메소드 상속

class Post:
	def like(self, user):
    	self.likers.append(user)	#likers: 속성 / append: 리스트이 메소드
class ImagePost(Post):	
	...
    
my_post = ImagePost(alice, "강남맛집")
my_post.like(bob)

상속 따라하기 2

좋아요, 슬퍼요

class Like:
	def __init__(self, post, user):
    	self.post = post
        self.user = user
class Sad:
	def __init__(self, post, user):
    	self.post = post
        self.user = user

추상적인 부모 클래스

class Reaction:
	def __init__(self, type, post, user):
    	self.type = type
        self.post = post	# Sad, Like class와 post, user 속성을 공유함
        self.user = user
class Like(Reaction):
	def __init__(self, post, user):
    	super().__init__("LIKE", post, user)
        
#내가받은(자식이) 매개변수 -> 부모 생성자의 인자로 사용
class Sad(Reaction):
	def __init__(self, post, user):
    	super().__init__("SAD", post, user)	#Like와 type이 정확히 다르다.
// 이렇게 쓰진 않는다!
reaction = Reaction("vasdjkl", post, me)	#버그

// 반드시 구체적인 자식 클래스로 쓴다.
like = Like(post, me)

오버라이딩

오버라이딩: 자식이 부모를 거역하는 것

클래스 설계 상황

모든 게시물에는 댓글을 달 수 있지만, 보호 설정을 한 게시물에는 예외저으로 댓글을 달 수 없다.

오버라이딩

class Post:
	def comment(self, user, content):
    	self.comments.append(Comment(user, content))
        
class ProtectedPost(Post):
	def comment(self, user, content):
    	print("Can't comment on protected posts.")
반응형

댓글