Skip to main content

Command Palette

Search for a command to run...

Programming Languages ​​and Algorithms

프로그래밍의 개념, 프로그래밍언어와 알고리즘

Updated
14 min read
Programming Languages ​​and Algorithms

Contents

1️⃣프로그래밍 개념 (Programming concept)
2️⃣프로그래밍 언어(Programming language)
3️⃣알고리즘 (Algorithms)


1️⃣프로그래밍 개념 (Programming concept)

프로그램이란? (what is program?)

Program Manager Career Guide: Top Tips | monday.com Blog

프로그램이란, 컴퓨터가 수행할 작업을 지시하는 명령어들의 집합이다. 컴퓨터와 프로그램은 떼려야 뗄 수 없는 밀접한 관계(closely intertwined)를 가지며, 컴퓨터의 기능을 실현하는 핵심 요소가 바로 프로그램이다.

컴퓨터는 범용적인(universal) 기계로, 다양한 작업을 처리할 수 있는 능력을 갖추고 있다. '범용적'이라는 의미는 단순히 특정 작업만을 수행하는 것이 아니라, 여러 가지 작업을 수행할 수 있음을 뜻한다. 이러한 범용성을 제공하는 것이 바로 프로그램이다. 프로그램은 컴퓨터가 데이터를 처리하고, 계산을 수행하며, 다양한 작업을 자동화할 수 있게 해주는 역할을 한다.

**임베디드 컴퓨터(embedded computers)**와 같이 특정 작업만 수행하는 컴퓨터도 있지만, **범용 컴퓨터(general-purpose computers)**는 다양한 소프트웨어 프로그램을 통해 여러 가지 목적을 위해 사용될 수 있다.

예를 들어, 우리가 일상적으로 사용하는 스마트폰, 노트북, 데스크탑 컴퓨터 등이 범용 컴퓨터에 속하며, 각각의 장치는 다양한 프로그램을 실행하여 여러 가지 작업을 수행한다.

즉, 컴퓨터를 범용적으로 만들 수 있는 이유는 프로그램이라는 개념 덕분이며, 프로그램이 없다면 컴퓨터는 정해진 일(predefined tasks)만 할 수 있는 단순한 기계에 불과할 것이다. 프로그램을 통해 우리는 컴퓨터에게 새로운 작업을 지시하고, 다양한 문제(wide array of problem)를 해결할 수 있는 도구로 활용할 수 있게된다.


만약 컴퓨터에 프로그램이 없다면?

컴퓨터에 하드웨어만 있고 프로그램이 없다면, 컴퓨터는 그저 약간의 열과 소음을 발생시키는 쓸모없는 기계에 불과할 것이다. 컴퓨터를 유용하게 사용하려면 윈도우즈와 같은 운영체제를 설치하고, 추가적으로 여러 가지 응용 프로그램을 설치해야만 한다. 그렇게 해야 비로소 컴퓨터는 제대로 기능을 하게 된다.

위의 그림은 사용자와 컴퓨터의 관계를 보여준다다. 컴퓨터는 크게 하드웨어소프트웨어로 나뉘며, 소프트웨어는 운영체제와 다양한 응용 소프트웨어(예: 애플리케이션)로 구성된다. 결국, 컴퓨터는 하드웨어, 소프트웨어, 사용자 이렇게 세 가지 요소로 크게 구분된다.

소프트웨어가 없다면, 아무리 뛰어난 하드웨어를 가지고 있어도 그것은 무용지물이다. 하드웨어, 소프트웨어, 사용자가 모두 결합되어야 컴퓨터가 현대 사회에서 그 역할을 효과적으로 수행할 수 있게된다.


왜 프로그램은 기본적으로 깔려있지 않고 설치하도록 했을까?

Q) 왜 컴퓨터에서는 가전제품처럼 프로그램 설치 없이 바로 동작되도록 하지 않고 불편하게 사용자가 프로그램을 설치하게 하였을까 ?

A) 가전제품에는 많은 전자기기, 회로가 들어가 있다. 냉장고만 보더라도 다양한 기능이 있다. 세탁기는 빨래를 하고 티비는 시청을 위함이다. 이렇게 특정한 목적을 달성하기 위해 만들어지는 것이 가전제품이다. 이에 반해 컴퓨터는 프로그램만 바꾸어주면 다양한 작업을 할 수 있다. 질문에 답은 컴퓨터를 범용적인 기계(universal machine)로 만들기 위해서라고 할 수 있다.


