임베디드 월드 2021로 가는 길에서: 에피소드 3
편집자 주: 임베디드 월드 2021(Embedded World 2021)을 앞두고 마련된 블로그 시리즈(총 5편) 중 에피소드 1에서는 임베디드 월드에 대해 간략히 소개했습니다. 에피소드 2에서는 Randall과 함께 C 프로그래밍 언어를 살펴보았습니다. 이번 에피소드 3에서는 객체 지향 프로그래밍을 사용하여 복잡성을 줄이는 방법에 대해 알아보겠습니다. 에피소드 4에서는 빌딩 블록을 다시 구현하지 않고도 변화하는 요구 사항에 따라 재구성할 수 있어야 본질적으로 우수한 설계로 인정받을 수 있는 이유를 알아봅니다. 마지막 블로그인 에피소드 5에서는 Randall의 임베디드 월드 2021 기조 발표에 앞서 운영 체제에 계속해서 더 많은 공간이 필요한지를 점검하고 시스템 분해에 관해 간략히 알아봅니다.
지난달부터 복잡성에 중점을 두는 이유는 업계가 복잡성을 줄여야 한다고 생각하기 때문입니다. 제가 말하는 복잡성이란 전기 장치(주로 전자 장치를 의미함)를 사용하는 데 필요한 복잡성을 의미합니다. 장치는 계속해서 복잡해질 것이라고 예상합니다. 이러한 복잡성을 정리하는 방법이 바로 다음 게시글의 주제가 될 예정입니다.
첫 번째 게시글에서 언급한 바와 같이, 전기 공학(EE) 등록은 다른 엔지니어링 분야의 발전에 걸림돌이 되고 있습니다. 그럼에도 불구하고 미래에는 더 많은 전자 장치가 사용되리라 확신합니다. 또한 이러한 장치가 현재보다 더 광범위한 응용 분야에 사용될 것으로 보입니다. 제조사 동향이 그 증거입니다.
전자 장치에 대한 큰 관심이 있으며 사람들이 만드는 제품의 유형에는 끝이 없는 것처럼 보입니다. 이러한 관심은 정식으로 전기 공학 교육을 받지 않은 사람들 사이에서 높습니다. 2020년 46번째 주인 현재, maker.io, MikroE, Adafruit, Seeed, SparkFun 및 기타 웹 사이트에는 매달 수백만 명의 고유 방문자가 모여들고 있습니다(아래 그림 1 참조). 전자 장치에 대한 높은 관심을 보여줍니다.
그림 1: 전자 장치에 관심을 가진 이들에게 서비스를 제공하는 웹 사이트의 월간 고유 방문자 수
실제로 EE가 단독으로 충족할 수 있는 것보다 큰 전자 장치 시장이 있다고 생각합니다. EE는 최고 수준의 복잡성을 다루거나 최소한 접근 방식을 파악하는 교육을 받지만 충분한 교육을 받지 않은 사람도 전자 장치를 개발할 수 있도록 하는 것이 기회가 될 수 있다고 생각합니다. 간략히 말하면, EE가 전자 장치와 하위 시스템을 더 사용하기 쉽게 만들 수 있다면 시장이 확대되리라 생각합니다.
지난달에는 객체 지향 프로그래밍(OOP)까지 살펴보았습니다. OOP를 위해서는 훨씬 많은 개념을 익혀야 하기 때문에 복잡성이 높아지게 된다는 주장이 있을 수 있습니다. 이러한 개념에 대해서는 나중에 다루겠지만, 지금은 OOP를 통해 기능을 재사용하기 위한 복잡성을 줄이는 방법을 예시를 통해 살펴보겠습니다.
제 사위는 경영학 학위가 있지만 정보 기술 대학원 과정에 등록했습니다. 그는 최근 몇 가지 과제 중 하나를 저와 공유했는데, 3D 비디오 액션 게임을 직접 구현해야 하는 것이었습니다.
그는 3D 그래픽이나 실시간 프로그래밍에 관한 교육을 받지 않았고 경험도 없었지만 성공적으로 구현할 수 있었습니다. 그는 교수의 지도에 따라 Unity 플랫폼을 사용하여 게임을 구현했습니다. 복잡성으로 이야기를 시작했지만 지금은 재사용에 관해 이야기하고 있네요.
제가 가장 좋아하는 책 중 하나는 Meilir Page-Jones의 저서인 Fundamentals of Object Oriented Design in UML(UML을 사용한 객체 지향 설계의 기본)입니다. 꽤 많은 OOP 작업을 한 후에 이 책을 샀지만 제가 제대로 된 전문가는 아니라는 사실은 알고 있었습니다. 저는 실력을 향상시키고 싶었습니다.
출처: Amazon (https://www.amazon.com/gp/product/020169946X/ref=dbs a def rwt bibl vppi i0)
반갑게도 Page-Jones는 OOP 개념을 집적 회로에 비유하여 설명했습니다. Page-Jones는 Brad Cox의 1986년 저서인 Object-Oriented Programming: An Evolutionary Approach(객체 지향 프로그래밍: 혁신적인 접근 방식)를 읽고 이러한 관점에서 생각하게 되었다고 밝혔습니다. 또한 Page-Jones는 저서 Introduction to Radar Systems(레이더 시스템 입문)에서 “전자 공학은 (1) 부품, (2) 기법, (3) 시스템에 따라 분류될 수 있다”고 지적한 Merrill Skolnik를 인용합니다. Skolnik는 이어서 “부품은 적합한 기법을 통해 조합되어 시스템을 구성하는 기본적인 빌딩 블록”이라고 설명했습니다. Page-Jones는 “전자”를 “소프트웨어”로, “부품”을 “클래스”로 바꾸면 소프트웨어 시스템에 대해 유용한 관점을 얻을 수 있다고 제안했습니다.
Page-Jones는 계속해서 전기 시스템에 포함할 가치가 있는 부품의 선택은 유용한 추상화를 파악하는 EE의 역량에 달려 있다고 설명합니다. 그리고 최초의 집적 회로가 개발되기 전에 엔지니어들은 수십 년에 걸쳐 전기 시스템에 필요한 유용한 패턴을 발견했다고 주장합니다. 이를 통해 OOP 개발자가 “양호하고 강력하며 편리한” 클래스를 파악할 수 있도록 했습니다. Skolnik가 언급하는 기법은 부품이 함께 연결될 수 있어야만 유용하다고 주장하는데, Skolnik의 경우에는 인쇄 회로 기판으로 연결됩니다.
따라서 집적 회로와 객체 지향 프로그래밍은 동일한 개념을 본질적으로 다르게 구현한 것이라는 점을 강조하고 싶습니다. 소프트웨어 엔지니어링이 하드웨어 엔지니어링보다 훨씬 느슨해 보이는 것은 사실입니다. 오늘날에는 누구나 소프트웨어를 구현할 수 있는 것처럼 보입니다. 하지만 소프트웨어가 쉽게 “연결”되는 것은 아닙니다.
MyHDL을 개발한 Jan Decaluwe는 블로그 게시글을 통해, 하드웨어 기술 언어(HDL)를 사용하는 디지털 설계에서는 연산을 Verilog 또는 VHDL로 기술하기가 간단하지 않으며 사실 복잡하고 혼동하기 쉽다고 밝혔습니다. 프로그래밍 가능 논리이든 소프트웨어 시스템이든, 시장을 확대하려면 소프트웨어 설계를 개선해야 한다고 생각합니다.
따라서 이번 달 게시글을 마무리하면서 “우수한” OOP 설계에 필요한 개념을 정리해 드리겠습니다. 가장 일반적인 개념은 응집도와 결합도의 개념입니다. 응집도는 소프트웨어 클래스, 디지털 모듈, 집적 회로와 같은 캡슐화된 장치의 구성 요소 간 관련성입니다. 응집도가 높으면 시스템의 이해, 테스트, 유지보수 등이 용이해지기 때문에 응집도가 낮은 경우보다 바람직합니다. 결합도는 하나의 소프트웨어 또는 하드웨어 소자의 다른 소자에 대한 연결성 또는 의존도입니다. 결합도가 낮으면 하나의 소자에 변경사항을 적용하는 경우 다른 소자에 대한 영향이 최소화되기 때문에 결합도가 높은 경우보다 바람직합니다.
Page-Jones는 결합도의 위험성을 설명하기 위해 “Connascence”라는 용어를 만들었습니다. Page-Jones에 따르면, Connascence는 “함께 탄생했다”는 의미의 라틴어를 어원으로 합니다. 그리고 “서로 얽힌 운명”을 가진 것을 의미한다고 덧붙입니다. Page-Jones가 내린 Connascence의 공식적인 정의는 다음과 같습니다.
두 소프트웨어[또는 하드웨어] 소자 A와 B 간에 Connascence가 있다는 것은 다음을 의미합니다.
- A에 일부 변경 사항을 적용할 경우 전체적인 정확성을 유지하기 위해 B도 변경(또는 최소한 면밀히 점검)해야 할 수 있습니다.
- 일부 변경 사항의 경우 전체적인 정확성을 유지하기 위해 A와 B 둘 모두를 변경해야 할 수 있습니다.
괄호 안에 들어간 내용은 제가 추가한 것입니다. Page-Jones는 계속해서 10가지 유형의 Connascence에 대해 설명합니다. Connascence의 형태 중 하나는 함수 호출 내 인수의 순서에 따라 달라집니다. 순서가 변경되면 모든 종속 함수도 변경되어야 합니다. 또한 차이를 유지해야 하는 Contranascence의 개념도 설명합니다. Contranascence는 특히 객체가 동일한 유형의 인스턴스이지만 서로 구분되어야 하는 OOP 상속의 경우에 적용됩니다.
응집도, 결합도, Connascence 외에도 바람직한 OOP 설계란 무엇인지 이해하는 데 도움이 되는 다른 여러 개념이 있습니다. 참고로 나열해 보자면 다음과 같습니다.
- 캡슐화
- 정보/구현 은닉
- 상태 유지
- 객체 식별자
- 메시지
- 클래스
- 상속
- 다형성
- 일반성
이 내용은 앞서 언급한 Page-Jones의 저서와 기타 OOP 문서에 자세히 설명되어 있습니다.
복잡성에 대해 복잡하게 설명했네요. 고려해야 할 측면이 많지만 가장 중요한 것은 누구나 새로운 전자 장치를 만드는 데 사용할 수 있는 유용한 블랙박스를 개발하는 것이 목표라는 점입니다. 박스 안의 내용물을 노출하기를 원하지도, 그럴 필요도 없기 때문에 블랙박스라고 합니다. 인터페이스를 가능한 한 단순하게 만들고 내부의 복잡성에 대해서는 신경 쓰지 않아도 되기를 원하는 것입니다.
지금까지 우리가 추구하는 모델의 품질을 평가하는 방법을 알아보았습니다. 실제로 시스템과 하위 시스템을 재사용 가능한 구성 요소 또는 모듈로 분해하는 방법은 다음 블로그에서 알아보겠습니다.

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum