공부중
[Python] 객체 지향 프로그래밍(object-oriented programming) 본문
728x90
1. 프로그래밍 패러다임 (Programming paradigm)
프로그램을 작성하는 방향과 구조를 정하는 방법
파이썬은 절차적 프로그래밍(procedural programming)과 객체 지향 프로그래밍(object-oriented programming)을 지원함
절차적 프로그래밍(procedural programming) | 객체 지향 프로그래밍(object-oriented programming) |
- goto 문을 주로 사용하던 비구조적 프로그래밍 방법을 개 선해서 구조화 프로그래밍을 지원 - 조건문, 반복문 등을 프로그래밍 언어에 포함시킴 - 함수 등을 이용해서 프로그램을 모듈화시킴 |
데이터와 코드를 객체로 함께 구성해서 한 개 자료형으로 취급 많은 객체 지향 언어들이 클래스(class)라는 이름으로 데 이터와 코드를 묶을 수 있는 기능을 제공함 |
# 단점 - 절차적 프로그래밍은 데이터와 동작(기능)이 분리됨 - 절차적 프로그래밍 방식은 재사용성도 떨어짐 |
2. 객체와 클래스
객체(object) 또는 인스턴스 | 클래스 |
프로그램이 실행될 때 클래스로부터 생성되는 실체 | 객체의 속성(변수)과 속성들을 사용하고 처리하 는 기능(함수 또는 메소드)를 포함하는 코드 |
클래스를 객체화(또는 인스턴스화) 하여 객체를 생성
3. 객체 지향 프로그래밍의 특성
추상화
캡슐화
재사용성
상속
다형성
- 추상화 (Abstraction):
- 추상화는 복잡한 현실 세계의 문제를 단순화시키는 프로세스입니다. 객체들이 공통적으로 가지고 있는 속성과 동작을 식별하여 모델을 만드는 과정을 말합니다. 이렇게 함으로써 프로그래머는 더 복잡한 로직이나 시스템 전체를 걱정하지 않고, 각 부분에 집중하여 문제를 해결할 수 있습니다.
- 캡슐화 (Encapsulation):
- 캡슐화는 객체의 데이터(속성)와 그 데이터를 조작할 수 있는 메소드를 하나의 단위로 묶는 것을 말합니다. 이 과정에서 중요한 데이터는 외부에서 직접 접근할 수 없도록 숨기는 것이 일반적입니다(은닉화). 이렇게 함으로써 데이터를 보호하고, 객체의 인터페이스만을 사용하여 데이터를 조작할 수 있도록 합니다.
- 상속 (Inheritance):
- 상속은 이미 존재하는 클래스의 속성과 메소드를 새로운 클래스가 받아오는 것을 말합니다. 상속을 통해 기존 코드를 재사용하여 새로운 클래스를 쉽게 만들 수 있으며, 기존 코드의 수정이 필요한 경우 상위 클래스만 수정하면 되므로 유지보수가 용이해집니다. 상속은 계층적 분류가 자연스럽게 가능하게 합니다.
- 다형성 (Polymorphism):
- 다형성은 같은 이름의 메소드가 다른 클래스에서 다른 동작을 할 수 있게 하는 특성을 말합니다. 오버로딩(Overloading)은 같은 이름의 메소드가 다른 매개변수를 가질 수 있도록 하는 것이고, 오버라이딩(Overriding)은 하위 클래스에서 상위 클래스의 메소드를 재정의하여 사용하는 것을 말합니다. 다형성은 소프트웨어의 유연성을 높여 줍니다.
- 재사용성 ( Reusability ):
- 클래스는 필요로 하는 모든 기능들을 포함시켜 독립적으 로 만들 수 있음
- . 클래스가 다른 클래스에 의존적이지 않으면, 재사용성이 높아짐
4. 클래스의 멤버 변수(속성)
- 생성자에서 초기화: 객체가 생성될 때 생성자(초기자)에서 멤버 변수를 초기화합니다. self 키워드를 사용하여 각 인스턴스의 고유한 데이터에 접근하고 값을 저장합니다.
- 개별 메모리 공간: 각 객체의 멤버 변수는 독립적인 메모리 공간에 저장되므로, 객체마다 값이 다를 수 있습니다.
- 외부 접근 방식: 객체의 멤버 변수에는 객체의 이름을 통해 접근할 수 있습니다 (객체_이름.변수_이름).
- 내부 접근 방식: 클래스 내부의 메소드에서는 self.변수_이름을 통해 해당 인스턴스의 멤버 변수에 접근할 수 있습니다.
- 접근 제어: Python에서는 변수 이름 앞에 언더스코어(_)를 추가함으로써 변수의 접근 범위를 제한할 수 있습니다:
- Private 변수: 언더스코어 두 개(__)를 앞에 붙여 클래스 내부에서만 접근 가능하게 합니다. 이러한 변수는 클래스 외부뿐만 아니라, 상속받은 자식 클래스에서도 직접적으로 접근할 수 없습니다
- Protected 변수: 언더스코어 한 개(_)를 앞에 붙여 클래스와 상속받은 자식 클래스에서 접근할 수 있습니다.
class Car:
def __init__(self, make, model):
self.make = make # 공개 멤버 변수
self.model = model # 공개 멤버 변수
self.__mileage = 0 # 비공개 멤버 변수 (private)
self._service_count = 0 # 보호된 멤버 변수 (protected)
def drive(self, miles):
self.__mileage += miles
print(f"Driving {miles} miles")
def service(self):
self._service_count += 1
print("Car serviced")
# 객체 생성
my_car = Car("Toyota", "Corolla")
# 멤버 변수 접근
print(my_car.make) # 접근 가능
print(my_car.model) # 접근 가능
# print(my_car.__mileage) # 에러 발생, 비공개 변수이므로 외부에서 접근할 수 없음
# print(my_car._service_count) # 일반적으로 접근 가능하지만, 보호된 변수로 취급
# 메소드 호출
my_car.drive(100)
my_car.service()
5. 생성자(constructor) 또는 초기자(initializer)
__init(self, 매개_변수_리스트)__
6. 상속과 다형성 구현
상속(Inheritance)
상속은 하나의 클래스가 다른 클래스의 속성과 메소드를 물려받는 기능을 말합니다. 이를 통해 기존 코드를 재사용하고 확장할 수 있습니다.
다형성(Polymorphism)
다형성은 서로 다른 클래스의 객체가 동일한 메소드 호출에 대해 각각 다른 방식으로 반응할 수 있게 해줍니다. 이는 메소드 오버라이딩(overriding)을 통해 구현할 수 있습니다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError("Subclasses must implement this method")
class Dog(Animal):
def speak(self):
return "Woof!"
class Cat(Animal):
def speak(self):
return "Meow!"
class Bird(Animal):
def __init__(self, name, can_fly):
super().__init__(name) # 부모 클래스의 생성자 호출
self.can_fly = can_fly
def speak(self):
return "Chirp!"
def fly(self):
return "Can fly" if self.can_fly else "Cannot fly"
# 객체 생성 및 사용
dog = Dog("Buddy")
cat = Cat("Whiskers")
bird = Bird("Tweety", True)
print(dog.speak()) # Woof!
print(cat.speak()) # Meow!
print(bird.speak()) # Chirp!
print(bird.fly()) # Can fly
728x90
'프로그래밍 > 파이썬 Python' 카테고리의 다른 글
[python] 모듈(Module) (0) | 2024.08.14 |
---|---|
[python] File(파일) (0) | 2024.08.12 |
[python]자료구조 (리스트, 튜플, Dictionary, Set) (0) | 2024.08.12 |
[Python] 함수 (0) | 2024.08.11 |
[Python] 조건문, 반복문 (0) | 2024.08.09 |