계산기와 컴퓨터의 차이


컴퓨터의 정의

  • **컴퓨터(computer)**는 단순히 계산(compute)만 하는 기계가 아니다.

  • 현대적인 의미에서의 컴퓨터는 프로그램(명령어들의 리스트)에 따라 데이터를 처리하는 기계라고 할 수 있다.

즉, 컴퓨터는 단순한 계산 기계에서 더 나아가, 주어진 프로그램에 따라 다양한 작업을 수행하고 데이터를 처리하는 범용적인 기계로 정의할 수 있다.


프로그램 안에는 무엇이 들어있을까?

  • 프로그램은 특정한 작업을 수행하기 위한 **작업 지시서(task instruction)**라고 볼 수 있다.

  • 작업을 지시하려면 **명령어(instruction)**들을 나열해야 한다. 따라서 프로그램 안에는 이러한 명령어들이 들어 있다.

즉, 프로그램은 컴퓨터에게 수행할 작업을 지시하는 명령어들의 집합이며, 이를 통해 컴퓨터는 주어진 작업을 실행하게 된다.


프로그램의 예

  • 예를 들어, 3개의 숫자를 받아서 평균을 계산하는 프로그램을 생각해보자.

  • 이 프로그램은 다음과 같은 **지시사항들(instructions)**로 이루어질 수 있다. 이러한 지시사항들이 바로 **명령어(command)**이다.

지시사항의 예:

  1. 첫 번째 숫자를 입력받는다.

  2. 두 번째 숫자를 입력받는다.

  3. 세 번째 숫자를 입력받는다.

  4. 세 숫자의 합을 계산한다.

  5. 합을 3으로 나누어 평균을 구한다.

  6. 계산된 평균을 출력한다.

이러한 일련의 지시사항들이 **명령어(command)**로 변환되어 프로그램을 구성하게 된다.

💡 프로그램 == 작업지시서, 컴퓨터에게 해야 할 작업의 내용을 알려주는 문서라고 할 수 있다.


프로그램의 역사

  • 프로그래밍이 가능한 최초의 기계: 해석 기관(Analytical Engine)

  • 만든이: 찰스 배비지(Charles Babbage)

  • 이 기계는 수천 개의 기어, 바퀴, 축, 레버 등을 증기로 작동시키도록 설계되었으나, 실제로 완성되지는 못함.

  • 차분기관(difference engine)

찰스 배비지는 해석 기관을 설계함으로써 프로그래밍 가능한 기계의 개념을 처음으로 제안한 인물로, 종종 "컴퓨터의 아버지"라고 불린다다.


배비지의 해석기관 (Analytical Engine, Charles Babbage)

  • 배비지의 해석 기관은 수천 개의 기어, 바퀴, 축, 레버 등으로 구성되어 증기로 작동하도록 설계된 최초의 프로그래밍 가능한 기계이다.

  • 이 기계는 현대 컴퓨터의 기본 개념을 포함하고 있으며, 다음과 같은 주요 구성 요소를 가지고 있었다.

  1. 중앙 처리 장치 (Central Processing Unit):

    • Mill이라고 불렸으며, 계산을 담당하는 장치이다. 현대 컴퓨터의 CPU에 해당하는 역할을 한다.
  2. 메모리 (Memory):

    • Store라고 불렸으며, 중간 단계에서 임시로 숫자를 저장하는 역할을 한다. 현재의 RAM과 같은 기능을 담당한다.
  3. 출력 장치 (Output Device):

    • 계산 결과를 나타내는 다이얼이 있었으며, 이는 결과를 시각적으로 보여주는 장치이다.
  4. 입력 장치 (Input Device):

    • 프로그램을 입력하기 위해 **천공 카드 (punch cards)**를 사용했다. 이는 명령어와 데이터를 기계에 전달하는 방식이었으며, 초기 프로그래밍의 형태이다.

이러한 구성 요소들은 현대 컴퓨터의 구조와 매우 유사하여, 배비지의 해석 기관은 컴퓨터 과학의 중요한 기초를 마련한 기계로 평가받는다.


