공부중

[Python] 객체 지향 프로그래밍(object-oriented programming) 본문

프로그래밍/파이썬 Python

[Python] 객체 지향 프로그래밍(object-oriented programming)

복습 2024. 8. 13. 12:52
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