본문 바로가기
Tech, Tech, Tech/C++

C++을 위한 기본 지식 [ 1.2 프로그래밍 기본 원칙][알고리즘, 프로그램 디자인, 객체지향]

by 결기공 2019. 12. 8.

Introduction

"C++을 위한 기본 지식" 챕터에서는 컴퓨터의 기본 구성 요소들과 프로그래밍을 하는데 있어서 기본적인 테크닉과 디자인을 간단한 예제를 통하여 알아볼 예정입니다.

 

구성은 아래와 같습니다:

 

[1.1 컴퓨터 시스템]

https://beelee.tistory.com/5

 

[1.2 프로그래밍 기본 원칙]

-알고리즘

-프로그램 디자인

-객체지향 프로그래밍

 

[1.3 C++에 대한 소개]

https://beelee.tistory.com/7


오늘 [1.2 프로그래밍 기본 원칙] 서브 챕터에서는 프로그래밍의 기본 원칙들에 대하여 알아보겠습니다.

이는 C++에만 한정되어 있지 않으며, 어떤 언어를 쓰던 통용적으로 사용할 수 있는 원칙들입니다.

 

알고리즘 (Algorithm)

좋은 개발자가 되기 위해서 "알고리즘/자료구조보다는 빠른 트렌드의 기술들을 빨리 섭득하는것이 더욱 중요하다고" 하는 개발자들이 있는 반면, "알고리즘/자료구조는 좋은 개발자가 되기 위한 필수 조건이다" 라고 이야기하는 개발자들도 있습니다. 결정은 내리기 나름이겠지만, 실제로 대부분의 Tech 회사들에서는 개발자를 채용할 시 알고리즘 테스트를 보는것이 현실입니다.

그리고 알고리즘 공부라는 것이 결국엔 문제를 해결하는 능력을 키우는 것이기 때문에, 꼭 개발자가 되지 않는다고 해도, 문제 해결의 기본 역량을 키우는데 있어 중요한 학문입니다. 

 

프로그래밍의 초반에는 나의 생각을 코드로 표현하는것에 어려움을 겪을 수 있습니다. 하지만 시간이 지나다보면, 결국엔 코드를 작성하는것보다 문제를 해결하는 방법이 더 중요하다는 것을 알게 됩니다. 

문제를 해결하기 위한 순차적인 명령들을 알고리즘이라 부릅니다.

 

하나의 예를 보겠습니다. 

여러 이름이 적힌 리스트를 보고 같은 이름이 몇번 적혀있는지 확인하는 알고리즘을 작성해 보겠습니다.

 

1. 이름이 적힌 리스트를 받는다.

2. 리스트에 있는 이름들을 종이에 받아 적는다.

3. 이름옆에 숫자를 0으로 세팅한다

4. 종이와 리스트를 비교하며, 종이에 적힌 이름이 리스트에 발견될 시 이름옆의 숫자를 +1한다.

 

위처럼 인간의 언어로 알고리즘을 작성하는 것을 "Pseudo code"라 부릅니다.

여기서 "Pseudo"는 가짜라는 뜻으로 해석할 수 있는데, 실제 작동되는 코드가 아니기 때문에, pseudo code라 부릅니다.

1번부터 4번까지의 명령들을 순서대로 수행하면, 이름이 몇번 적혔는지에 대한 문제를 해결 할 수 있습니다.

이처럼 알고리즘은 명령들을 "순서대로"따라가는 것이 매우 중요합니다.


프로그램 디자인 (Program Design)

프로그램을 디자인하는 일을 까다로운 일입니다.

절대적인 규칙이 없으며, 어떻게 해야하는지에 대한 가이드나 알고리즘 또한 없습니다. 

그렇기 때문에 개개인의 창의력에 의해 많이 좌지우지되는 영역입니다. 

몇몇의 개발자들은 프로그램 디자인을 뛰어넘고 바로 개발에 들어가기도 합니다.

시간을 아끼고자 함인데, 실제로 연구된바에 의하면 시간을 들여 구체적인 프로그램을 디자인하는것이 전체적인 개발 시간을 줄여준다고 합니다. 그렇기 때문에, 프로그램 디자인을 이해하고 수행하는것은 매우 중요합니다.

 

절대적인 규칙은 없으나, 통상적으로 사용되는 아웃라인은 존재합니다. 

프로그램 디자인은 "문제해결단계"과 "구축단계"으로 구분됩니다. 

프로그램 디자인 프로세스

먼저 문제해결단계 "Problem solving phase"에 대해 알아보겠습니다.