초기 컴퓨터 프로그래밍(Early stage of Programming)
:ENIAC(Electronic Numerical Integrator and Computer)

  • 초기 컴퓨터인 ENIAC의 프로그램은 스위치를 통해 저장되었다. 프로그램을 변경할 때마다 수많은 스위치를 처음부터 다시 연결해야 했다. 이는 프로그래밍이 매우 복잡하고 시간이 많이 걸리는 작업이었음을 의미한다.

  • ENIAC은 특히 2차 세계대전 동안 군사 목적으로, 탄도 계산과 같은 복잡한 수학적 계산을 빠르게 수행하기 위해 설계되었다.

  • ENIAC이 최초의 컴퓨터인지는 논란이 있지만, 일반적으로 초기의 컴퓨터라고 하면 ENIAC을 지칭하는 경우가 많다.

ENIAC은 전자식으로 동작하는 초기 컴퓨터 중 하나로, 현대 컴퓨터의 기본 구조로 발전하는 데 중요한 역할을 한 기계다.


💡 찰스 배비지의 **해석 기관(Analytical Engine)**은 최초의 프로그래밍 가능한 기계로 설계되었지만, 완성되지 못한 기계이다. 따라서 이론적으로는 최초의 컴퓨터 설계로 간주되지만, 실제로 작동하는 컴퓨터로 완성된 것은 아니었다.

반면, ENIAC(Electronic Numerical Integrator and Computer)은 실제로 작동한 최초의 전자식 범용 컴퓨터 중 하나로, 컴퓨터의 역사에서 중요한 이정표로 여겨진다. ENIAC은 1940년대에 미국에서 개발되었고, 물리적으로 구현된 컴퓨터로서 수많은 계산 작업을 수행할 수 있었다.

따라서, 배비지의 해석 기관은 최초로 설계된 컴퓨터로 인정받지만, ENIAC실제로 만들어져 작동한 초기 컴퓨터로 간주된다.


폰 노이만 구조 (Von Neumann Architecture)

  • 프로그램은 메인 메모리에 저장된다. 이로 인해 프로그램을 쉽게 변경할 수 있다.

  • 메인 메모리에 저장된 프로그램에서 명령어들을 순차적으로 가져와 실행하게 된다.

이 구조는 현대 컴퓨터 시스템의 기본 모델로, CPU가 메모리에서 명령어를 읽어와 실행하는 방식이다. 프로그램과 데이터를 같은 메모리 공간에 저장할 수 있다는 것이 폰 노이만 구조의 핵심 개념이며, 이는 프로그램의 유연성을 크게 높였다.

폰노이만구조 이후로 컴퓨터는 계속 이 구조를 사용하고있다.


최초의 프로그래머: 에이다 러브레이스(Ada Lovelace)

  • 최초로 프로그램을 만든 사람은 **에이다 러브레이스(Ada Lovelace)**이다.

  • 에이다는 영국의 대문호 **바이런(George Byron)**의 딸이다.

  • 그녀는 찰스 배비지의 **해석 기관(Analytical Engine)**에 매료되어, 이를 위한 프로그램을 개발하였다.

  • 에이다는 서브루틴(subroutine), 루프(loop), **점프(jump)**와 같은 핵심적인 컴퓨터 프로그래밍의 기본 개념을 고안했다.

에이다 러브레이스는 컴퓨터 과학의 선구자로, 컴퓨터가 단순한 계산 이상의 작업을 수행할 수 있는 가능성을 처음으로 인식하고, 이를 위한 알고리즘을 작성한 것으로 유명하다.


에이다의 프로그램

A Brief History of the Ada Lovelace Awards

1842년에 에이다 러브레이스는 **해석 기관(Analytical Engine)**에 대한 이탈리아 엔지니어 Luigi Menabrea의 기사를 번역하는 과정에서, 여백에 주석을 추가했다. 이 에이다의 주석은 원래 기사보다 3배 더 길었으며, 해석 기관을 사용하여 Bernoulli 수를 계산하는 방법을 자세히 설명하고 있었다. 지금으로 얘기하면 논문이다.

