본문 바로가기

[python] 파이썬의 핵심, 객체와 클래스란? 실습을 통해 공부하자!

Derrick 발행일 : 2023-08-05
728x90
반응형

 

 # 학습 목표

 - 객체가 무엇인지 이해한다.

 - 클래스와 인스턴스 사이의 관계를 이해한다.

 - 객체지향 프로그래밍이 도입된 이유를 이해한다.

 

1. 객체지향 프로그래밍?

반복문, 함수, 모듈은 모두 효율적인 "코드"를 위한 것 (코드의 재사용 방지)이지만, 큰 프로젝트를 진행할 때는 코드가 턱없이 길어지게 되어서 프로그램이 객체와 객체의 상호작용으로 적용시키기 시작했다.
# 객체란?
: 성질(field, 변수)과 할 수 있는 행동(method, 함수)이 담긴 자료
→ 보통 성질을 변수, 행동은 함수로 표현되는데 이들을 하나로 합친 자료를 의미
→ 코드 내 변수와 함수를 한번에 관리하는 자료가 '객체'이다.

 

[ 객체란, 성질과 할 수 있는 행동이 담긴 자료 ]

 

2. 클래스(Class)

클래스란, "객체를 만들 수 있는 틀"
ex) 만약, '사람'이라는 클래스(Class)를 생성한다면 성질을 의미하는 '이름, 나이, 사는 곳, 취미 등'의 변수가 있고 행동을 의미하는 '밥 먹기, 운동하기, 잠자기, 취미활동하기 등'의 함수가 있어야 한다.

 

[ '사람'이라는 클래스 example ]

1) 클래스 생성

 → class 클래스 이름:

 

class Human:

2) 필드(Field)

필드란, 객체가 가지고 있는 '성질 = 변수'

 

# class에 name과 age라는 성질(=변수) 추가
class Human:
	name = "Bob"
	age = 20

3) 메서드(Method)

메서드란, 객체가 할 수 있는 '행동 = 함수' , 메서드는 짝꿍(=객체)이 있는 함수

 

class Human:
	def exercise(self):
    	print("스쿼트")
- 위에서 'Human'이라는 class 안에는 'exercise'라는 method가 생겼고, 이는 Human이 하는 행동이라는 의미
- 이처럼 객체 안에 함수를 정의하면, 객체가 할 수 있는 행동을 정의하게 되고 이를 메서드가 되는 원리
# self  (★★★)
 : 파이썬에서 메서드를 정의할때 가져야하는 첫번째 매개변수, 하나의 규칙인 셈.

 

반응형

3. 인스턴스(Instance)

인스턴스란, 객체를 만들 수 있는 틀(클래스)로 찍어낸 객체
→ 비유) 클래스 = 붕어빵 틀 / 인스턴스 = 팥 붕어빵, 슈크림 붕어빵 등 

 

[ 왼쪽 : 클래스(class) / 오른쪽 : 인스턴스(Instance) ]

 

# example
: 위 왼쪽 사진처럼 '사람' 클래스를 통해 만든 객체(=instance)은 오른쪽 사진의 성질(ex, 성윤)과 행동(스파게티)을 가진다.

1) 인스턴스 만들기

인스턴스 이름 = 클래스 이름()
→ 변수 선언과 유사하다.

 

boddy = Human()

2) 인스턴스의 변수

" 인스턴스.변수 "

 

boddy = Human()

bobby.name					# Bob
bobby.age					# 10

## Human 클래스에서 정의한 name과 age가 bobby에 할당됨

3) 인스턴스의 메서드

" 인스턴스.메서드() "

 

bobby = Human()

bobby.exercise()				# 스쿼시!
## Human() 클래스에서 정의한 함수(메서드,exercise) 실행 가능

4) 클래스 & 인스턴스 예시

위에서 실행했던 예문들을 한번에 출력해보자

 

# Class Human 선언
class Human:
    name = ""
    age = 0
    
    def exercise(self):
    	return "운동!"

# instance bobby 선언
bobby = Human()
bobby.name = "Bob"
bobby.age = 10

print(bobby.name, bobby.age)				# Bob 10

 

3. 왜 객체지향 프로그래밍일까?

결론)
 - 상속, 다형성, 캡슐화를 통해 "코드의 재사용"이 쉽고 우리의 실생활을 잘 표현할 수 있다.
포켓몬을 예시로 클래스를 생성을 해보면서 객체지향 프로그래밍을 실습해보자
 - 포켓몬이 가져야할 성질(=Field)은? 
  → 이름, 체력, 타입 등
 - 포켓몬이 할 수 있는 능력(=Method)은?
  → 각 포켓몬의 기술

1) 객체지향 실습 (포켓몬-피카츄 생성)

 ① 포켓몬 클래스 생성 (클래스 선언, 변수 & 메서드 추가)

 

class Pokemon:
    p_name = ""						# 이름
    p_hp = 0						# 체력
    p_type = ""						# 유형
    def skill(self):					# 스킬
    	pass

 

 ② 피카츄 클래스 생성(포켓몬 클래스를 상속)

 

