프로그래밍-관련-용어-기초-설계도
컴퓨팅 사고, 알고리즘, 그리고 프로그래밍의 관계

컴퓨터 과학(computer science)이란 어떤 학문이며 컴퓨팅 사고(computational thinking)란 무엇일까요? 또 알고리즘(algorithm)란 무엇이고 알고리즘은 프로그래밍(programming)과 어떤 관계에 있을까요? 많이는 들어보았지만 각 단어의 정의와 관계를 정확히 설명하려면 조금 어렵게 느껴지기도 합니다. 하지만 각 개념을 정확히 알아두면 앞으로 프로그래밍을 전체적인 관점에서 보는 데 도움이 됩니다.

이번 시간에는 컴퓨터 과학과 알고리즘, 그리고 프로그래밍이란 무엇인지 그리고 이 개념들은 서로 어떤 관계를 맺고 있는지 살펴보겠습니다. 먼저 컴퓨팅 사고와 컴퓨터 과학이란 무엇인지 살펴보겠습니다.

컴퓨팅 사고와 컴퓨터 과학

컴퓨터 과학과 컴퓨팅 사고가 무엇인지 이해하기 위해서는 우리가 문제를 해결하는 과정을 떠올려보면 좋습니다. 우리는 문제를 어떻게 해결할까요? 문제를 정의하고 해결하는 방식은 사람마다 다릅니다. 어떤 사람에게는 문제인 것이 다른 사람에게는 문제가 아니기도 하고, 이 해결책이 나은 것 같은데 다른 방법으로도 이전 해결책만큼 효과적이거나 더 나은 결과를 얻기도 합니다.

문제를 과학적으로 해결하는 패턴을 살펴보면 다음과 같은 과정을 거치는 것을 알 수 있습니다.

  • 1단계: 문제가 무엇인지 명확히 이해한다.
  • 2단계: 문제를 추상화하여 단순한 요소로 분해한다.
  • 3단계: 요소들의 관계를 분석하고 패턴을 파악한다.
  • 4단계: 파악한 패턴을 바탕으로 현실을 모델화한다.
  • 5단계: 모델을 바탕으로 실행가능한 작은 단위의 과제를 만든다.
  • 6단계: 과제들을 가장 효율적인 방식으로 순서에 맞게 배치한다.
  • 7단계: 실행한다.

위 사고의 과정은 명료합니다. 각 단계가 분명하게 정의되어 있죠. 복잡함은 해체되어 단순해지고, 어렵게만 느껴졌던 문제는 실행가능한 작은 단위의 과제들로 나누어져 해결이 가능해집니다. 이처럼 문제에 대한 효과적인 해결책을 찾기 위해 대상을 해체하고 조립하는 과정을 반복하면서 통합적인 해결책을 만드는 사고 과정을 컴퓨팅 사고라고 합니다.

컴퓨터 과학이란 이러한 컴퓨팅 사고를 바탕으로 문제를 해결하는 학문입니다. 많은 학문이 그렇듯 컴퓨터 과학도 문제를 해결하는 학문입니다. 다른 분야와 차이점이 있다면 컴퓨터 과학에서는 문제를 해결하기 위해 컴퓨터를 이용하는 것이죠. 컴퓨터 과학은 문제와 해결책을 각각 입력(input)과 출력(output)으로 대입해 입력과 출력 사이에서 문제를 해결하려는 거대한 사고 시스템입니다.

컴퓨터 과학이란 컴퓨터를 이용해 문제를 해결하는 거대한 사고 체계
컴퓨터 과학이란 컴퓨터를 이용해 문제를 해결하는 거대한 사고 체계 Denys Nevozhai - Unsplash

컴퓨터 과학의 기본 바탕을 이루는 컴퓨팅 사고는 아래 4가지 과정을 거칩니다.

  • 추상화(abstraction): 문제를 해결하기 위해 가장 관련이 높은 정보를 찾아내고 관련없는 세부 디테일은 제거함
  • 해체(decomposition): 문제를 작고 관리할 수 있는 부분으로 나눔
  • 패턴 인식(patter recognition): 데이터를 분석해서 대상들 사이의 공통점과 대상들 간의 관계를 식별함
  • 알고리즘적 사고(algorithmic thinking): 사람이나 컴퓨터가 반복할 수 있고 재사용할 수 있는 단계별 과정을 개발함

여기서 알고리즘이라는 말이라는 말이 나옵니다. 알고리즘이란 정확히 무엇일까요?

알고리즘과 프로그램

알고리즘

알고리즘이란 문제를 해결하기 위해 수행해야 할 과제를 순서에 맞게 나열한 단계적 절차입니다. 위에서 언급한 문제 해결 과정의 5단계와 6단계에서 하는 일과도 같습니다.

알고리즘은 반드시 컴퓨터를 이용해서 문제를 해결하는 절차를 말하지는 않습니다. 알고리즘은 어떤 문제를 푸는 데 쓰이는 일련의 단계입니다. 알고리즘은 기계가 사용되기 훨씬 이전부터 사람이 써온 논리적인 사고 과정입니다. 알고리즘 설계(algorithm design)란 문제를 해결하기 위해 더 나은 해결책을 찾는 과정이고요.

그런데 우리가 겪는 많은 문제는 우리 이전의 많은 사람들도 어려워하고 고민했던 것들입니다. 사람들은 자기 이후의 사람들이 불필요하게 애쓰지 않도록 문제에 대한 단계적 해결책을 마치 매뉴얼처럼 공식화해놓으면 좋겠다고 생각합니다. 그러면 사람들이 문제에 대한 해결책을 더 빠르게 찾고 아낀 에너지로 더 중요하고 본질적인 곳에 사용할 수 있겠죠. 가지 않은 길을 가서 다음(next)이 생겨날 수 있도록 길을 만드는 것이 과학과 인류가 계속해서 발전하는 원동력이겠죠.

가지 않은 길을 가는 것
가지 않은 길을 가는 것 Timothy Chan - Unsplash

이처럼 문제를 해결하는 논리적인 순서를 나중에도 재사용할 수 있도록 공식화해놓은 단계적 절차가 바로 프로그래밍 알고리즘입니다. 우리는 집단 지성으로 다져진 세계에서 먼저 굵직굵직하게 알려진 알고리즘을 배우면 됩니다. 열심히 애쓰다 보면 나중에는 우리가 직접 알고리즘을 만들어볼 수도 있을 것입니다.

프로그래밍 알고리즘

프로그래밍에서는 일반적으로 사용하는 알고리즘과 프로그래밍에서 사용하는 알고리즘을 구분해 프로그래밍 알고리즘이 지녀야 할 특징을 명시하고 있습니다.『The Art of Computer Programming』시리즈의 저자 도널드 커누스(Donald Knuth)에 따르면 프로그래밍의 알고리즘이 지켜야 할 5가지 특징이 있습니다. 그 특징은 다음과 같습니다.

  • 유한성(finiteness): 알고리즘의 단계들은 반드시 유한한 횟수를 거친 후에 종료됨
  • 명확성(definiteness): 알고리즘의 각 단계는 반드시 명확하게 정의되어야 함
  • 입력(input): 알고리즘은 0 또는 그 이상의 입력을 가져야 함
  • 출력(output): 알고리즘은 한 개 또는 그 이상의 출력을 가져야 함
  • 효과성(effectiveness): 효과적이어야 한다는 말은 알고리즘의 모든 연산을 사람이 종이와 연필을 이용해서 유한한 시간 안에 정확하게 수행할 수 있을 정도로 아주 단순해야 함

프로그래밍 알고리즘은 사람이 사용하는 자연어(natural language)로 기술되거나 기호와 도형을 이용해 알고리즘을 순서대로 도식화한 그림인 순서도(flow chart) 등으로 자주 표현됩니다.

알고리즘을 그림으로 표현하기
알고리즘을 그림으로 표현하기 Андрей Сизов - Unsplash

알고리즘의 특징과 알고리즘을 표현하는 순서도, 알고리즘의 효과성을 평가하는 기준과 대표적인 알고리즘의 종류는 알고리즘편(예정)에서 더 자세히 다루겠습니다.

그럼 알고리즘은 프로그램(program)일까요? 아닙니다. 프로그램에 대해서는 아래에서 살펴보겠지만 결론부터 말하면 프로그램은 알고리즘을 구현한 결과입니다. 알고리즘이 요리법이라면 프로그램은 요리입니다. 우리는 알고리즘이라는 요리법을 이용해 프로그램이라는 요리를 만드는 요리사고요. 그럼 프로그램이란 정확히 무엇일까요?

프로그램

프로그램이란 컴퓨터가 실행할 수 있는 문(statements)의 집합이 일정한 순서에 따라 배치된 것을 말합니다. 문이란 프로그램을 이루는 최소 실행 단위입니다. 문을 작성하고 순서대로 나열하는 행위가 프로그래밍이며, 프로그래머가 지정한 순서에 따라 나열된 문을 모으면 프로그램이 되는 것입니다[1].

일정한 순서가 있다는 점은 알고리즘과 프로그램의 공통점입니다. 하지만 프로그램은 알고리즘 없이도 만들 수 있습니다. 예를 들어보겠습니다. 여기 "사과를 씻는다"와 "사과를 먹는다"라는 문이 있습니다. 그럼 어떤 프로그램에서는 문의 순서를 "사과를 씻는다" 그리고 "사과를 먹는다"라고 배치합니다. 반면 다른 프로그램에서는 문의 순서를 "사과를 먹는다" 그리고 "사과를 씻는다"라고 배치했습니다. 프로그램은 두 가지 경우에서 모두 작동합니다.

