SMAIVNN
article thumbnail

몬드리안의 추상화

 

책에 따로 존재하는 주제는 아니지만  이번 스터디의 주제는 추상화였습니다.

이전 토픽부터 시작해서 객체지향 프로그래밍에서의 추상화와 같이 학창시절부터 꽤나 많이 들었지만 그냥 흘러가는 듯 잡고가던 개념이였습니다. 저에게는 정말 말 그대로 추상적인.. 아직 한 문장으로 정리되지 않는 단어였는데요, 이번 스터디를 진행하며 정리해보았습니다.

 

책을 읽고

책을 읽고 나서는 사실 여전히 애매 했습니다.

 

6장 객체와 자료 구조부분에서는 구현을 감추려면 추상화가 필요하다고 하는데, 단순히 함수로 작성하는 것이 아니다라고 합니다.

public interface Vehicle {
	double getFuelTankCapacityInGallons();
	double getGallonsOfGasoline();
}

public interface Vehicle {
	double getPercentFuelRemaining();
}

 

위 두 코드를 보면, 1번은 구체적으로 변수에서 가져오는구나 싶고, 2번은 추상적인 개념으로서 퍼센트로 말해준다고 합니다. 이처럼 세세하게 공개되는 것은 좋지 않다고 이야기 합니다. 

 

객체는 자료를 숨기고 함수를 공개한다. 즉, 객체는 조회 함수로 내부 구조를 공개하면 안된다는 캡슐화의 내용을 말합니다.

 

10장 클래스에 와서는 "함수" 부분에서 했던 이야기와 비슷한 이야기를 합니다.

  • 변수나 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만, 꼭 숨길 필요도 없다.
  • 클래스는 작아야 한다.
  • 클래스나 모듈을 변경할 이유는 단 하나 뿐이어야 한다.

 

여기까지 읽어보고도 사실 관련 주제는 아니어서 그런지 흠.. 그래서 추상화가 뭘까!!라는 생각이 가득했습니다. 

 

추상화와 스터디

이미 정말 많은 블로그에서 추상화가 뭔지 잘 설명하고 좋은 예시를 제시해줍니다.

대표적으로 메소드의 작동 방식과 같은 내부 로직은*(세부 정보) 숨기는 제어 추상화와 대상을 간단한 개념으로 일반화 하는 데이터 추상화가 있습니다.

 

이렇게만 설명해도 이해가 가고 아하 그렇구나! 하지만, 스터디를 진행하며 가장 와닿았던 말은 따로 있습니다. 바로 스터디원의 추상화 한문장 정의입니다.

  • 하나의 객체, 인터페이스 등이 자신이 실제로 사용하는 현실에서의 방식과 가능한 유사하게 만들어지는 것을 목표로 작성한다.

 

제가 사용하는 NestJS를 비롯하여 이런 객체 지향 프로그래밍의 개념은, 결국 현실 세계의 객체를 모델링해서 프로그래밍을 구성하는 방식이라고 배웠습니다. 현실 세계의 자원처럼, 필요한 자원 하나하나에 대해서 일반화 하고 기능을 구현하는 것이죠. 

 

가장 많이 사용되는 자동차 예시도 마찬가지입니다. 결국 우리는 차를 만들기 위해, 차 라는 카테고리 아래 바퀴, 문, 유리 등 다양한 것이 필요하다는 것을 알고 있습니다. 또한 자동차에도 다양한 종류가 있는 것을 알고요. 하지만 이러한 자동차가 어떻게 작동하는지, 어떻게 굴러가고 어떻게 브레이크를 통해 속도를 줄이는지는 잘 모릅니다. 사용법만 알면 잘 사용할 수 있습니다.

 

즉, 현실 세계와 유사한 설계 및 구현. 이것이 객체 지향과 추상화의 본질이라고 생각합니다.

 

그 외, 아래와 같은 다양한 한 문장 정리도 있습니다.

  • 다른 사람들이 이해하고, 사용하는 수준까지 만들어 놓는 것
  • 출근을 함수로 짜면 여러가지 기능이 있을텐데 면도, 세수 등...(중략) 이런 현실 세계의 ..(중략)
  • 결국 추상화는, 넌 뭘 하면 돼. 근데 어떻게는 몰라도 돼.

 

