파이썬의 객체 지향 프로그래밍(OOP) 개념
파이썬은 대표적인 객체 지향 프로그래밍(Object-Oriented Programming, OOP) 언어입니다. 클래스와 객체를 손쉽게 만들고 활용할 수 있어 코드의 재사용성과 유지보수성이 뛰어나며, 복잡한 프로그램도 체계적으로 구조화할 수 있습니다.
파이썬 객체 지향 프로그래밍의 핵심 개념은 다음과 같습니다.
- 객체(Object)
- 클래스(Class)
- 메서드(Method)
- 상속(Inheritance)
- 다형성(Polymorphism)
- 데이터 추상화(Data Abstraction)
- 캡슐화(Encapsulation)
1. 객체(Object)
객체는 상태(state)와 동작(behavior)을 함께 가진 실체입니다. 실제 세계의 마우스, 키보드, 의자, 책상처럼 물리적으로 존재하는 것일 수도 있고, 논리적인 개념일 수도 있습니다.
파이썬에서는 숫자, 문자열, 함수까지 모든 것이 객체이며, 거의 모든 객체는 속성(attribute)과 메서드(method)를 가집니다.
2. 클래스(Class)
클래스는 객체를 만들기 위한 설계도 또는 틀이라고 할 수 있습니다. 특정 속성과 메서드를 가진 객체들의 집합을 정의하는 논리적인 단위입니다.
예를 들어 '학생(Student)' 클래스가 있다면, 이메일 주소, 이름, 나이, 학번 같은 속성과 출석하기, 성적 조회하기 같은 메서드를 포함하게 됩니다.
class Student:
def __init__(self, name, age):
self.name = name # 속성
self.age = age
def introduce(self): # 메서드
print(f"안녕하세요, 저는 {self.name}이고 {self.age}살입니다.")
s1 = Student("홍길동", 20)
s1.introduce() # 안녕하세요, 저는 홍길동이고 20살입니다.3. 메서드(Method)
메서드는 특정 객체에 연결된 함수를 의미합니다. 파이썬에서 메서드는 클래스 인스턴스에만 국한되지 않으며, 리스트의 append(), 문자열의 upper()처럼 어떤 객체 타입이든 자신만의 메서드를 가질 수 있습니다.
4. 상속(Inheritance)
상속은 하나의 객체가 부모 객체의 모든 속성과 동작을 물려받는 개념입니다. 상속을 활용하면 기존 클래스를 거의 수정하지 않고도 새로운 클래스를 정의할 수 있습니다.
이때 새로 정의한 클래스를 자식 클래스(파생 클래스), 물려주는 원래 클래스를 부모 클래스(기반 클래스)라고 부릅니다. 상속의 가장 큰 장점은 코드의 재사용성을 높여준다는 점입니다.
class Animal: # 부모 클래스
def eat(self):
print("먹이를 먹습니다.")
class Dog(Animal): # 자식 클래스
def bark(self):
print("멍멍!")
d = Dog()
d.eat() # 부모 클래스의 메서드 사용 가능
d.bark()5. 다형성(Polymorphism)
다형성은 하나의 작업을 여러 가지 방식으로 수행할 수 있는 성질을 말합니다.
예를 들어 '동물(Animal)' 클래스에 모든 동물이 "말한다"는 동작이 있다고 가정해 봅시다. 하지만 강아지는 "멍멍", 고양이는 "야옹"처럼 실제 소리는 동물마다 다릅니다. 즉, 추상적인 '동물' 자체는 말하지 않지만, 각각의 구체적인 동물이 "말하기" 동작을 서로 다르게 구현하는 것이 다형성입니다.
6. 캡슐화(Encapsulation)
캡슐화는 메서드와 변수에 대한 접근을 제한하여 외부에서 함부로 수정하지 못하도록 보호하는 개념입니다. 관련된 코드와 데이터를 하나의 단위로 묶어 관리함으로써, 데이터가 실수로 변경되거나 손상되는 것을 방지할 수 있습니다.
파이썬에서는 변수 이름 앞에 밑줄 두 개(__변수명)를 붙여 private 속성으로 만들 수 있습니다.
7. 데이터 추상화(Data Abstraction)
데이터 추상화와 캡슐화는 밀접한 관련이 있으며, 사실 데이터 추상화는 캡슐화를 통해 구현됩니다.
추상화는 내부의 복잡한 구현 세부사항은 숨기고, 필요한 기능만 외부에 노출하는 것을 의미합니다. 무언가를 추상화한다는 것은 이름을 붙이는 행위이기도 한데, 그 이름이 해당 함수나 프로그램 전체가 하는 일의 핵심 아이디어를 담아내도록 하는 것입니다.
예를 들어 자동차를 운전할 때 엔진 내부의 복잡한 작동 원리를 몰라도 핸들과 페달만 조작하면 되는 것과 같습니다. 사용자에게는 '기능'만 보여주고 '구현'은 감추는 것이 추상화의 핵심입니다.