파이썬프로그래밍기초 10강 - 객체지향
객체지향 프로그래밍의 개념과 추상화·캡슐화·상속·다형성을 이해한다. 클래스와 인스턴스, 초기자와 self 매개변수, 객체 생성과 멤버 접근을 익히고 데이터 은닉 및 접근자·변경자를 Cone과 BMI 클래스에 적용한다.
제1장 객체지향 프로그래밍의 이해
1. 객체지향의 개념
객체지향 프로그래밍은 객체와 객체 사이의 상호작용으로 프로그램을 구성하는 프로그래밍 패러다임이다. 데이터와 그 데이터를 처리하는 연산을 하나의 객체로 묶어 현실 세계의 대상을 프로그램 안에 모델링한다. 프로그램을 유연하고 변경하기 쉽게 만들기 위해 대규모 소프트웨어 개발에서 널리 사용된다.
함수 중심 프로그램에서는 원뿔의 부피, 겉넓이, 원기둥 부피, 사각형 넓이처럼 기능별 함수가 늘어난다. 객체지향 방식은 원뿔의 반지름·높이와 그 값을 이용하는 계산 기능을 하나의 Cone 객체로 결합하여 관련 데이터와 기능의 소속을 명확히 한다.
2. 객체지향 패러다임의 네 특성
| 특성 | 의미 |
|---|---|
| 추상화 | 공통 속성이나 기능을 뽑아 핵심적인 모델로 표현 |
| 캡슐화 | 데이터 구조와 데이터를 다루는 연산을 하나로 결합 |
| 상속 | 상위 개념의 특징을 하위 개념에 전달하여 재사용 |
| 다형성 | 같은 조작이 객체의 종류에 따라 서로 다르게 동작 |
캡슐화의 핵심
객체는 상태를 나타내는 데이터 필드와 상태를 처리하는 메소드를 하나의 단위로 묶는다.
3. 객체와 클래스
객체는 추상화와 캡슐화의 결과이며 실제 세계 사물의 상태와 연산을 표현한 단위이다. 상태는 데이터 필드에, 연산은 메소드에 담긴다. 객체의 멤버인 데이터 필드와 메소드는 클래스에 의해 결정된다.
클래스는 같은 구조와 기능을 갖는 객체를 만들기 위한 설계도이다. 클래스가 어떤 데이터 필드와 메소드를 가질지 정의하면 그 설계에 따라 여러 객체를 생성할 수 있다.
제2장 클래스와 메소드 정의
1. 클래스 정의
파이썬 클래스는 class 키워드와 클래스 이름, 콜론으로 시작한다. 클래스에 포함되는 초기자와 메소드는 들여쓰기된 블록으로 정의한다.
class Cone:
def __init__(self, radius=20, height=30):
self.r = radius
self.h = height
클래스 이름은 관례적으로 각 단어의 첫 글자를 대문자로 쓰는 파스칼 표기법을 사용한다. Cone 클래스는 반지름과 높이를 데이터 필드로 갖는 원뿔 객체의 설계도이다.
2. 메소드와 초기자
메소드(method)는 객체에 대한 행동 또는 연산을 정의한 함수이다. 문법은 함수 정의와 비슷하지만 클래스 블록 안에 있으며 첫 번째 매개변수로 일반적으로 self를 사용한다.
__init__()는 객체가 생성될 때 상태를 초기화하는 특수 메소드이며 초기자(initializer)라고 한다. 이름의 앞뒤에 밑줄이 두 개씩 있다는 점에 주의한다.
class Cone:
def __init__(self, radius=20, height=30):
self.r = radius
self.h = height
def get_vol(self):
return 1 / 3 * 3.14 * self.r ** 2 * self.h
def get_surf(self):
sla = pow(self.r ** 2 + self.h ** 2, 0.5)
return 3.14 * self.r ** 2 + 3.14 * self.r * sla
3. self 매개변수
self는 메소드가 동작할 현재 객체 자신을 참조한다. 모든 인스턴스 메소드의 첫 번째 매개변수이며, 메소드를 호출할 때 사용자가 직접 전달하지 않는다. self.r과 self.h는 현재 객체에 속한 반지름과 높이를 뜻한다.
self.r과 r의 차이
r은 메소드 안의 지역 변수나 매개변수일 수 있지만 self.r은 객체에 저장된 데이터 필드이다. 객체의 상태를 지속해서 사용하려면 self를 통해 저장한다.
4. UML 클래스 다이어그램
UML 클래스 다이어그램은 클래스의 데이터 필드, 생성자, 메소드와 반환 타입을 표준화된 형태로 표현한다. Cone 클래스는 r:int, h:int 데이터 필드와 Cone(radius=20, height=30) 생성자, get_vol():float, get_surf():float 메소드로 나타낼 수 있다.
제3장 클래스 설계와 BMI 사례
1. 클래스 설계 절차
클래스를 설계할 때는 먼저 현실 대상에서 필요한 상태와 행동을 추상화한다. 상태는 데이터 필드로, 행동은 메소드로 정의한다. 생성 시 필요한 초기값과 각 메소드의 매개변수·반환값도 결정한다. UML 다이어그램을 사용하면 클래스 구조를 코드 작성 전에 검토할 수 있다.
2. BMI 클래스
BMI 계산 프로그램은 사람의 이름, 나이, 몸무게, 키를 상태로 갖는다. BMI 수치를 계산하는 메소드와 수치에 따른 상태를 반환하는 메소드를 포함할 수 있다.
class BMI:
def __init__(self, name, age, weight, height):
self.name = name
self.age = age
self.weight = weight
self.height = height
def get_BMI(self):
return self.weight / (self.height ** 2)
def get_status(self):
bmi = self.get_BMI()
if bmi >= 25:
return "비만"
elif bmi >= 18.5:
return "정상"
else:
return "저체중"
이 클래스는 개인 정보를 데이터 필드로 묶고 계산 과정을 메소드로 캡슐화한다. 강의의 핵심은 구체적인 분류 기준보다 데이터와 연산을 한 객체 안에 결합하는 설계 방식에 있다.
제4장 인스턴스 생성과 사용
1. 클래스와 인스턴스
클래스는 객체를 만들기 위한 설계도이고, 인스턴스는 그 클래스로부터 실제 메모리에 생성된 객체이다. 클래스의 생성자를 호출하면 새로운 객체가 생성되고 초기자가 실행된다.
unitcone = Cone(20, 30)
파이썬은 Cone 클래스에 해당하는 객체를 생성한 뒤 __init__()를 호출하여 반지름 20과 높이 30을 저장한다. 객체와 인스턴스는 흔히 같은 의미로 사용하며, 인스턴스는 특정 클래스와의 관계를 강조하는 표현이다.
2. 객체 생성 과정
객체 생성은 두 단계로 이해할 수 있다. 먼저 클래스에 해당하는 메모리 공간을 확보해 객체를 생성하고, 다음으로 __init__()를 호출하여 객체의 초기 상태를 설정한다. Cone(20, 30)에서 클래스 이름과 초기자의 매개변수를 이용해 생성자를 호출한다.
3. 멤버 접근 연산자
객체의 데이터 필드와 메소드에는 점(.) 연산자로 접근한다. 객체 참조변수와 멤버 이름을 점으로 연결한다.
unitcone = Cone(50, 100)
print(unitcone.r)
print(unitcone.get_vol())
print(unitcone.get_surf())
unitcone.r은 데이터 필드에 접근하고 unitcone.get_vol()은 메소드를 호출한다. 객체 참조변수는 메모리에 있는 객체를 가리키는 역할을 한다.
4. BMI 객체 활용
person = BMI("홍길동", 22, 70, 1.75)
print(person.get_BMI())
print(person.get_status())
각 BMI 인스턴스는 서로 다른 사람의 상태를 독립적으로 저장한다. 같은 클래스의 메소드를 공유하면서도 데이터 필드는 객체마다 다르다.
제5장 데이터 타입과 객체
1. 파이썬의 값은 객체
파이썬에서 정수와 문자열 같은 데이터도 객체이다. 변수는 객체 자체를 담는 상자라기보다 객체를 참조하는 이름으로 이해할 수 있다. number = 20은 number가 정수 객체 20을 참조하게 하고, symbol = "파이썬"은 문자열 객체를 참조하게 한다.
number = 20
symbol = "파이썬"
print(type(number), id(number))
print(type(symbol), id(symbol))
type()은 객체의 타입을, id()는 객체를 식별하는 값을 반환한다. 문자열 객체가 lower() 같은 메소드를 제공하듯 파이썬의 기본 데이터 타입도 상태와 동작을 가진 객체로 다룰 수 있다.
제6장 데이터 은닉과 접근자·변경자
1. 데이터 은닉
데이터 은닉(data hiding)은 객체의 데이터 필드를 외부에서 직접 변경하지 못하도록 제한하는 것이다. 사용자가 객체의 상태를 임의로 바꾸면 유효하지 않은 값이 저장되어 객체의 일관성이 깨질 수 있다. 공개 데이터 필드와 구분하여 클래스 내부에서만 접근하도록 설계한 필드를 private 데이터 필드라고 한다.
파이썬에서는 이름 앞에 밑줄 두 개를 붙여 private 성격을 나타낸다. 예를 들어 self.__r, self.__h처럼 정의한다. 강의록에서는 이를 클래스 내부에서만 접근 가능하고 외부에서는 직접 접근할 수 없는 형태로 설명한다.
2. 접근자와 변경자
private 데이터 필드에는 공개 메소드를 통해 접근한다. 접근자(accessor 또는 getter)는 필드 값을 반환하고, 변경자(mutator 또는 setter)는 검증을 거쳐 필드 값을 설정한다. 이를 사용하면 외부 코드가 저장구조에 직접 의존하지 않고 객체가 상태 변경 규칙을 통제할 수 있다.
class Cone:
def __init__(self, radius=20, height=30):
self.__r = radius
self.__h = height
def get_r(self):
return self.__r
def set_r(self, radius):
if radius > 0:
self.__r = radius
def get_h(self):
return self.__h
def set_h(self, height):
if height > 0:
self.__h = height
def get_vol(self):
return 1 / 3 * 3.14 * self.__r ** 2 * self.__h
def get_surf(self):
sla = pow(self.__r ** 2 + self.__h ** 2, 0.5)
return 3.14 * self.__r ** 2 + 3.14 * self.__r * sla
변경자가 양수만 허용하면 음수 반지름이나 높이가 객체에 저장되는 것을 막을 수 있다. 외부 코드는 unitcone.set_r(50)처럼 메소드를 사용한다.
| 구분 | 역할 | 예 |
|---|---|---|
| private 필드 | 객체 내부 상태를 직접 접근에서 보호 | self.__r |
| 접근자 | 필드의 현재 값을 반환 | get_r() |
| 변경자 | 검증 후 필드 값을 설정 | set_r(radius) |
3. BMI 클래스 개선
BMI 클래스도 이름, 나이, 몸무게, 키를 private 필드로 만들고 필요한 접근자와 변경자를 제공할 수 있다. 예를 들어 get_name()은 이름을 반환하고 몸무게·키 변경자는 양수 여부를 확인한 뒤 값을 저장한다. 이렇게 하면 BMI 계산에 필요한 상태를 객체가 스스로 안전하게 관리한다.
캡슐화와 데이터 은닉
데이터와 메소드를 묶는 것에서 더 나아가 내부 상태를 감추고 공개 메소드로만 접근하게 하면 객체가 자신의 유효성을 유지할 수 있다.
핵심 개념 정리
10강 핵심 요약
- 객체지향은 객체의 상태와 행동 및 객체 간 상호작용으로 프로그램을 구성한다.
- 객체지향의 주요 특성은 추상화, 캡슐화, 상속, 다형성이다.
- 클래스는 객체의 데이터 필드와 메소드를 정하는 설계도이고 인스턴스는 실제 생성된 객체이다.
__init__()는 객체 상태를 초기화하며self는 현재 객체를 참조한다.- 객체 생성 시 메모리를 확보한 뒤 초기자를 호출한다.
- 점 연산자로 객체의 데이터 필드에 접근하거나 메소드를 호출한다.
- 파이썬의 정수와 문자열도 객체이며 변수는 객체를 참조한다.
- private 필드는 내부 상태를 감추고 접근자와 변경자는 통제된 읽기·변경을 제공한다.
최종 정리
객체지향 프로그래밍은 관련 데이터와 연산을 클래스로 묶고, 그 설계로부터 독립적인 상태를 가진 객체를 생성하여 사용한다. self와 초기자, 멤버 접근, 데이터 은닉을 이해하면 현실의 대상을 안전하고 재사용 가능한 프로그램 구조로 모델링할 수 있다.
예상문제 20선
1. 객체지향 프로그래밍의 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
객체지향은 상태와 행동을 가진 객체 및 객체 사이의 상호작용으로 프로그램을 구성한다.
2. 데이터 구조와 이를 다루는 연산을 하나로 결합하는 특성은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
캡슐화는 관련 데이터와 그 데이터를 처리하는 기능을 객체 안에 묶는 특성이다.
3. 상위 개념의 특징을 하위 개념에 전달하는 특성은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
상속은 상위 클래스의 특징을 하위 클래스가 이어받아 재사용하게 한다.
4. 같은 조작이 객체 종류에 따라 다르게 동작하는 특성은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
다형성은 동일한 조작이나 인터페이스가 객체의 종류에 따라 서로 다른 동작을 하는 특성이다.
5. 클래스와 객체의 관계로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
클래스는 공통 구조와 기능을 정의하고 그 설계로 여러 인스턴스를 만들 수 있다.
6. 파이썬에서 클래스를 정의하는 키워드는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
class 키워드 뒤에 클래스 이름과 콜론을 작성하여 클래스 블록을 시작한다.
7. __init__() 메소드의 역할은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
초기자는 객체 생성 시 전달받은 값으로 데이터 필드를 초기화한다.
8. 인스턴스 메소드의 첫 번째 매개변수로 사용하는 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
self는 메소드가 동작하는 현재 객체 자신을 참조한다.
9. self.r = radius의 의미는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
self.r은 현재 인스턴스에 속한 데이터 필드이며 오른쪽 매개변수 값을 저장한다.
10. unitcone = Cone(20, 30)의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
클래스 이름을 호출하면 객체가 생성되고 초기자가 20과 30으로 상태를 설정한다.
11. 객체의 멤버에 접근하는 연산자는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
점 연산자는 객체 참조변수와 데이터 필드 또는 메소드 이름을 연결한다.
12. 메소드를 올바르게 호출한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
객체 참조변수 뒤에 점과 메소드 이름 및 괄호를 붙여 호출한다.
13. 파이썬의 정수와 문자열에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
파이썬에서는 정수와 문자열 등의 기본값도 타입과 메소드를 가진 객체로 다룬다.
14. 객체의 타입을 확인하는 함수는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
type 함수는 객체가 속한 데이터 타입 또는 클래스를 확인한다.
15. 데이터 은닉의 주된 목적은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
데이터 은닉은 객체의 내부 상태가 임의의 잘못된 값으로 바뀌는 것을 막는다.
16. 파이썬에서 private 성격의 필드로 표현한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
강의록은 이름 앞에 밑줄 두 개를 붙인 필드를 private 데이터 필드로 설명한다.
17. 접근자(accessor)의 역할은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
접근자 또는 getter는 외부에 공개된 메소드로 내부 필드 값을 읽게 한다.
18. 변경자(mutator)의 역할은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
변경자 또는 setter는 전달값을 확인한 뒤 객체의 내부 상태를 변경하도록 통제한다.
19. set_r()에서 radius가 양수인지 검사하는 이유는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
변경자는 객체의 상태가 유효한 범위를 유지하도록 값을 검증할 수 있다.
20. 객체지향 설계의 장점으로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
클래스는 관련 데이터와 연산을 응집된 단위로 구성하여 이해, 재사용, 변경을 돕는다.
댓글
댓글 쓰기