본문 바로가기
IT/Python

파이썬 객체지향 프로그래밍-02. 클래스 입문

by 무녈 2021. 6. 20.

자료의 출처는 엘리스 AI 트랙(https://aitrack.elice.io/) '도레미 파이썬'  이며, 학습 후 정리한 내용입니다.

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


프로그래밍 세상의 설계도, 클래스 입문

클래스

클래스란?

나타내고자 하는 개념의 설계도

페이스북 게시물

저장해야 하는 데이터 할 수 있는 조작(행동)
작성자 리액션 (좋아요, 슬퍼요, ...)
내용 댓글 달기
작성한 날짜/ 시간 내용 수정하기
이미지 (없을 수도 있음) 공유하기
링크 (없을 수도 있음) 사진 추가하기

어떤 데이터를 저장하고, 어떤 행동을 할 수 있는지 정의하기 위해 클래스가 필요함.

클래스와 인스턴스

클래스 인스턴스
어떤 데이터가 있는지 그 클래스로 만든
어떤 조작을 할 수 있는지 실제 예시
어떤 제약조건들이 있는지  
명시한 추상적인 설계도  
게시물 클래스 게시물 인스턴스
게시물 하나에 최대 20장의 사진 elice의 7월 17일 게시물
좋아요, 슬퍼요, 최고에요 최XX님의 1월 3일 게시물
댓글을 달 수 있음 리X왕 김X뷰의 7월 2일 게시물
작성자가 공유 여부를 설정 가능  

클래스 선언

class Post:
	author = None									# 담기는 데이터: 속성(attribue)
    comments = []
    likes = 0
    content = "What are you doing?"

# 속성(attribue): class 내에 담기는 데이터

class Post:
	...
    def like(self, user):			# 메소드(method): 어떤 액션들을 할 수 있는지 정의하는 것
    	self.likes += 1
        user.liked_posts.append(self)

# 메소드(method): clss 내 어떤 액션을 할 수 있는 지 정의

클래스 하나씩 따라하기

생성자

모든 클래스의 가장 기본이 되는 메소드

인스턴스가 처음 만들어질 때 어떻게 세팅할 것인지 결정

" __init__"    # "__XX__" 유형의 메소드는 중요한 것으로,  파이썬에서 기본적으로 제공하는 메소드

생성자 정의  시 self 매개변수 필요

모든 메소드는 self로 시작해야 한다.

class Post:
	def __init__(self, author, content):
    	self.author = author
        self.content = content
        
        
# Post(author = "Elice", content = "~") -> 내가 사용하는 이름
# 하지만 위 코드는 페이스북 설계한 사람이 보아야하는 코드임

생성자의 매개변수 vs. 클래스의 속성

# 생성자: 특이한 method의 일종

계좌개설 신청서 (고객용) 계좌개설 확인서 (내부용)
이름 김코딩 고객명 김코딩
추천직원 엘리스 추천직원번호 2435
   
생성자의 매개변수
(인스턴스 생성 시 입력)
클래스의 속성
(실제로 데이터가 저장되는 이름)

self

클래스 내부의 속성/ 메소드에 접근할 때 반드시 사용

 

바깥 쪽에서 클래스 내부 메소드에 접근할 때는 Post.author 방식으로 접근

클래스 내부에서 나의 속성과 메소드에 접근할 때는 self를 사용(Post와 동일하다 봐도 됨)

모든 메소드들은 가장 첫번째 매개변수로 self를 반드시 가져야 함.

실제로 사용할 때는 self 사용 x -> Post(____, _____)

class Post:
	def __init__(self, author, content):
    	self.author = author
        self.content = content
        
        
# self: 클래스 내부의 속성/메소드에 접근할 때

생성자

class Post:
	def __init__(self, author, content):
    	self.author = author
        self.content = content
        
my_post = Post("elice", "I love coding!")
# my_post라는 변수는 Post라는 클래스 이름을 설정하고, 각각의 인자를 넣어 줄것이다.
# 두 개의 인자는 각각의 매개변수에 매칭이 될 것이다.
# 새로 생긴 Post 인스턴스에 author 속성에는 "elice"이, content 속성에는 "I love coding!"이 들어감.

속성과 메소드

속성을 만들 때 주의할 점

class Post:
	def __init__(self, author, content):
    	self.likes = 0
        self.liked_uers = []
        
# 같은 내용을 나타내는 속성이 2개
class Post:
	def __init__(self, author, content):
    	...
        
my_post = Post("elice", "I love coding!")
my_post.likes += 1 	#my_post.liked_users = []
# 좋아요 개수는 올라갔는데 좋아요 한 사람이 없음 -> 모순 발생

 

하나의 개념을 나타내는 속성은 하나이어야 한다.

메소드 만들기

중복된 속성을 만들지 않고, 필요한 경우 메소드를 통해 해결

class Post:
	def liks(self, user):
    	self.liked_users.append(user) 	#liked_users: 속성, append: 메소드

# 나는 좋아요 개수만 알고 싶어 -> 새로운 메소드 작성
class Post:
	def num_likes(self):
    	return len(self.liked_users)

# 메소드를 속성처럼 사용

클래스 다듬기

원하지 않는 값 배제하기

class Post:
	def __init__(self, author, content):
    	...
        
my_post = Post("elice", 1457) # 문자 대신 숫자를 받게됨
my_post.like(["Hello", "World"]) #user대신 리스트가 들어간 잘못된 값
class User:
	def __init__(self, year_of_birth):
    	if type(year_of_birth) is not int:
        	return 		# return 값 X
            
# 잘못된 값이 들어오면 return을 통해 끝낼 수 있다.
class Post:
	def __init__(self, author, content):
    	if not isinstance(author, User):   #isinstance: author가 User의 인스턴스이니?
        	return
        if type(content) is not str:  # type을 비교할 때는 "==" 이 아닌 "is"를 사용한다.
        	return
class User:
	def __init__(self, year_of_birth):
    	if year_of_birth > 2005:
        	raise Exception("Too young")
            
# Error vs. Exception 
# Exception은 내가 일부러 발생한 error
# Error: 진짜 잘못된 경우
반응형

댓글