## High-Level Programming Language
- 어셈블리어를 사용하면 프로그래머가 기계어가 아닌 니모닉을 사용해서 명령을 나타낼 수 있으나 여전히 기계의 관점에서 생각해야 함
→ 프로그래머의 관점에서 이해하기 쉬운 formal한 방식의 High-level programming language 등장
<br>
- High-level language의 요소
- Boolean expressions
- Data Typing
- Input/Output Structures
- Control Structures: selection, repetition
- Subprograms, Prameter Passing
<br>
- 어셈블러가 어셈블리어를 기계어로 변환해주듯이 high-level language 변환에는 **컴파일러, 인터프리터**가 사용됨
- **컴파일러(Compiler)** : high-level language를 기계어로 변환해주는 프로그램
![[compiler.png|center|400]]
<br>
- **인터프리터(Interpreter)** : 순서대로 statements를 번역하고 실행하는 프로그램
- 기계어를 출력한 다음 별도의 단계로 실행을 하는 어셈블러, 컴파일러와 달리 인터프리터는 번역 후 바로 실행함
<br>
#### Virtual Machine(가상 머신)
- 인터프리터를 프로그램을 작성한 언어를 이해하는 시뮬레이터 혹은 가상 머신으로 이해할 수 있음
- Java는 어느 환경에서나 동작하기 위해 Bytecode라는 표준 기계어로 컴파일 됨
- **JVM(Java Virtual Machine)**이라는 소프트웨어 인터프리터가 바이트코드 프로그램을 가져다가 실행함
- JVM이 있는 모든 컴퓨터는 컴파일된 Java 프로그램을 실행할 수 있음
→ _WORA_: Write Once, Run Anywhere!
![[JVM.png|center|600]]
<br>
## 프로그래밍 패러다임 ✨
> **패러다임**
> 패턴 혹은 모델을 뜻하는 용어
<br>
[[프로그래밍 패러다임, 함수형 프로그래밍|프로그래밍 패러다임(Programming Paradigm)]]은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서는 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다.
- 명령형 프로그래밍 : 프로그래밍의 **상태**와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식
- 절차적 프로그래밍 : 수행되어야 할 **연속적인 계산 과정**을 포함하는 방식 (C, C++)
- [[객체 지향 프로그래밍, OOP의 개념과 특징|객체지향 프로그래밍]] : 80년대 이후, 객체들의 집합으로 **프로그램의 상호작용**을 표현 (C++, Java, C#)
- 선언형 프로그래밍 : 어떤 방법으로 해야 하는지(How)를 나타내기보다 **무엇(What)과 같은지**를 설명하는 방식
- [[프로그래밍 패러다임, 함수형 프로그래밍|함수형 프로그래밍]] : **순수 함수**를 조합하고 소프트웨어를 만드는 방식 (클로저, 하스켈, 리스프)
- 논리형 프로그래밍 : 논리 문장을 이용하여 프로그램을 표현하고 계산을 수행하는 개념에 기반을 둔 방식
<br>
#### 객체지향 방법론(Object-Oriented Methodology)
- 솔루션을 함수 위주가 아니라 객체(object) 위주로 만들자는 개념
- 데이터와 연산으로 이루어진 객체
- 객체 간의 상호 작용에 초점을 맞춤
<br>
###### 객체와 클래스
- 객체(object)는 문제의 맥락 안에서 의미 있는 개체를 뜻함 (??)
- "everything in the real-world"
- 객체는 서로 메시지를 전송(서로의 하위 함수를 호출)하여 통신함
- 클래스(class)는 유사한 개체들의 그룹
- 객체를 관련된 그룹으로 분류하고 그들의 공통적인 특징을 설명하는 아이디어
- 객체가 무엇이고(필드), 어떻게 동작하는지(메소드)를 나타내는 표현
- 필드(field, attribute: 클래스의 속성) + 메소드(method: 객체의 데이터 값을 다루는 명명된 알고리즘)로 이루어짐
> 클래스는 붕어빵 틀, 인스턴스는 클래스로 찍어낸 붕어빵
<br>
<br>
<br>
<br>