많은 사람들이 보편적으로 생각하기에 사과를 더 건강하게 먹는 방법은 전자일까요, 후자일까요? 아마도 전자이겠죠. 어떤 한 방법은 다른 방법보다 더 논리적입니다. 이치에 맞고 합리적이어서 사람들의 공감을 받습니다. 알고리즘 없이도 프로그램을 만들 수 있습니다. 하지만 알고리즘을 구현해서 만든 것이 논리적이고 더 좋은 프로그램입니다.

더 좋은 요리법을 선택하면 더 맛있는 요리를 만들 수 있습니다. 그러니 요리법(알고리즘)을 요리조리 공부하면 더 좋은 요리(프로그램)를 조리할 수 있습니다.

프로그래밍은 요리를 조리하는 것
프로그래밍은 요리를 조리하는 것 Kevin McCutcheon - Unsplash

지금까지 알고리즘과 프로그래밍 알고리즘, 그리고 알고리즘과 프로그램의 관계를 살펴보았습니다. 여기서 알고리즘이 프로그램에 잘 반영될 수 있도록 생각을 정제하는 데 도움을 주는 도구가 있습니다. 이 표현이 바로 의사코드(pseudocode)입니다.

의사코드

의사코드는 알고리즘이 프로그램에 잘 녹아들어 갈 수 있도록 알고리즘의 논리 표현을 프로그램을 작성하는 형식에 따라 간결하게 작성한 언어입니다. 의사코드는 사람이 사용하는 언어로 기술되기 때문에 컴퓨터에서는 실행할 수 없습니다. 하지만 컴퓨터가 잘 이해할 수 있는 틀에 맞게 쓰여서 실제로 프로그래밍할 때 도움을 주죠. 다음은 C로 작성한 의사코드(출처: 위키백과)의 예시입니다.

c
void function findMyValue
For (i = 1; i <= 10; i++) {
set print_number to true;
If i is divisible by 3
print "3의 배수";
set print_number to false;
If i is divisible by 5
print "5의 배수";
set print_number to false;
If print_number, print i;
print a newline;
}

의사코드는 프로그램에서 실행될 수는 없지만, 알고리즘이 프로그램에 잘 구현될 수 있도록 프로그래머의 언어 모드를 컴퓨터 모드로 바꿔줄 수 있도록 도와줍니다. 그러면 우리는 컴퓨터와 어떻게 소통할 수 있을까요?

컴퓨터와 소통하려면 컴퓨터가 이해하는 언어를 사용해야 합니다. 그런데 컴퓨터는 0과 1로 구성된 2진수(binary number)를 씁니다. 컴퓨터에는 스위치 역할을 하는 수많은 트랜지스터가 있는데 컴퓨터의 트랜지스터는 오직 0과 1로만 켜짐(on)과 꺼짐(off) 상태를 표현할 수 있습니다. 컴퓨터에서 0과 1만으로 데이터를 측정하는 단위를 비트(bits)라고 여덟 개의 비트를 다시 한 단위로 묶은 것을 바이트(byte)라고 합니다.

2진수 세계
2진수 세계 Alexander Sinn - Unsplash

컴퓨터는 단 두 개의 숫자만으로도 사람이 사는 세계를 표현할 수 있습니다. 우리가 사용하는 10진수는 2진수로 바꾸어서 처리하고 문자는 각 알파벳을 특정한 10진수와 매핑해놓은 ASCII(American Standard Code for Information Interchange, 아스키코드)라는 국제적인 표준을 이용합니다. 더 많은 비트를 이용하는 Unicode에서는 이모티콘까지도 표현하고요. 그림과 음악, 영상은 빨간색, 초록색, 파란색의 조합을 숫자로 매핑한 RGB코드로 표현합니다.

여기서 관계의 중심이 되는 두 대상 모두 이해할 수 있는 표준이 필요하다는 것을 알 수 있습니다. 언어란 서로 의사소통하려는 대상이 동의한 공통의 약속이기 때문입니다. 컴퓨터가 숫자와 문자, 그림, 음악, 영상과 같은 다양한 데이터를 이해하고 이 데이터들과 소통하기 위해 표준을 사용하는 것처럼 사람과 컴퓨터 사이에도 이들을 서로 소통할 수 있게 해주는 도구가 필요합니다. 사람과 컴퓨터 사이에서 오작교 역할을 하는 이 표준이 바로 프로그래밍 언어(programming language)입니다.

지금까지 컴퓨터 과학과 컴퓨팅 사고, 알고리즘과 프로그래밍의 개념과 관계를 살펴보았습니다. 이어지는 편은 프로그래밍 언어 종류와 언어별 특징입니다. 프로그래밍 언어 정의와 종류에서는 프로그래밍 언어를 분류하는 다양한 기준과 각 프로그래밍 방식의 개념과 장단점을 알아보겠습니다. 모두 수고 많으셨습니다.

참고 문헌


  1. 여기서 말하는 프로그래밍은 프로그래밍 언어 종류와 언어별 특징에서 살펴볼 명령형 프로그래밍입니다. 문은 명령형 프로그래밍에서 적용되는 개념입니다.
...

©2023 Snug Archive. All rights reserved.

Contact me at snugarchive@gmail.com.