에이다의 이 주석은 컴퓨터 역사에서 많은 사람들에게 최초의 컴퓨터 프로그램으로 간주된다. 이는 기계가 수행하도록 설계된 알고리즘으로, 현대 프로그래밍의 시작점으로 평가된다. 에이다 러브레이스는 이렇게 최초로 컴퓨터 프로그램을 작성한 인물로 기록되어 있다.


얼마나 자세하게 작업을 지시해야 할까?

  • 컴퓨터는 상식이나 지능이 없기 때문에, 작업을 아주 자세하고 구체적으로 지시해야 함

즉, 컴퓨터는 사람이 추측하거나 알아서 해결할 수 있는 능력이 없기 때문에, 프로그래머는 원하는 결과를 얻기 위해 세부적인 명령어정확한 지시사항을 제공해야만 한다. 모든 작업은 단계별로 명확하게 설명되어야 하며, 컴퓨터는 주어진 명령어만을 따라 수행한다.


컴퓨터의 장점

  • 컴퓨터는 작업을 매우 빠르게 처리하며, 정확하게 작업을 수행한다.

  • 몇 번을 반복해서 시켜도 불평 없이 동일한 결과를 제공한다.

이러한 특성 덕분에 컴퓨터는 대량의 데이터 처리, 반복 작업, 복잡한 계산 등을 인간보다 훨씬 효율적으로 수행할 수 있게된다.


2️⃣프로그래밍 언어(Programming language)

컴퓨터가 이해하는 언어

  • 컴퓨터가 이해하는 언어는 오직 한 가지, 즉 기계어이다. 이는 0과 1로 구성된 코드, 예를 들어 "001101110001010..." 같은 형태이다.

  • 컴퓨터는 모든 정보를 0과 1로 표현하며, 이 0과 1의 조합을 통해 내부 스위치 회로가 ON/OFF 상태로 변경되면서 작업을 처리한다..

이진수(0과 1) 기반의 기계어는 컴퓨터가 데이터를 저장하고 처리하는 가장 기본적인 방식이다.


기계어(Machine language)

  • 기계어는 0과 1로 구성된 이진수(2진수) 코드로, 예를 들어 "001101110001010..."와 같은 형태이다.

기계어는 컴퓨터가 직접 이해하고 실행할 수 있는 유일한 언어로, 컴퓨터 내부에서 명령어와 데이터를 처리하는 가장 기본적인 형태이다.

기계어의 예시이다. 메모리에 저장된 Address(주소)의 데이터는 0×401058이다.

아래의 하얀박스는 어셈블리어이다.


프로그래밍 언어(Programming language)

  • 기계어를 사용할 수는 있지만, 이진수로 프로그램을 작성해야 하기 때문에 매우 불편하다.

  • 프로그래밍 언어자연어기계어중간에 위치한 언어이다.

  • 컴파일러는 프로그래밍 언어로 작성된 코드를 기계어로 번역하여 컴퓨터가 실행할 수 있도록 한다.

프로그래밍 언어를 사용하면 사람이 이해하기 쉬운 형태로 코드를 작성할 수 있으며, 컴파일러가 이를 컴퓨터가 이해할 수 있는 기계어로 변환해 준다. 이를 통해 프로그래머는 보다 효율적으로 프로그램을 작성할 수 있게된다


컴파일러(Compiler)

  • 컴파일러인간과 컴퓨터 사이의 통역이라고 할 수 있다.

즉, 사람이 이해할 수 있는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 기계어로 번역해 주는 역할을 한다. 컴파일러 덕분에 프로그래머는 복잡한 이진수 대신 더 직관적인 언어로 프로그램을 작성할 수 있다.


프로그래밍 언어의 분류: 기계어(Machine language)

A simple machine language program. | Download Scientific Diagram

  • 기계어특정 컴퓨터의 명령어(instruction)를 이진수로 표시한 것이다.

  • 0과 1로 구성된다.

  • 하드웨어에 종속적이며, 기계어는 컴퓨터의 하드웨어 구조에 따라 다르게 설계된다.

즉, 기계어는 컴퓨터가 직접 이해하고 실행하는 언어로, 각 컴퓨터의 하드웨어에 맞춰 설계되기 때문에 다른 하드웨어에서는 동일한 기계어를 사용할 수 없다.


프로그래밍 언어의 분류: 어셈블리어(Assembly language)

