기술면접

기술면접 - 객체지향 1

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

객체지향 프로그래밍(OOP)은 코드를 구조화하고 정리하는 방법 중 하나로, 언어 중에는 C, JAVA와 같은 언어들이 OOP의 원칙을 따르며, 파이썬은 객체지향을 지원하는 언어입니다. 객체지향 프로그래밍은 다양한 분야에서 활용 가능하며, 이는 우리가 이미 일상 생활에서 객체지향적으로 생각하는 방식과 관련이 있습니다.

 

 


예를 들어, 비디오 게임을 만든다고 가정해 봅시다. 게임에서 플레이어 객체는 필요한데, 모든 플레이어는 이름, 체력, 기술과 같은 속성을 공유합니다. 이러한 속성을 모든 플레이어 객체에 수동으로 할당하려면 노가다가 많이 필요하고, 실수할 가능성이 높습니다. 또한, 새로운 속성을 추가할 때 문제가 발생할 수 있습니다.

 

# 각 플레이어 객체를 개별적으로 정의
player1_name = "Necro"
player1_health = 88
player1_skill = "Bomb"

player2_name = "Alice"
player2_health = 100
player2_skill = "Fireball"

# 각 플레이어 정보 출력
print(f"Player 1 - Name: {player1_name}, Health: {player1_health}, Skill: {player1_skill}")
print(f"Player 2 - Name: {player2_name}, Health: {player2_health}, Skill: {player2_skill}")

# 플레이어 속성 변경
player1_health -= 10
player2_skill = "Ice Beam"

# 수정된 정보 출력
print(f"Player 1 - Name: {player1_name}, Health: {player1_health}, Skill: {player1_skill}")
print(f"Player 2 - Name: {player2_name}, Health: {player2_health}, Skill: {player2_skill}")

 

이 코드는 각 플레이어의 이름, 체력, 기술을 개별 변수로 정의하고, 정보를 출력하는 방식으로 플레이어 객체를 관리합니다. 하지만 이런 방식은 여러 플레이어를 다룰 때 노가다가 많이 필요하며, 실수할 가능성이 높아지며, 새로운 속성을 추가하거나 변경할 때에도 모든 변수를 수정해야 합니다. 이러한 점에서 객체지향 프로그래밍과 클래스를 사용하는 것이 효율적입니다.

 


이런 상황에서 클래스를 사용하면 해결할 수 있습니다. 클래스는 객체의 구조와 설계를 정의하는데 사용되며, 플레이어 객체를 생성하는 팩토리와 같은 역할을 수행합니다. 클래스를 사용하면 동일한 속성을 가지는 다른 데이터로부터 객체를 만들 때 효율적으로 사용할 수 있으며, 클래스는 객체의 설계도로 생각할 수 있습니다. 클래스를 사용하면 개별 플레이어 객체를 일일이 생성하는 수고를 덜 수 있습니다.

또한, 객체지향 프로그래밍에서 상속이 중요한 개념 중 하나입니다. 상속은 자식 클래스가 부모 클래스의 모든 속성을 상속받는 것을 의미하며, 코드 재사용과 구조화에 도움을 줍니다. 이런 이유로, 클래스는 객체를 위한 템플릿으로 생각할 수 있고, 상속을 통해 코드의 재사용성을 높일 수 있습니다.

 

파이썬 코드 예시로 객체지향 클래스의 장점을 나타내겠습니다.

class Player:
    def __init__(self, name, health, skill):
        self.name = name
        self.health = health
        self.skill = skill

    def introduce(self):
        print(f"Hi, I'm {self.name}. I have {self.health} health and my skill is {self.skill}.")

    def take_damage(self, damage):
        self.health -= damage

    def use_skill(self):
        print(f"{self.name} uses {self.skill} skill!")

# 플레이어 객체 생성
player1 = Player("Necro", 88, "Bomb")
player2 = Player("Alice", 100, "Fireball")

# 플레이어 속성 확인
player1.introduce()
player2.introduce()

# 플레이어가 공격 받음
player1.take_damage(10)

# 스킬 사용
player2.use_skill()

 

이 예제에서 Player 클래스를 정의했습니다. 각 플레이어 객체는 이름, 체력, 기술과 같은 속성을 가집니다. 이 클래스를 사용하면 플레이어 객체를 생성하고 속성을 쉽게 관리할 수 있으며, 장점은 다음과 같습니다:

  1. 코드의 재사용: 클래스를 사용하면 동일한 구조를 가진 여러 플레이어 객체를 쉽게 생성할 수 있습니다.
  2. 코드의 구조화: 클래스를 사용하면 플레이어와 관련된 메서드와 속성을 논리적으로 그룹화하여 코드를 보다 이해하기 쉽게 만들 수 있습니다.
  3. 상속과 다형성: 클래스를 상속하여 다른 타입의 플레이어를 만들거나 특정 메서드를 오버라이드할 수 있습니다.
  4. 코드 확장성: 새로운 속성이나 메서드를 추가하는 등의 변경을 쉽게 수행할 수 있습니다.


이러한 객체지향 프로그래밍의 장점을 통해 게임에서 플레이어 객체를 효과적으로 관리할 수 있습니다.