# 🌸01장. 프로그래밍

## ✅1.1 프로그래밍이란?

### 프로그래밍(Programming)

```
해결해야 할 문제(요구사항)를 명확히 이해한 후 정확하고 상세하게 요구사항을 설명하는 작업
```

* 복잡하고 명확하지 않을 수 있는 문제(요구사항)을 단순하게 분해(decomposition)하고 자료를 정리하고 구분(modeling)해야하며 순서에 맞게 행위를 배열해야 한다.
* 문제 해결 방안을 고려할 때, 컴퓨터의 입장에서 문제를 바라봐야하는데, 이때 필요한 것이 `컴퓨팅 사고(Computational thinking)`이다.

### 컴퓨팅 사고(Computational thinking)

```
"듣다(Listen)"라는 행위를 생각해보자

👩🏻👨🏻 사람
- 하나의 간단하고 당연한 기능
- 소리의 크기 : "크다" or "작다"로 표현 ( 상대적인 개념, 기준 불명확 )

💻 컴퓨터
- 소리의 크기 : "현재 볼륨보다 1단계 크게 조정하라" or "볼륨을 60으로 조정하라" ( 양적 개념인 숫자를 사용)

```

* 컴퓨터와 사람은 사고, 인지의 방식이 다르기 때문에, 컴퓨터의 관점에서 문제를 사고(Computational thinking)해야 한다.
* 논리적, 수학적 사고가 필요하며, 해결 과제를 작은 단위를 분해하고 패턴화해서 추출하며, 프로그래밍 내에서 사용될 모든 개념은 평가 가능하도록 정의해야한다.

## ✅1.2 프로그래밍 언어

### 프로그래밍 언어(programming language)

* 문제 해결 능력을 바탕으로 정의된 문제 해결 방안은 컴퓨터가 이해할 수 있는 언어인 `기계어(machine code)`로 전달해야한다.
* 하지만, 사람이 기계어를 이해해서 기계어로 직접 명령을 전달하는 일은 어렵다.
* 👉따라서, 사람이 이해할 수 있는 약속된 구문(문법)으로 구성된 `프로그래밍 언어(programming language)`를 사용해 프로그램을 작성한다. 그리고 `컴파일러(compiler)` 혹은 `인터프리터(interpreter)`를 이용해 컴퓨터가 이해할 수 있는 기계어로 변환한다.
* 프로그래밍 언어는 `구문(Syntax)`와 `의미(Sematics)`의 조합으로 표현된다.

## ✅1.3 구문과 의미

### 구문(Syntax)과 의미(Semantics)

```js
const number = "string";
console.log(number * number); // NaN
```

* 위의 예제를 살펴보면, 자바스크립트의 변수에는 어떠한 타입의 값도 할당할 수 없기 때문에 `구문(문법)`적으로는 전혀 문제가 없다.
* 하지만, number라는 이름의 변수에 문자열이 할당되어 있기 때문에 `의미`적으로는 옳지 않다.

### 프로그래밍의 목적은 문제 해결이다.

![img](https://camo.githubusercontent.com/8e6e3bb73d42644c903ac3f04724975d10523060e3a4e10a5c61a3bdd9ccbeff/68747470733a2f2f706f69656d617765622e636f6d2f696d672f636f64696e672e706e67)

* 문제 해결 능력을 통해 만들어낸 해결 방안은 프로그래밍 언어의 문법을 사용해 표현한다.
* 즉, 작성된 코드는 해결 방안의 구체적 구현물이다.
* 이 때, 수행하고자 하는 바를 정확히 수행하는 것, 즉 **요구사항이 실현(문제가 해결)되어야 의미(Semantics)가 있다.**

```
💡 프로그래밍은 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 후, 그 흐름을 제어하는 것이다.
```

* 개발자는 프로그래밍 언어가 제공하는 문법을 적절히 사용하여 변수를 통해 `값을 저장하고 참조`하며 연산자로 `값을 연산, 평가`하고 조건문과 반복문에 의한 흐름제어로 `코드의 실행 순서를 제어`하고 함수로 `재사용 가능한 문의집합`을 만들며 객체, 배열 등으로 `자료를 구체화`한다.