The Unnecessary Obscurity of Assembly Language - by Babbage

  • 어셈블리어는 CPU의 명령어들을 이진수 대신 영어의 약자 기호로 표기한 언어이다.

  • 기계어보다는 더 높은 수준에서 프로그램을 작성할 수 있게 한다.

  • 기호CPU의 명령어일대일 대응 관계를 가진다.

  • 기계어와 마찬가지로 특정 CPU에 의존적이다.

  • **어셈블러(Assembler)**는 어셈블리어의 기호를 이진수로 변환하는 프로그램이다.

어셈블리어는 기계어보다 읽기 쉽고 다루기 쉬운 프로그래밍 언어로, 프로그램을 더 쉽게 작성할 수 있도록 하지만, 여전히 CPU와 매우 밀접한 저수준 언어로 분류된다.


프로그래밍 언어의 분류: 고급언어(High-Level Language)

High-Level Language Definition

  • 고급 언어특정한 컴퓨터의 구조나 프로세서에 무관하게, 독립적으로 프로그램을 작성할 수 있는 언어이다.

  • 대표적인 고급 언어로는 C, C++, JAVA, FORTRAN, PASCAL 등이 있다.

  • 컴파일러는 고급 언어로 작성된 문장을 기계어로 변환하는 프로그램이다.

고급 언어는 하드웨어와 독립적이기 때문에 한 번 작성된 프로그램을 다양한 플랫폼에서 실행할 수 있다. 이는 프로그래머가 복잡한 하드웨어 세부 사항에 신경 쓰지 않고도 효율적으로 코드를 작성할 수 있게 한다.


저급언어와 고급언어(Low-level language and High-level language)

  • 고급 언어라고 부르는 이유는, 이 언어들의 구성이 기계어보다는 인간의 언어에 더 가깝기 때문이다. 고급 언어는 프로그래머가 더 쉽게 이해하고 사용할 수 있도록 설계되어 있다.

  • 반대로, 어셈블리어 등은 기계어에 더 가깝기 때문에 저급 언어로 분류된다. 저급 언어는 컴퓨터의 하드웨어와 밀접한 관계를 가지고 있으며, 기계어에 더 직접적으로 대응할수 있다.

결론적으로, 고급 언어는 프로그래머가 더 직관적이고 간단하게 코드를 작성할 수 있게 해주며, 저급 언어는 컴퓨터의 내부 동작을 보다 세밀하게 제어할 수 있게 해준다.


고급언어의 종류


C언어의 소개

  • C언어는 1970년대 초 AT&TDennis Ritchie에 의해 개발되었다.

  • B언어의 후속으로, 더 발전된 형태로 C언어가 탄생하였다.

  • UNIX 운영 체제 개발에 필요한 도구로 만들어졌다.

  • C언어는 처음부터 전문가용 언어로 설계되었다.

C언어는 시스템 소프트웨어, 특히 운영 체제를 개발하기 위해 만들어졌으며, 이후 다양한 응용 프로그램 개발에도 널리 사용되면서 현대 프로그래밍 언어의 기초가 되었다.


C언어의 버젼

  1. K & R C

    • 1978년, "The C Programming Language" 책이 출간되었다.

    • 이 책은 비공식적인 명세서 역할을 하였으며, C언어의 기초를 정립하였다.

  2. ANSI C

    • 1983년, ANSI(American National Standards Institute)에서 X3J11 위원회를 통해 C언어 표준화 작업이 진행되었다.

    • ANSI C는 공식적으로 표준화된 C언어 버전이다.

  3. C99

    • 1999년에 ISO에 의해 표준으로 제정되었다.

    • C++에서 사용되는 특징들이 추가되었으며, 더 많은 컴파일러가 이 버전을 지원하게 되었다.

  4. C11

    • ISO에 의해 2011년 12월에 발표된 C언어 표준이다.

    • 현대적인 기능들이 추가되었으며, C언어의 최신 표준 중 하나로 자리 잡았다.

  5. C17, C18

    • 2018년 6월, ISO/IEC 9899:2018로 발표된 C17이 현재 표준이다.

    • 새로운 언어 기능은 추가되지 않고, C11 버전의 기술적인 결함만 수정되었다.