1. 문제 정의 (Problem defiition) - 문제를 정확하게 정의하고, 어떤 식의 데이터를 사용하여, 어떤식의 결과를 만들었으면 하는지에 대해서 구체적으로 정의하는 것입니다. 이 프로그램을 통해서 어떤 결과를 성취하고 싶은지를 매우 구체적으로 정의하는 것입니다. 

예를들어, 통장 프로그램을 만든다면, 이자가 얼마인지 알아야 할 뿐만 아니라, 달단위로 정산되는지, 년단위로 정산되는지를 정하는 것이지요.

아래의 재밌는 카툰을 보시면, 문제 정의가 왜 중요한지 보실 수 있습니다.

2. 알고리즘 디자인 "Algorithm design"- 문제를 정의하고 나서, 문제를 해결하기 위한 알고리즘을 작성하는 페이즈 입니다. 코드를 짜기 전에 리스트에서 이름을 카운트하는 문제처럼, pseudo code를 작성하는 것입니다. 이와 같은 알고리즘 디자인 페이즈는 실제 코드에 버그를 줄여주는 역할을 합니다.

 

3. 데스크탑 테스팅 "Desktop testing" - 책 "Problem solving with C++"에서는 데스크탑 테스팅을 전 단계에서 작성한 알고리즘을 하나하나 확인하고 테스팅 하는 단계로 표현하고 있습니다. 

 

이처럼 문제해결단계 "Problem solving phase"는 1. 문제 정의 --> 2. 알고리즘 디자인 --> 3. 데스크탑 테스팅 의 순서대로 진행되며, 어느 페이즈에서든지 문제가 발견된다면, 전 단계로 돌아가 다시 문제/알고리즘을 수정하게 됩니다.

 

문제해결단계가 완성이 되면, 구축단계 "Implementation phase"로 넘어가게 됩니다.

1. C++ 코드 작성 "Translating to C++"- 알고리즘의 설계가 완료되면, 알고리즘을 코드로 작성하는 단계입니다. 

 

2. 테스팅 "Testing" - 작성한 코드를 테스팅 하는 단계입니다. 작성한 코드를 여러 코드와 여러 환경에 넣어 실제 문제없이 작동되는지 확인하는 단계입니다. 이 단계에서 문젝가 발견된다면, 언제든지 그 전 단계인 "문제정의"와 "알고리즘 디자인"으로 돌아가야 할 수 있습니다. 

 

이러한 단게들을 여러번 반복하여 문제없이 작동되는 프로그램을 만드는것이 프로그래밍 디자인입니다.


객체지향 프로그래밍 (Object-Oriented Programming)

객체지향 프로그래밍 (Object Oriented Programming) 은 줄여서 OOP라고도 자주 불립니다. 

위에서 보여드렸던 이름 리스트 체크 알고리즘은 여러 명령어들을 순서대로 실행하여 문제를 해결하는 프로그래밍 방법입니다. 

객체지향 프로그래밍은 여러가지 객체"Object"를 만들어, 이 객체들이 서로 소통하게 만드는 프로그래밍 패러다임입니다. 

예를 들어 보겠습니다. 

만약 레이싱 프로그램을 작성한다고 했을 때, 여러대의 자동차를 디자인 해야할것입니다. 자동차별로 특성들이 다를것입니다.

(예. 색, 브랜드, 차명 등)

이를 만약 코드로 만든다고 하면 꽤나 반복적인 작업이 될것입니다. 

기존의 코딩 방법대로 라면 초록색의 포드 무스탕을 코딩해야할것이고, 빨간색의 도요타 프리우스를 순서대로 코딩해야할 것입니다.

 

하지만 만약 객체지향프로그래밍을 한다면, 자동차들이 가지고 있는 공통적인 속성을 하나의 개체로 만들 수 있을 것입니다.

자동차라는 개체를 만들고 그 안에 속성들 (색상, 브랜드, 차명)을 만들 수 있을 것입니다.

위에 보이는 class Car{}; 안에 들어가있는 부분들이 자동차에 대한 속성입니다.

그 속성들안에 값을 부여해주어, 하나의 초록색 포도 머스탱이라는 객체를 완성하게 됩니다.

이러한 식으로 여러개의 객체들을 만들어, 하나로 소통하게 하는것을 객체지향 프로그래밍이라 합니다. 

 

객체지향 프로그래밍은 encapsulation, inheritance, polymorphism등 다양한 특징을 가지고 있습니다. 

객체지향 프로그래밍 하나만 해도 꽤나 방대한 양의 지식들을 다룹니다. 현재까지는 C++를 시작하기전 기초 지식들에 대해서 다루고 있기 때문에, 차후에 자세히 포스팅을 할 예정입니다.


이상 이번 포스팅은 프로그래밍의 기본 원칙은 알고리즘, 프로그램 디자인, 객체지향 프로그래밍에 대하여 알아보았습니다.

댓글