[python] 파이썬의 핵심, 객체와 클래스란? 실습을 통해 공부하자!
728x90
반응형
# 학습 목표
- 객체가 무엇인지 이해한다.
- 클래스와 인스턴스 사이의 관계를 이해한다.
- 객체지향 프로그래밍이 도입된 이유를 이해한다.
목차
1. 객체지향 프로그래밍?
반복문, 함수, 모듈은 모두 효율적인 "코드"를 위한 것 (코드의 재사용 방지)이지만, 큰 프로젝트를 진행할 때는 코드가 턱없이 길어지게 되어서 프로그램이 객체와 객체의 상호작용으로 적용시키기 시작했다.
# 객체란?
: 성질(field, 변수)과 할 수 있는 행동(method, 함수)이 담긴 자료
→ 보통 성질을 변수, 행동은 함수로 표현되는데 이들을 하나로 합친 자료를 의미
→ 코드 내 변수와 함수를 한번에 관리하는 자료가 '객체'이다.

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

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

# 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
'Data Analyst > Basic Python' 카테고리의 다른 글
Pandas 기초부터 실습까지! Series와 DataFrame 다루는 법! (0) | 2023.09.06 |
---|---|
[python] 데이터 분석의 기초! Numpy의 간단 총정리+실습! (0) | 2023.08.30 |
[python] 파이썬에서 꼭 알아야 할 모듈과 패키지의 사용법과 실습! (0) | 2023.08.02 |
[python] 함수와 메서드의 이론 학습과 연습 문제 (0) | 2023.08.01 |
[Python] 기초 자료형 정리 및 실습 (Tuple, List, Dictionary 등) (0) | 2023.07.31 |
댓글