이러한 표준들은 C언어가 시간이 지나면서도 강력하고 유연한 언어로서 지속적으로 발전해왔음을 보여준다. 또한 C언어에서 변형된 고급언어가 많기 때문에 C언어를 배우면 다른언어들(자바, C++ 등)을 쉽게 배울 수 있다는 장점이 있다.


C언어의 특징

  • 간결하다: C언어는 불필요한 요소를 배제한 간결한 조를 가지고 있어, 프로그램을 보다 효율적으로 작성할 수 있다.

  • 효율적이다: 컴파일된 C언어 코드는 실행 속도가 빠르고, 메모리와 CPU 자원을 효율적으로 사용할 수 있다.

  • 저수준 및 고수준 프로그래밍 가능: C언어는 하드웨어를 직접 제어할 수 있는 저수준 프로그래밍이 가능하면서도, 고수준의 추상적인 프로그래밍 작업도 지원한다.

  • 이식성이 뛰어나다: C언어로 작성된 프로그램은 여러 운영체제나 하드웨어 환경에서 쉽게 이식할 수 있다. 쉽게 말하면 나무를 옮겨심듯이 다른 컴퓨터에서도 사용할 수 있다.

  • 컴퓨터 하드웨어 이해: C언어를 배우면 컴퓨터 하드웨어가 어떻게 동작하는지 더 깊이 이해할 수 있다.

이러한 특성들 덕분에 C언어는 시스템 프로그래밍과 응용 프로그램 개발에서 모두 널리 사용되고 있다.


C언어의 단점

  • 초보자가 배우기 어렵다: C언어는 구조가 간결하지만, 메모리 관리와 같은 저수준 개념을 직접 다뤄야 하기 때문에 초보자에게는 배우기가 어렵다.

  • 포인터의 오용 가능성: C언어는 하드웨어를 제어하기 위해 필수적인 포인터를 사용하지만, 이를 잘못 사용하면 메모리 오류나 버그가 발생할 수 있다.

이러한 단점들은 C언어의 강력함과 유연성에서 비롯되지만, 초보자에게는 도전적인 부분으로 작용할 수 있다.


앞으로도 C언어는 사용될 것인가?

  • C언어는 C++와 JAVA의 공통적인 부분으로, 많은 현대 프로그래밍 언어들의 기반을 이루고 있다.

  • 실행 속도가 중요한 프로그램은 여전히 C언어로 구현된다. C언어는 매우 효율적이고 빠르기 때문에 성능이 중요한 시스템에서 많이 사용된다.

  • 임베디드 시스템에서 C언어는 널리 사용된다. 임베디드 시스템이란 MP3 플레이어, 핸드폰 등과 같이 특수 목적을 가진 장치 내에 컴퓨터가 포함된 시스템을 의미하며, 이 분야에서는 C언어가 강력하고 적합한 선택이다.

이러한 이유들로 인해 C언어는 앞으로도 다양한 분야에서 계속 사용될 것으로 보인다.

💡 스마트폰도 CPU와 플래시 메모리 등이 들어가 있는 임베디드 시스템이다.


C언어의 사용처

이 이미지는 C 프로그래밍 언어가 중심에 위치해 있으며, 다양한 분야에서의 영향력과 사용 사례를 보여준다.

  1. 컴파일러 및 인터프리터:

    • GCC (GNU 컴파일러 컬렉션) 및 Python (고수준 프로그래밍 언어)과 같은 도구들은 C를 기반으로 하거나 C를 사용하고 있다.
  2. 그래픽 사용자 인터페이스:

    • OpenGL (2D 및 3D 벡터 그래픽을 렌더링하는 라이브러리) 및 GTK (그래픽 사용자 인터페이스를 생성하는 툴킷) 같은 라이브러리들이 C로 작성되었다.
  3. 운영 체제:

    • Linux와 같은 널리 사용되는 운영 체제는 C로 작성되었다.
  4. 웹 개발:

    • ApacheNGINX와 같은 웹 서버들은 효율적인 성능과 확장성을 위해 C를 사용하여 개발되었다.
  5. 데이터베이스:

    • PostgreSQLSQLite와 같은 데이터베이스 시스템들은 C로 구현되어 있어 높은 효율성과 속도를 자랑한다.
  6. 임베디드 시스템:

    • AVR libc (Atmel AVR 마이크로컨트롤러를 위한 라이브러리) 및 Arduino 같은 도구와 라이브러리들이 C에 크게 의존하고 있다.

