상세 컨텐츠

본문 제목

Object Oriented Programming 원칙 (1) - 추상화 (abstraction)

개발/python-객체지향프로그래밍(OOP)

by Matthew0633 2022. 5. 18. 23:09

본문

추상화 abstraction

불필요한 정보는 숨기고 중요한(필요한) 정보만을 표현함으로써 공통의 속성이나 행위(methods)를 하나로 묶어 이름을 붙이는 것이다.

실습을 통해 추상화를 알아보자.

siri, jarvis, bixby를 내가 프로그래밍 언어로 정의하고 싶다. 이들을 효율적으로 구현하고 싶은데, 무언가 공통의 속성과 기능을 정의할 수 있을 것 같고, 공통의 설계도를 만들 수 있을 것만 같다고 가정하자.

siri, jarvis, bixby 는 모두 로봇이니 로봇이라는 이름으로 설계도를 작성해보자. 이들은 공통적으로 이름과 제품코드의 속성을 가지고, 인사 기능과 소멸 기능이 있다고 하자. 우리는 아래와 같이 로봇의 설계도를 작성하고, 로봇에 대한 객체로서 siri, jarvis, bixby 를 효율적으로 정의할 수 있다.

class Robot:
    def __init__(self, name, code):
        self.name = name  
        self.code = code  

    def say_hi(self):
        print(f"Greetings, my masters call me {self.name}.")

    def die(self):
        print(f"{self.name} is being destroyed!")

siri = Robot("siri", 21039788127)
jarvis = Robot("jarvis", 2311213123)
bixby = Robot("bixby", 124312423)
bixby2 = Robot("bixby", 298312423)

이처럼, Robot, name, code, say_hi, die 와 같이 객체들의 공통적이고 중요한 속성과 기능을 각각 묶어서 이름을 붙이는 패턴이 바로 추상화이다. 추상화를 사용할 경우 객체를 생성하는 코드의 효율성이 증가한다

추상화와 class를 사용하지 않았을 때는 어떻게 코드를 작성해야하길래 코드의 효율성이 증가한다고 할 수 있을까?

추상화와 class를 사용하지 않고, 변수할당, list, dict, 함수만을 사용한 코드 예시를 확인해보면 확실하게 비교해볼 수 있다

from datetime import datetime

# * (1) 단순 변수할당 사용

robot_name_1 = "siri"
robot_code_1 = 912083902
robot_created_at_1 = datetime(2012, 4, 3)
robot_is_ok_1 = True
robot_skill_grade_1 = {
    "trans": 98,
    "cal": 48,
    "learn": 88,
}

robot_name_2 = "bixby"
robot_code_2 = 12348979128
robot_created_at_2 = datetime(2032, 6, 4)
robot_is_ok_2 = False
robot_skill_grade_2 = {
    "trans": 45,
    "cal": 32,
    "learn": 22,
}

robot_name_3 = "jarvis"
robot_code_3 = 234792387
robot_created_at_3 = datetime(2012, 6, 3)
robot_is_ok_3 = True
robot_skill_grade_3 = {
    "trans": 21,
    "cal": 19,
    "learn": 90,
}
from datetime import datetime

# * (2) list 자료구조 사용
robot_name = ["siri", "bixby", "jarvis", ]
robot_code = [912083902, 12348979128, 2347923874]
robot_created_at = [
    datetime(2012, 4, 3),
    datetime(2032, 6, 4),
    datetime(2012, 6, 3),
]
robot_is_ok = [True, False, True]
robot_skill_grade = [
    {
        "trans": 98,
        "cal": 48,
        "learn": 88,
    },
    {
        "trans": 45,
        "cal": 32,
        "learn": 22,
    },
    {
        "trans": 21,
        "cal": 19,
        "learn": 90,
    }
]

print(robot_name[0])
print(robot_name[1])
print(robot_name[2])
from datetime import datetime

# * (3) dict 자료구조 사용
siri = {
    "name": "siri",
    "code": 129083,
    "created_at": datetime(2021, 8, 2),
    "is_ok": True,
    "skill_grade": {"trans": 98, "cal": 50, "learn": 40},
}

bixby = {
    "name": "bixby",
    "code": 4637824,
    "created_at": datetime(2020, 8, 2),
    "is_ok": False,
    "skill_grade": {"trans": 45, "cal": 98, "learn": 67},
}

jarvis = {
    "name": "jarvis",
    "code": 2364786,
    "created_at": datetime(2023, 8, 2),
    "is_ok": True,
    "skill_grade": {"trans": 25, "cal": 78, "learn": 68},
}
from datetime import datetime

# * (4) fucntion 사용
def robot(name, code, created_at, is_ok, skill_grade):
    return {
        "name": name,
        "code": code,
        "created_at": created_at,
        "is_ok": is_ok,
        "skill_grade": skill_grade,
    }


siri = robot("siri", 129083, 2021, True, {"trans": 98, "cal": 50, "learn": 40})
bixby = robot("bixby", 4637824, 2020, False, {"trans": 45, "cal": 98, "learn": 67})
jarvis = robot("siri", 129083, 2023, True, {"trans": 25, "cal": 78, "learn": 68})

class 와 추상화를 사용했을 때의 코드보다 기본 자료구조를 사용한 절차지향형 코드가 훨씬 길어짐을 알 수가 있다. 함수를 활용한 코드는 충분히 효율적이라 할 수 있다

관련글 더보기

댓글 영역