마침 이번에, 이전에 진행한 영상 통화와 mediasoup 관련한 example을 만들며 해당 내용을 적용해볼 수 있었습니다. 각각의 자원에 관한 것을 세분화하여 작성해보고자 했습니다. 물론 나누기만 하고 아직 추상화 수준 등은 고려하지 않은 코드입니다만, 이 글도 보시면 꽤나 흥미로울 내용입니다.

github: https://github.com/smaivnn/mediasoup-tutorial-react-nestjs

posting: https://smaivnn.tistory.com/28

 

 

문제 풀어보기

이번 스터디를 진행하며 재밌는 활동도 하나 했는데요, 바로 주어진 코드를 시간 안에 가능한 객체 지향적으로 바꿔보는 것입니다. 문제는 아래와 같습니다. 관심있는 분들은 같이 시도해 봐도 좋을 것 같습니다.

 

저를 포함한 스터디원들이 함께 진행한 다른 코드는 해당 링크에서 볼 수 있습니다.

https://github.com/SmilgateTechHiking-CleanCode/PRPractice

 

GitHub - SmilgateTechHiking-CleanCode/PRPractice

Contribute to SmilgateTechHiking-CleanCode/PRPractice development by creating an account on GitHub.

github.com

 

"""
240929 클린 코드 10장 클래스

문제 확인
케이크 문제
케이크를 구성하는 base, cream, decoration 이 무엇인지 출력하는 예제
케이크 만드는 코드를 클린 코드의 클래스 개념에 맞게 추상화해주세요.
"""

class Cake:
    def __init__(self):
        self.base = ""
        self.cream = ""
        self.decoration = ""
        self.cake_description = []

    def prepare_base(self, base_type="스폰지"):
        if base_type == "스폰지":
            self.base = "스폰지 케이크 베이스"
        elif base_type == "초콜릿":
            self.base = "초콜릿 케이크 베이스"
        else:
            self.base = "일반 케이크 베이스"
        self.cake_description.append(f"{self.base} 준비")

    def add_cream(self, cream_type="바닐라"):
        if cream_type == "바닐라":
            self.cream = "바닐라 크림"
        elif cream_type == "초콜릿":
            self.cream = "초콜릿 크림"
        else:
            self.cream = "일반 크림"
        self.cake_description.append(f"{self.cream} 추가")

    def decorate(self, decoration_type="초콜릿"):
        if decoration_type == "초콜릿":
            self.decoration = "초콜릿 장식"
        elif decoration_type == "과일":
            self.decoration = "과일 장식"
        else:
            self.decoration = "일반 장식"
        self.cake_description.append(f"{self.decoration} 추가")

    def make_cake(self, base_type="스폰지", cream_type="바닐라", decoration_type="초콜릿"):
        self.prepare_base(base_type)
        self.add_cream(cream_type)
        self.decorate(decoration_type)
        self.cake_description.append("케이크가 완성되었습니다!")
        return "\n".join(self.cake_description)


# 클라이언트 코드
cake = Cake()
print(cake.make_cake())

print("\n다른 종류의 케이크 만들기:")

another_cake = Cake()
print(another_cake.make_cake("초콜릿", "초콜릿", "과일"))

 

저 같은 경우 아직은 파이썬이 어색하기도 하고, 어떻게 바꿔야하나 싶어 꽤 고민을 오래 했는데, getter와 setter, 그리고 class의 분리를 신경썼습니다. 문제를 출제하신 분의 의도는 추상 클래스를 만들고 더욱 세분화 하는 것이였다고 합니다.

 

함께 스터디를 진행하고 이야기하고 고민하며 많이 배웠습니다.

 

끝으로

이제 스터디도 마지막 한 주 만을 남겨두고 있습니다. 취업 준비나 이런 것을 떠나서 다양한 사람들에게 다양한 의견을 듣고 공유할 수 있는 정말 좋은 스터디였습니다.

 

앞으로 한 번 남은 것이 아쉽습니다. 하지만 그래도 차차 다른 스터디나 활동을 진행할 예정이니 더욱 열심히, 꾸준히 해야겠다 마음 먹은 날이였습니다.

 

감사합니다.

profile

SMAIVNN

@SMAIVNN

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!