이 이미지는 C언어가 시스템 프로그래밍부터 그래픽 인터페이스, 웹 개발에 이르기까지 여러 분야에서 여전히 중요한 역할을 하고 있음을 강조한다.


3️⃣알고리즘 (Algorithms)

알고리즘이란?

  • 알고리즘(algorithm): 문제를 해결하기 위해 컴퓨터가 수행해야 하는 단계적인 절차를 기술한 것이이다.

  • 예시: 전화번호부에서 특정한 사람(예: 박철수)의 전화번호를 찾는 문제를 생각해 보자 이 문제를 해결하기 위해 필요한 단계들을 명확하고 체계적으로 정의하는 것이 알고리즘이다.

알고리즘은 문제 해결을 위한 일련의 명확한 지침으로, 컴퓨터 프로그램의 핵심적인 역할을 한다.


빵을 만드는 알고리즘


1부터 10까지의 합을 구하는 알고리즘

  1. 방법 1: 숫자를 하나씩 더하는 방법

    • 1부터 10까지의 숫자를 직접 하나씩 더한다.

    • 계산:
      1+2+3+...+10=551 + 2 + 3 + ... + 10 = 551+2+3+...+10=55

  2. 방법 2: 숫자 그룹핑 방법

    • 두 수의 합이 10이 되도록 숫자를 그룹핑하여 그룹의 개수에 10을 곱한 후, 남은 숫자 5를 더한다.

    • 예를 들어:
      (1+9)+(2+8)+(3+7)+(4+6)=40(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) = 40(1+9)+(2+8)+(3+7)+(4+6)=40
      40+5=5540 + 5 = 5540+5=55

  3. 방법 3: 공식을 사용하는 방법

    • 1부터 n까지의 합을 구하는 공식:
      n(n+1)/2n(n+1)/2n(n+1)/2

    • 이를 1부터 10까지의 합에 적용하면:
      10(10+1)/2=10×11/2=5510(10+1)/2 = 10 \times 11 / 2 = 5510(10+1)/2=10×11/2=55

만약 1부터 100만까지의 합을 구하는 경우라면 2번의 방법이 효율적이다. 위와 같이 같은 작업을 수행하더라도 어떤 알고리즘을 구상하느냐에 따라 결과는 같지만 과정이 달라진다. 알고리즘 구상시엔 “소요시간”을 제일 우선으로 둔다.


알고리즘의 기술방법

  1. 자연어 (Natural Language)

    • 사람의 일상 언어로 알고리즘을 설명하는 방법이다. 직관적이지만, 정확성과 명확성이 떨어질 수 있다.

    • 예: "1부터 10까지의 숫자를 차례대로 더한다."

  2. 순서도 (Flowchart)

    • 알고리즘을 시각적으로 표현하는 방법으로, 도형화살표를 사용해 흐름과 단계를 나타낸다. 복잡한 알고리즘을 명확하게 이해할 수 있게 도와준다.

    • 예: 시작 → 1부터 10까지 더함 → 결과 출력 → 끝

  3. 의사 코드 (Pseudo-code)

    • 실제 프로그래밍 언어는 아니지만, 프로그래밍 구조에 가까운 형태로 알고리즘을 기술하는 방법이다. 알고리즘의 논리적 흐름을 명확하게 표현할 수 있다.

    • 예:

        bashCopy codesum = 0
        for i = 1 to 10:
            sum = sum + i
        print(sum)
      

이 세 가지 방법은 알고리즘을 설명하거나 구현할 때 각각의 목적에 맞게 사용한다.


알고리즘의 예: Flowchart와 step

알고리즘의 기술

순서도 (Flowchart)

  • 순서도프로그램에서의 논리적 순서(logical sequence) 또는 작업 순서(process flow)그림으로 표현하는 방법이다.

  • 순서도는 도형화살표를 사용하여 알고리즘이나 작업의 흐름을 시각적으로 나타내어(depict), 복잡한 프로세스를 쉽게 이해할 수 있게 한다.

