기술면접

기술면접 - 객체지향 2

데이터_박과장 2023. 10. 17. 18:53

객체지향 프로그래밍(OOP)은 다양한 속성과 개념을 포함하며, 그 중에서도 추상화, 상속, 다형성, 캡슐화는 주요 OOP 속성입니다. 이들을 간단한 설명과 파이썬 코드 예제를 통해 설명하겠습니다.

 



추상화 (Abstraction):
추상화는 복잡한 시스템이나 개체를 단순화하고 핵심 기능에만 집중하도록 도와주는 개념입니다. 추상화를 통해 세부 사항을 숨기고 중요한 기능에만 집중할 수 있습니다. 구축한 클래스와 세부함수를 외부 파이썬 파일로 빼고 라이브러리 import방식으로 배포하면 기능을 구현할 인터페이스는 제공하되 어떤 식으로 코딩이 되었는지는 알 수 없습니다.

파이썬 코드 예시:

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

# 추상화를 사용하여 도형의 면적을 계산
circle = Circle(5)
rectangle = Rectangle(4, 6)

print("Circle Area:", circle.area())
print("Rectangle Area:", rectangle.area())



상속 (Inheritance):


상속은 이미 존재하는 클래스의 속성과 메서드를 새 클래스에서 재사용할 수 있게 하는 개념입니다. 부모 클래스(슈퍼 클래스)의 특성을 자식 클래스(서브 클래스)에서 확장하거나 변경할 수 있습니다.

파이썬 코드 예시:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Meow!"

dog = Dog("Buddy")
cat = Cat("Whiskers")

print(dog.speak())  # "Buddy says Woof!"
print(cat.speak())  # "Whiskers says Meow!"



다형성 (Polymorphism):


다형성은 객체지향 프로그래밍에서 상속과 관련하여 발생하는 중요한 개념 중 하나로, 동일한 메서드 이름을 가진 다양한 클래스에서 서로 다른 동작을 수행할 수 있는 능력을 나타냅니다. 이를 통해 코드 재사용성을 증가시키고 유연성을 제공합니다.

다형성의 핵심 아이디어는 다음과 같습니다:

  • 메서드 이름 일치: 여러 클래스(부모 및 자식 클래스)는 동일한 메서드 이름을 사용합니다. 이 메서드를 가리키는 이름은 동일하며 메서드 시그니처(매개변수 및 반환 값)도 동일해야 합니다.
  • 서로 다른 구현: 각 클래스는 동일한 메서드 이름을 사용하더라도 해당 메서드를 다르게 구현할 수 있습니다. 이것이 다형성의 핵심입니다. 각 클래스는 자신만의 고유한 동작을 정의합니다.
  • 상속을 통한 활용: 다형성은 상속 관계에서 주로 활용됩니다. 자식 클래스는 부모 클래스로부터 메서드를 상속받고, 필요에 따라 메서드를 재정의(오버라이드)하여 자신만의 동작을 정의합니다.

파이썬 코드로 다형성을 더 자세히 설명하겠습니다. 아래는 다형성의 예시 코드입니다:

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

class Duck(Animal):
    def speak(self):
        return "Quack!"

# Animal 타입의 리스트에 다양한 동물 객체 저장
animals = [Dog(), Cat(), Duck()]

# 모든 동물들의 소리 출력
for animal in animals:
    print(animal.speak())

 

 

이 코드에서 Animal 클래스는 speak 메서드를 정의하고, 각 동물 클래스인 Dog, Cat, Duck는 이 메서드를 오버라이드하여 자신만의 소리를 반환합니다. 이렇게 서로 다른 클래스의 인스턴스가 동일한 메서드 이름을 사용하면서 각자의 동작을 수행하고, 이것이 다형성의 핵심 아이디어입니다.


위의 코드를 실행하면 각 동물이 자신만의 소리를 출력하며, 동일한 메서드를 호출함에도 불구하고 다양한 동작이 이루어지는 것을 볼 수 있습니다. 이것이 다형성의 강력한 특징 중 하나입니다.


캡슐화 (Encapsulation):


캡슐화는 객체의 상태와 행동을 하나의 단위로 묶어 외부에서 직접 접근하지 못하도록 제한하는 개념입니다. 이를 통해 객체의 내부 데이터를 보호하고 오용을 방지할 수 있습니다. __로 시작하는 변수는 외부에서 접근할 수 없습니다. 본 클래스를 외부 파일로 쓰고 import한다면 외부인은 해당 변수에 접근할 수 없고 별도의 함수 등을 통해서 변수에 대한 정보 제공여부를 결정할 수 있습니다.

파이썬 코드 예시:

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # __로 시작하는 변수는 비공개

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount

    def withdraw(self, amount):
        if amount > 0 and amount <= self.__balance:
            self.__balance -= amount
        else:
            print("Insufficient funds!")

    def get_balance(self):
        return self.__balance

account = BankAccount(1000)
account.deposit(500)
account.withdraw(200)
print("Balance:", account.get_balance())  # "Balance: 1300"



위의 코드 예제에서, 각 OOP 속성이 파이썬에서 어떻게 구현될 수 있는지 보여주었습니다. 추상화, 상속, 다형성 및 캡슐화는 객체지향 프로그래밍의 핵심 개념이며, 이들을 활용하여 코드를 더 효과적으로 관리하고 유지보수할 수 있습니다.