# 인자에 'Pokemon'을 넣어줌으로써 'Pokemon' 클래스에 상속하는 클래스 생성한다는 의미
class Picachu(Pokemon):
    p_name = "Picachu"
    p_hp = 50
    p_type = "Electric"
    def skill(self):
    	print("10만 볼트!")

 

 ③ 피카츄 인스턴스 생성

 

# Picachu 클래스로 찍어낸 pica 인스턴스 생성
# 인스턴스를 통해 여러 마리의 pica를 생성할 수도 있다.
pica = Picacu()

pica.skill()				# 10만 볼트!
print(pica.p_hp)			# 50

2) 객체지향의 특징1. '상속' 이란? 

상속이란, 한 클래스의 내용을 다른 클래스가 이어받는것을 의미한다.
→ 아래 간단한 코드 실습을 통해 '상속'을 이해해보자

 

# example 1)
# Car 클래스 생성
class Car:
	type = "자동차"

# 'Car' 클래스를 상속하는 Hyundai 클래스 선언
class Hyundai(Car):
	pass

# sonata 인스턴스 생성
sonata = Hyundai()

print(sonata.type)					# 자동차
Hyundai 클래스 안에 아무것도 지정하지 않았지만, Car 클래스 내 'type'이라는 field를 상속받은 것을 확인할 수 있다.

 

# example 2)
# Pet 클래스 생성
class Pet:
	attr = "cute"
	def cry(self):
		return "멍멍!"

# Pet 클래스를 상속하는 Dog 클래스 생성
class Dog(Pet):
	pass

maltese = Dog()
print(maltese.attr, maltese.cry())					# cute 멍멍!
Dog 클래스의 인스턴스인 maltese의 field와 method는 상속한 Pet 클래스의 내용임을 확인할 수 있다.

3) 객체지향의 특징2. 다형성

다형성이란, 같은 모양의 코드가 다른 역할을 하는 것을 의미한다.
→ 아래의 코드를 통해 학습해보자

 

# example 1)
# Car 클래스 생성
class Car:
	type = "자동차"
	horsePower = 100
    
# Lamborghini 클래스 생성(Car 상속)
# 같은 이름의 변수인 horsePower 선언
class Lamborghini(Car):
	horsePower = 700

# Lamborghini의 인스턴스 생성
aventador = Lamborghini()
print(aventador.type)					# 자동차
print(aventador.horsePower)				# 700

# Car의 인스턴스 생성
ford = Car()
print(ford.type)					# 자동차
print(ford.horsePower)					# 100
동일한 변수인 'horsePower'임에도 어떤 객체, 어떤 클래스인지에 따라서 값이 달라지게 된다. (다형성)

 

# Animal 클래스 생성
class Animal:
	legs = 0
	def walk(self):
		return ""

# Animal을 상속받는 Dog 클래스 생성
class Dog(Animal):
	legs = 4
	def walk(self):
		return "살랑살랑"

# Animal을 상속받는 Human 클래스 생성
class Human(Animal):
	legs = 2
	def walk(self):
		return "뚜벅뚜벅"
 
 maltese = Dog()
 gildong = Human()
 
 print(maltese.walk())					# 살랑살랑
 print(gildong.walk())					# 뚜벅뚜벅
위 결과를 통해, 인스턴드는 상속받은 클래스에 따라 출력값이 달라지는 것을 확인할 수 있다.
→ 이처럼 다형성을 이용하면 같은 이름으로 다른 역할을 하는 코드를 생성할 수 있다.

4) 파이썬은 객체를 어떻게 적용할까?

 

파이썬에서는 객체 단위로 정보를 관리한다. 
예를들어 123, 'abc', [1, 2, 3] 등은 모두 객체에 해당하며, 이들의 자료형인 int, str, list 등이 해당 자료의 클래스로 저장된다. 

 

nums = [1, 2, 3]

# nums의 값과 유형 출력
print(nums)					# [1, 2, 3]
print(type(nums))				# <class 'list'>

# List도 객체이므로, List의 method를 사용할 수 있다.
nums.append(4)					# nums 라는 객체에 '4'라는 값을 추가한다는 의미

 

4. 연습 문제 (해설 포함)

Q1) 붕어빵 클래스를 생성하고, 이로부터 팥, 슈크림 붕어빵을 생성하자. 메서드가 추가하시오
# Bbread(붕어빵) 클래스 생성
# 필드 taste를 생성하고, 각각 밀가루, 팥, 슈크림 대입
# 메서드 eat() 생성하고, taste, "맛있어요!" 출력

class Bbread:
	taste = "밀가루"
	def eat(self):
		print(self.taste, "맛있어요!")

# 클래스 Bbread의 인스턴스 redBean과 choux 생성
redBean = Bbread()
choux = Bbread()

# 객체 redBean의 필드 taste를 '팥'으로 변경
readBean.taste = "팥"

# 객체 choux의 필드 taste를 '슈크림'으로 변경
choux.taste = "슈크림"

# 객체 redBean, choux의 메서드 eat()를 실행
redBean.eat()						# 팥 맛있어요!
choux.eat()						# 슈크림 맛있어요!
# Tip!
한 객체의 메서드에서 그 객체의 필드를 참조할 대는 'self' 를 이용해서 참조해야 한다!
 ex) self.taste

 

 

댓글