주요 도형(Key Shapes)

  1. 원, Oval (시작/종료 Start/End): 프로그램의 시작과 끝을 나타낸다.

  2. 사각형, Rectangle (처리 Process): 계산, 변수 할당 등의 처리를 나타낸다.

  3. 마름모, Diamond (조건/결정 Condition, Decision): 조건문이나 분기를 나타내며, "예" 또는 "아니오"로 분기한다.

  4. 화살표, Arrow: 단계 간의 흐름을 연결한다.

  5. 평행사변형, Parallelogram (입력/출력 Input/Output): 데이터를 입력받거나 출력하는 과정을 나타낸다.


알고리즘의 예: 학교 홈페이

의사코드(Pseudo-code)

  • 의사코드(pseudo-code)는 자연어보다는 더 체계적이고, 프로그래밍 언어보다는 덜 엄격한 언어로, 주로 알고리즘을 표현하는 데 사용되는 코드이다.

  • 의사 코드는 실제 프로그래밍 언어처럼 복잡하지 않지만, 알고리즘의 흐름과 논리를 쉽게 이해할 수 있도록 표현한다.

예시: 학생 10명의 성적을 입력받아 평균을 계산하는 알고리즘을 의사 코드로 표현하면 다음과 같다.

위의 코드를 실행하면 에러가 생긴다. 그 이유는 grade ⬅️ grade + total 때문이다. 이를 논리적인 오류라고 한다. 컴퓨터로 점검하면 아무 이상이 없지만 결과가 나오지 않는 경우다. 새로운 변수인 total에 합쳐진 데이터를 저장해야 해결할 수 있다. total ⬅️ grade + total


알고리즘의 중요성

  • 컴퓨터에게 좋지 못한 알고리즘을 제공하면, 나쁜 결과를 얻을 수밖에 없다.

  • 이를테면, 스마트폰, 가전제품, 자동차에서 발생하는 다양한 오류들을 생각해 보자. 이러한 오류들은 종종 잘못된 알고리즘에 기인한다.

  • 알고리즘에 오류가 없어야 컴퓨터 프로그램도 논리적인 오류 없이 정상적으로 동작하게 된다.

따라서, 알고리즘의 정확성과 효율성은 프로그램의 성공적인 작동에 매우 중요한 요소이다.


알고리즘을 만드는 방법

  1. 문제를 한 번에 해결하려고 하지 말고, 더 작은 크기의 문제들로 분해한다.

  2. 문제가 충분히 작아질 때까지 계속해서 분해한다.

이 접근 방식은 분할 정복(Divide and Conquer) 전략의 기본 원리로, 복잡한 문제를 여러 개의 더 작은 문제로 나누어 처리함으로써 전체 문제를 보다 쉽게 해결할 수 있게 한다.


Lab: 프린터 고장을 처리하는 알고리즘

Lab: 합격, 불합격을 판단하는 알고리즘

Mini Project: 3개의 수 중에서 최대값 찾기

리스트에서 가장 큰 숫자를 찾는 알고리즘 (의사 코드)

  1. 리스트의 첫 번째 숫자가 가장 큰 숫자라고 가정한다.

  2. 리스트의 나머지 숫자 각각에 대해 반복한다:

    • 현재 숫자가 현재 가장 큰 숫자보다 크면, 그 숫자를 새로운 가장 큰 숫자로 간주한다.
  3. 리스트에 남은 숫자가 없으면, 현재 가장 큰 숫자가 리스트에서 가장 큰 숫자가 된다.


다음은 위 알고리즘을 기반으로 한 의사 코드이다.

markdownCopy code1. 가장 큰 수 = 리스트의 첫 번째 숫자로 설정
2. 두 번째 숫자부터 리스트의 끝까지 각 숫자에 대해:
     a. 만약 그 숫자가 가장 큰 수보다 크면:
           i. 가장 큰 수를 그 숫자로 설정
3. 현재 설정된 가장 큰 수가 리스트에서 가장 큰 숫자이다.

이 알고리즘은 리스트의 모든 숫자를 비교하여 가장 큰 값을 찾아낸다.

알고리즘

도전문제

  • 위의 알고리즘을 순서도로 그려보자.

  • 최소값을 구하도록 의사 코드를 수정해보자. 어디만 수정하면 되는가? >를 <로 바꾼다.