프로그래밍
컴퓨터과학은 프로그래밍을 연구하는 것이 아닙니다. 그러나 프로그래밍은 컴퓨터 과학자가 수행하는 중요한 일의 한 부분입니다. 프로그래밍은 우리의 풀이법을 표현하는 방법입니다. 따라서 이 프로그램 언어 표현과 그것을 작성하는 과정은 컴퓨터 과학의 기본이 됩니다.
프로그래밍은 알고리즘을 컴퓨터가 실행할 수 있는 프로그래밍 언어로 인코딩하는 절차입니다.
여러 다른 종류의 프로그램 언어와 컴퓨터가 존재하지만, 프로그래밍의 첫 단계는 알고리즘을 표현하는것 입니다. 알고리즘이 없는 프로그램은 없습니다.
알고리즘은 문제의 현재상태를 표현하는데 필요한 데이터와 의도한 결과를 생성하는데 필요한 일련의 절차로 문제의 해결법을 기술합니다. 따라서 프로그래밍 언어는 절차와 데이터를 모두를 표현할 수 있어야 합니다. 이를 위해 프로그래밍 언어는 if, else, for, while과 같은 종류의 프로그램의 흐름을 제어할 수 있는 제어구조와 자료형(Data Type)을 제공합니다.
제어구조로 알고리즘의 각 절차를 편리하면서도 명확하게 표현할 수 있습니다. 알고리즘을 표현하려면 프로그래밍 언어는 최소한 순차적 처리(프로그램은 작성된 순서로 위에서 아래로 흐르며 처리됩니다), 의사결정을 위한 선택(if, else), 반복수행(for, while)을 위한 반복을 표현할 수 있는 제어구조가 필요합니다.
컴퓨터의 모든 데이터는 이진수로 구성된 문자열로 나타냅니다. 이러한 문자열에 의미를 부여하기 위해 자료형이 필요합니다. 자료형에 따라 이진 문자열에 대한 해석방법이 달라집니다. 각 프로그램 언어는 이를 위해 내장 자료형 (원시 자료형이라고도 함)을 제공합니다.
예를 들어, 대부분의 프로그래밍 언어는 정수를 표현하는 자료형을 제공합니다. 따라서 컴퓨터 메모리의 이진수 문자열은 정수(예 : 23, 654 및 -19)로 해석될 수 있습니다. 또 자료형은 연산에 대한 의미도 제공합니다. 더하기(+), 빼기(-), 곱하기(*) 연산자가 숫자형(정수, 실수형) 자료형과 함께 사용된다면 이들은 산술 연산자를 의미합니다.
자료구조와 추상자료형
일반적으로 우리가 해결해야 하는 문제와 그 해결법은 매우 복잡합니다. 프로그래밍 언어에서 제공하는 간단한 제어 구문과 내장 자료형만으로도 우리의 풀이법을 충분히 표현할 수는 있으나, 그 결과가 상당히 복잡해지므로 우리가 다루기에 불편합니다. 때문에 이러한 복잡도를 낮추며 해결법을 작성할 방법이 필요합니다.
문제 및 문제 해결법의 복잡도를 낮추기 위해 컴퓨터 과학자는 추상화를 사용합니다. 이를 통해 세부사항을 잃지 않고 "큰 그림"에 집중할 수 있습니다. 문제 영역의 모델을 만들면 보다 효율적이고 효과적인 문제 해결 절차에 활용할 수 있습니다.
절차적 추상화는 특정 기능의 세부 정보를 숨겨 사용자나 클라이언트가 매우 높은 수준에서 볼 수 있도록 하는 절차입니다. 데이터 추상화 역시 이와 비슷합니다. ADT라고 줄여 말하기도 하는 추상 자료형은 구현 방법에 독립적으로 데이터를 보는 방법과 허용되는 연산을 논리적으로 기술한 것입니다. 즉, 데이터가 나타내는 내용에만 관심이 있고 데이터가 구성되는 방식에 관심이 없습니다. 이 수준의 추상화를 제공하여 데이터를 캡슐화합니다. 아이디어는 구현 사항을 캡슐화하여 사용자로부터 숨기는 것입니다. 이를 정보 숨기기(information hiding)라고 합니다.
다음 그림은 추상 자료형의 정의와 작동 방식을 보여줍니다. 사용자는 추상 자료형으로 지정된 연산을 사용하여 인터페이스와 상호 작용합니다. 추상 자료형은 사용자가 상호 작용하는 껍데기입니다. 구현은 한 단계 더 깊이 숨겨져 있습니다. 사용자는 구현의 세부 사항에 관심을 기울일 필요가 없습니다.
데이터 구조는 추상 자료형을 구현한 것으로 프로그래밍 구문과 기본 자료형의 컬렉션을 사용하여 데이터의 물리적 뷰를 제공해야 합니다. 앞에서 논의한 것처럼, 이 두 가지 관점을 분리하면 모델이 실제로 어떻게 구축될 것인지에 대한 세부 정보를 제공하지 않고도 문제에 대한 복잡한 데이터 모델을 정의할 수 있습니다. 이는 구현으로부터 독립적인 데이터 보기를 제공합니다. 일반적으로 추상 자료형을 구현하는 방법에는 여러 가지가 있기 때문에 이 구현 독립성은 프로그래머가 데이터 사용자와 상호 작용하는 방식을 변경하지 않고 구현 세부 사항을 전환할 수 있도록 합니다. 사용자는 문제 해결 절차에 계속 집중할 수 있습니다.
알고리즘을 배우는 이유
우리들은 경험을 통해 배웁니다. 다른 사람이 문제를 해결하는 것을 보거나 스스로 문제를 해결하며 배웁니다. 여러 문제 해결기법과 알고리즘이 어떻게 설계되어 있는지 확인하면 추후 마주하게 되는 어려운 문제를 해결하는 데 도움이 됩니다.
어떤 문제가 주어졌을 때 이를 해결하는 알고리즘이 여러 가지가 있는 경우가 있습니다. 예를 들어 제곱근을 구하는 sqrt
함수의 경우도 다양한 알고리즘 이 있습니다. 그중 어떤 알고리즘은 다른 것보다 훨씬 적은 리소스를 사용할 수 있습니다. 또 다른 알고리즘은 다른 알고리즘보다 결과를 반환하는 데 더 빠를 수 있습니다. 우리는 이들 중 어느 것을 사용할 것인지 판단해야 할 것입니다. 알고리즘을 공부하다 보면, 우리는 이들 알고리즘을 분석하는 방법을 배우게 됩니다. 이를 통해 우리는 한쪽이 다른 쪽보다 더 낫다고 판단할 수 있게 될 것입니다.