프로그래밍이란? 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션.
프로그래밍에 앞서 해결해야 할 문제(요구사항)를 명확히 이해한 후 적절한 문제 해결 방안을 정의할 필요가 있다.
이때 요구 되는 것이 문제 해결 능력
이다. 대부분의 문제는 복잡하며 명확하지 않을 수 도 있다.
따라서 문제를 명확히 이해하는 것이 우선되어야 하며 복잡함을 단순하게 분해(decomposition)하고
자료를 정리하고 구분(Modeling)해야 하며 순서에 맞게 행위를 배열해야 한다.
다시 정리해서, 프로그래밍이란, 0과 1 밖에 모르는 기계가 실행할 수 있을 정도로 정확하고 상세하게 요구사항을 설명하는 작업이며, 그 결과물이 바로 코드이다. 우리는 문제 해결 방안을 고려할 때 컴퓨터의 입장에서 문제를 바라봐야 한다. 이 때 필요한 것이 Computional thinking(컴퓨팅 사고)이다. 문제 해결 능력은 직감과 직관의 영역인데, 이는 문제를 바라보는 우리의 사고와 경험에 영향을 받는다.
사람의 일반적인 사고 방식은 매우 포괄적이며, 실생활에서 경함하는 익숙한 사항에 대해 당연시하는 안이한 인식이 있다. wow.
예를 들어 “걷다”라는 기능을 디자인하려면 판단해야하는 상태와 그 상태를 판단하는 시기, 그리고 판단 기준을 정의해야 하며, 이를 바탕으로 분해한 처리(process)의 실행 여부를 결정한다. 예를 들어, 장애물이란 무엇(크기, 움직임 등)인지, 어떤 범위 내에 있는 것인지 명확히 수치화해서 정의해야 한다.
문제 해결 능력을 바탕을 정의된 문제 해결 방안은 컴퓨터에게 전달되어야 한다. 명령을 수행해야하는 주체는 컴퓨터. 따라서 사람이 이해할 수 있는 자연어가 아니라 컴퓨터가 이해할 수 있는 언어, 즉 기계어(machine code)
로 명령을 전달해야 한다.
하지만 사람이 기계어를 이해해서 기계어로 직접 명령을 전달하는 것은 어렵다. 가장 유용한 대안은 사람이 이해할 수 있는 약속된 구문(Syntax), 문법으로 구성된 프로그래밍 언어
를 사용해 프로그램을 작성 후 컴퓨터가 이해할 수 있는 기계어로 변환하는 일종의 변역기를 이용하는 것이다. 이 일종의 번역기를 컴파일러(Compiler) 혹은 인터프리터(interpreter)라고 한다.
언어는 자신의 생각을 상대에게 전달할 수 있는 방법. 언어는 자연어와 인공어로 구분한다.
프로그래밍 언어란? 컴퓨터와의 대화에 사용되는 일종의 표현 수단. 사람과 컴퓨터 모두가 이해할 수 있는 약속된 형태의 인공어 이다.
console.log('Hello world');
프로그래밍은 프로그래밍 언어를 사용해 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션. 프로그래밍 언어는 구문(syntax)과 의미(semantics)의 조합으로 표현된다.
프로그래밍 학습은 언어의, 문법을 배우는 것부터 시작한다. 하지만 문법을 잘 안다고 해서 외국어를 잘한다고 말할 수 없다.
외국어를 잘하는 것은 화자의 말이나 문장을 이해하고 문맥에 따른 적절한 어휘 선택, 그리고 순차적으로 결론을 향해 나아가는 문장 구성이 필요하다.
즉 문법에 맞는 문장을 구성하는 것은 물론 의미(semantics)를 가지고 있어야 언어의 역할을 충분히 수행할 수 있다.
Colorless green ideas sleep furiously - 노엄 촘스키(Noem Chomsky)
노엄 촘스키는 위 문장을 통해 언어의 의미는 문맥에 있는 것이지 문법에 있는 것이 아니라는 점을 지적했다. 위의 문장은 문법적으로 문제가 없지만, 의미가 없다. 프로그래밍도 마찬가지다.
const number = 'string';
console.log(number * number); // NaN
자바스크립트 변수에는 어떠한 타입의 값도 할당할 수 있다. 따라서 위 예제가 문법적으론 문자가 없다. 하지만 의미적으로 옳지 않다.
number라는 이름의 변수에 문자열이 할당 되어 있기 떄문이다. number라는 변수에는 숫자를 할당하는 것이 옳다.
문제 해결 능력을 통해 만들어낸 해결 방안은 프로그래밍 언어의 문법을 사용해 표현한다.
작성된 코드는 해결방안의 구체적 구현물이다. 이것은 프로그래밍 언어의 문법에 부합하는 것은 물론이고 수행하고자 하는 바를 정확히 수행하는 것. 즉 요구사항이 실현(문제가 해결)되어야 의미가 있다.
프로그래밍 언어가 제공하는 문법을 적절히 사용하여 변수를 통해 값을 저장하고 참조하며 연산자로 값을 연산, 평가하고 조건문과 반복문에 의한 흐름 제어로 코드의 실행 순서를 제어하고 함수로 재사용 가능한 문의 집합을 만들며 객체, 배열 등으로 자료를 구조화한다.
결국 프로그래밍은 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 후, 그 흐름을 제어하는 것이다.