객체지향

On a regular basis·2021년 11월 8일
0

객체지향

1. 클래스와 인스턴스

class(클래스) : 간단하게 말하면 '부류', 객체들의 공통점을 추려낸 것.
object(객체) : 실제 세계에 존재하는 실체(instance)를 객체(object)

ex1. '사과'는 클래스, '내가 지난밤에 먹은 사과 다섯 개 중 두 번째 것'은 인스턴스, 객체.

class Singer:	# 가수를 정의
	def sing(self):	# 노래하기 메서드 (클래스 내부에 정의된 함수를 메서드라고 함)
    	return "LALALA"

taeji = Singer()	# Singer()라는 클래스를 taeji라는 객체에 넣기
taeji.sing()		# 객체.sing (메서드는 이렇게 객체.메서드)

>> "LALALA"

sing이라는 메서드는 Singer라는 클래스가 하는 행동을 정의함. Singer 클래스를 만든 다음, taeji라는 객체를 만듦. 인스턴스 = 클래스()

ricky = Singer()
ricky.sing()
>> "LALALA"

ricky라는 객체에 Singer라는 클래스를 담고, 그 객체.메서드를 하면 똑같이 LALALA를 반환.

2. 변수와 메서드

실제 세계에 존재하는 실체(instance) -> 객체(object)
객체들의 공통점을 간추려서 개념적으로 나타낸 것 -> 클래스(class)

class Amazon:
	strength = 20
    dextretiy = 25
    vitality = 20
    energy = 15
    
    def attack(self):
    	return "WOW"

Amazon 클래스가 갖고 있는 힘, 기술, 체력, 에너지라는 네가지 성질은 변수로 나타냄. attack이라는 행동은 메서드로 나타냄.

import diablo2
jane = diablo2.Amazon()
mary = diablo2.Amazon()

jane과 mary는 Amazon클래스의 객체. Amazon으로서 필요한 자질 4가지를 모두 갖추고 있음.

jane.strength
>> 20
jane.attack()
>> "WOW"

이렇게 객체(jane)는 클래스에서 정의해준 변수(strength, energy..)와 메서드(attack)를 그대로 갖게됨. 근데 메서드를 정의할 떄와 사용(호출)할 때는 차이가 있음. Amazon클래스에서 메서드를 정의할 때는 def attack(self):라는 self 인자를 받았는데 jane 객체의 메서드를 호출할 때는 그냥 attack()이라고 함. 이부분 진짜 헷갈림 ㅠㅠ

self

self라는 건 바로 그 클래스의 객체를 가리킴. jane과 mary가 똑같은 attack 메서드를 가지기 때문에 서로 구별하기 위해 사용한거고 메서드를 정의할 때는 항상 self라는 인자를 써준다고 생각하면 됨.

def exercise(self):
	self.strength += 2
    self.dexterity += 3
    self.vitality += 1

이 메서드는 훈련을 하면 힘, 기술, 체력이 올라간는걸 표현한 것.

import diablo2
eunhye = diablo2.Amazon() # eunhye라는 객체에 넣어줌
eunhye.exercise() # 메서드 호출 (self 안써줌 - 메서드 호출)
eunhye.strength
>> 22

이렇게 +2가 되어 힘이 22가 됨.

3. 상속

객체지향 프로그래밍의 핵심적인 개념 가운데 하나인 상속. 상속이란 어떤 클래스가 다른 클래스의 성질을 물려받는 것. 어떤 클래스를 만들 때 첨부터 다 새로 만들 필요 없이, 핵심적인 성질을 갖고 있는 다른 클래스로부터 상속 받는 것이 가능.

class Person:
	eyes = 2
    nose = 1
    mouth = 1
    ears = 2
    arms = 2
    legs = 2
    
    def eat(self):
    	print("뇸뇸")
        
    def sleep(self):
    	print("콜콜")
        
    def talk(self):
    	print("쪼잘쪼잘")

Person이라는 클래스는 보통사람을 나타낸 클래스. 눈, 코, 입, 팔다리 다 있고 먹고 자고 이야기 함.
이번에는 학생이라는 클래스를 만들기. 학생도 사람이니까 사람이 갖는 여러 성질이나 행동을 다 갖고 있을 거고 Person이라는 클래스를 상속해서 다시 눈코입팔다리 써주는 번거로움을 줄여주는 것.

class Student(Person): # Person이라는 클래스를 상속받은 것. 저기 괄호에 넣어주면 상속받았단 것!
	def study(self):
    	print("공부!")

그럼 진짜 Student클래스가 Person 클래스를 상속받았는지, 똑같은 성질을 갖고있는지 확인해봐야해.

park = Person() # 클래스를 객체에 넣어주고
park.mouth # 객체.변수
>> 1

park.talk() # 객체.메서드 (요건 메서드 호출이니까 self필요없고)
>> "쪼잘쪼잘"

lee = Student() # Student 클래스 객체에 넣어주고
lee.mouth # 객체.변수
>> 1

lee.talk()
>> "쪼잘쪼잘"

여기서 하나 더하여!

lee.study() # 객체.메서드()
>> "공부!"

4. 객체 속의 객체

객체 속의 객체를 코드로 짜보자. (코끼리를 냉장고에 넣는 방법^^)

class Fridge:
	def __init__(self):
    	self.isOpened = False
        self.foods = []
        
    def open(self):
    	self.isOpened = True
        print("냉장고 문열림")
        
    def put(self, thing):
    	if self.isOpened:
        	self.foods.append(thing)
            print("냉장고 속에 음식이 들어감")
        else:
        	print("냉장고 문 닫혀있어서 못넣음")
    
    def close(self):
    	self.isOPpened = False
        print("냉장고 문 닫음")
        
class Food:
	pass

isOpened라는 변수를 만들어주고, 냉장고 안에 들어있는 음식들의 리스트인 foods가 있음.
냉장고 문 열고, 음식 넣고, 문 닫는 메서드도 각각 있음.
Fridge, Food는 클래스.

import fridge
f = fridge.Fridge() # 냉장고 클래스의 객체로 f를 만들고
apple = fridge.Food() # 음식 클래스의 객체로 apple
elephant = fridge.Food() # 음식 클래스의 객체로 elephant 만들고
f.open() # 객체.메서드
>> "냉장고 문열림"
f.put(apple) # 객체.메서드(apple) -> thing이라는 파라미터안에 apple이 들어가는 것.
>> "냉장고 속에 음식이 들어감"
f.put(elephant)
>> "냉장고 속에 음식이 들어감"

그럼 냉장고 f의 foods리스트에 뭐가 들어있는지 보자.

f.foods
>>>[<fridge.Food instance at 007924AC>, <fridge.Food instance at 0079153C>]

냉장고 객체는 foods라는 리스트를 갖고 있음. foods리스트는 음식 클래스의 사과와 코끼리 객체를 갖고 있음.

5. 특별한 메서드들

메서드라는 건 클래스를 만들면서 그 안에 만들어 넣은 함수를 뜻함 def 뒤에 나오는 거.
만들어진 메서드를 사용하려면 객체.메서드()와 같은 형식으로 호출 해주었고.
이런 기본적인 메서드들 말고 쪼금 특별한 메서드를 알아보자.

init 메서드 (초기화)

class Book:
	def setData(self, title, price, author):
    	self.title = title
        self.price = price
        self.author = author
        
    def printData(self):
    	print("제목 :" , self.title)
        print("가격 :" , self.price)
        print("저자 :" , self.author)
        
    def __init__(self):
    	print("책 객체를 새로 만듦")

Book클래스, setData()와 printData() 메서드.
그리고 init 이라는 메서드. 초기화(initialize) 메서드라고도 함.
어떤 클래스의 객체가 만들어질 때 자동으로 호출돼서 그 객체가 갖게 될 여러가지 성질을 정해주는 일.

import bookstore
b = bookstore.Book() # 클래스를 b 객체에
>> "책 객체를 새로 만듦"

Book()클래스에서 객체를 만들자마자 초기화 메서드가 실행됨.

b.setData('우리가 빛의 속도로 갈 수 없다면', '15,000원', '김초엽')
b.printData()
>> 제목 : 우리가 빛의 속도로 갈 수 없다면
>> 가격 : 15,000원
>> 저자 : 김초엽
def __init__(self, title, price, author):
	self.setData(title, price, author)
    print("책 객체를 새로 만듦")

객체를 생성시킬 때 제목, 가격, 저자를 인자로 받아서 setData메서드에 넘겨줌.
초기화 메서드에서 직접 변수를 다뤄도 상관없지만 setData메서드를 미리 만들어뒀으니 이요해주면됨. 이제부터 책 객체를 만들 때는 다음과 같이 세개의 인자를 넘겨줘야함.

reload(bookstore)
b2 = bookstore.Book('농담', '20,000원', '밀란 쿤데라')
>> 책 객체를 새로 만듦

좀 더 익숙해질 필요가 있을듯 초기화 메서드. 개념은 쉬운데 왜 코드에서 보면 낯설까. 연습을 더 해봐야지 🤔

출처: https://wikidocs.net/

profile
개발 기록

0개의 댓글