# Part 01. Hello World!

## 언어의 역사

* 대량의 데이터를 기억하고 연산하는 컴퓨터를 보고 있자면 경외심이 들때가 있습니다. \
  하지만 컴퓨터는 0과 1밖에 이해하지 못하는데 '사실 내가 더 똑똑한게 아닐까?' 하는 생각을 할 때가 있습니다. \
  Java 언어를 본격적으로 학습하기에 앞서 프로그래밍 언어가 어떻게 발전해 왔는지 간단하게 살펴보고 가겠습니다.
* 우리는 컴퓨터와 대화하기 위해 눈높이를 낮출 필요가 있었습니다. \
  그렇지만 우리는 매우 똑똑한 고등 생물...입니다...

  > 48시간은 며칠일까? \
  > 180분은 몇 시간일까? \
  > 365일은 몇 년일까?
* 우리는 단번에 2일, 3시간, 1년 이라고 답을 내릴 수 있을 것입니다. \
  반대로 컴퓨터는 어떨까요? \
  2진법 밖에 할 줄 모르는 컴퓨터는 10, 24, 60, 365 진법을 한번에 계산하는 우리를 경외하지 않을까요?
* 대신 컴퓨터는 매우 빠른 속도를 가지고 있습니다. \
  컴퓨터의 두뇌 역할을 하는 CPU가 3.2GHz 라면 1core 기준 컴퓨터는 1초당 대략 32억번의 연산을 수행합니다.
* 즉, 컴퓨터는 <mark style="color:blue;">바보지만 빠르고 정확한 친구</mark>입니다. 간단하게 컴퓨터가 어떻게 연산을 하는지 살펴 보겠습니다.

  > 애드삭 전자계산기: 1 + 3 => 01010101 00000001 00001001 \
  > 유니박 컴퓨터: 1 + 3 => 11011100 00011000 10011000
* 우리 사람은 1 + 3 이라고 하면 바로 이해하고 계산할 수 있지만 컴퓨터는 이를 0과 1로 표현해야 합니다. \
  컴퓨터가 이해할 수 있게 <mark style="color:blue;">'01010101 00000001 00001001'</mark> 이렇게 표현이 되는 언어를 우리는 <mark style="color:blue;">기계어</mark>라고 부릅니다.
* 앞에서 컴퓨터와 대화를 하기 위해 우리가 눈높이를 낮췄다고 했지만 기계어는 사람의 입장에서는 너무 복잡하고 어렵습니다.
* 그래서 우리는 이를 해결하기 위해 <mark style="color:blue;">기계 명령어와 일상 용어를 일대일로 매칭하는 기계어와 니모닉의 매칭 코드표</mark>를 만들었습니다.

## 어셈블리어

* 그 매칭 코드표를 <mark style="color:blue;">‘어셈블리’</mark> 라고 불렀습니다. \
  그리고 <mark style="color:blue;">CPU 마다 실행할 수 있는 기계어가 달랐기 때문</mark>에 어셈블리어도 다르게 만들어졌습니다. \
  추가로 어셈블리어를 기계어로 번역해 주는 소프트웨어는 <mark style="color:blue;">‘어셈블러’</mark> 라고 불렀습니다.
* &#x20;”더하기를 의미하는 기계어 01010101 에 매칭 되는 어셈블리의 니모닉은 add 라고 정하자! “ \
  ⇒ ex) add 1, 3

<figure><img src="https://1460556410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3hxjcsx6VFJEpkIV3dzZ%2Fuploads%2F7tkNvh62fwfQ0gSZjoIs%2Fimage.png?alt=media&#x26;token=0c6b03cc-6672-49e3-bf6a-74c17a27b712" alt=""><figcaption></figcaption></figure>

* 어셈블리어의 등장으로 많은 개발자들이 편해졌지만 아직 더 개선되어야 할 점이 있었습니다.&#x20;
* \
  애드삭 어셈블리어 개발자가 유니박 어셈블리어 프로그래머로 이직을 하려면 유니박용 어셈블리어를 다시 배워야 했습니다.

  <figure><img src="https://1460556410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3hxjcsx6VFJEpkIV3dzZ%2Fuploads%2FxryoeZTVamU7qehXHoD4%2Fimage.png?alt=media&#x26;token=61be2281-4f43-44cd-b626-5689c70889b1" alt=""><figcaption></figcaption></figure>
* 이를 해결하기 위해 어셈블리어 이후 많은 언어들이 등장했지만 다음으로는 우리 모두가 알고 있는 C언어의 등장을 보겠습니다.

## C언어

* 어셈블리어로 개발을 할 때는 같은 작업을 수행하는 소스 파일을 각 기계의 종류만큼 만들어야 했지만 C언어의 등장으로 이제는 소스파일을 단 하나만 만들어도 되는 시대가 되었습니다.

<figure><img src="https://1460556410-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3hxjcsx6VFJEpkIV3dzZ%2Fuploads%2FMFJyxgxAErZES7MI03cq%2Fimage.png?alt=media&#x26;token=ddc3025f-e980-41fd-99f9-5ef2d11e86a6" alt=""><figcaption></figcaption></figure>

* C언어는 하나의 소스파일을 각 기계어 에 맞는 컴파일러로 컴파일을 하여 <mark style="color:blue;">기계어 목적파일</mark>을 만들기 때문에 개발자는 소스파일이 <mark style="color:blue;">동작하는 기계에 상관없이 개발</mark>이 가능해 졌습니다.
* 즉, C언어는 <mark style="color:blue;">하나의 소스만 작성하면 모든 기종의 컴퓨터에서 실행</mark>이 가능합니다.
* 물론 C언어는 어셈블리어와 비교하면 이상적인 상황이지만 운영체제들은 각각의 특성이 존재하기 때문에 C언어를 컴파일 하기전에 각 기종별로 소스코드를 수정할 필요가 있습니다.

  > short는 int 보다 크지 않은 정수
  >
  > long은 int 보다 작지 않은 정수
* 풀어서 설명하자면 어떤 운영체제는 int 타입을 2바이트로 인지하고, 다른 어떤 운영체제는 int를 4바이트로 인지한다는 뜻입니다.
* 어셈블리어로 개발할 때와 비교하자면 매우 편해졌지만 아직도 개선할 점이 있었습니다.

## Java의 등장

* Java는 <mark style="color:blue;">‘객체지향 언어’</mark> 입니다. \
  객체지향? 아직은 생소하거나 이해가 되지 않겠지만 이는 차차 알아보도록 하겠습니다!
* C에 객체지향 개념을 도입한 C++ 이라는 언어도 존재하지만 Java 와는 결이 다릅니다. \
  객체지향 언어의 중심에는 클래스(Class)가 있습니다.
* C++은 클래스 없이도 개발이 가능하기 때문에 <mark style="color:blue;">객체지향지원 언어</mark>라고 부르기도 합니다.
* 반대로 Java는 클래스 없이는 개발이 불가능 합니다. \ <mark style="color:blue;">Java는 개발의 시작과 끝 모두 클래스에서 시작하고 클래스에서 끝나게 됩니다.</mark>
* 프로그램이 시작하는 <mark style="color:blue;">main()</mark> 메서드로 예를 들어보자면 C++은 클래스와는 별개로 존재할 수 있지만 <mark style="color:blue;">Java는 무조건 클래스 내부에 존재</mark>해야 합니다.

{% tabs %}
{% tab title="C++" %}

```cpp
#include <iostream>

using namespace std;

class student {
private:
	char * name;
	int age;
public:
	void Study();
};

void student::Study()
{
	cout << "공부!" << endl;
}

int main()
{
	student stu;
	stu.Study();
	return 0;
}
```

{% endtab %}

{% tab title="Java" %}

```java
public class Student {
    private String name;
    private int age;

    public void study(){
        System.out.println("공부");
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.study();
    }
}
```

{% endtab %}
{% endtabs %}

* 그럼 Java의 장점에 대해서 한번 이야기 해보겠습니다.
* <mark style="color:blue;">Java는 단 하나의 소스 파일로 모든 기종의 컴퓨터에서 실행</mark>이 가능합니다.
* 아마도 "그럼 C언어랑 같은 거 아니야?" 라고 대부분 생각 하셨을 겁니다.&#x20;

> #### C언어와의 차이를 이해하기 위해서 추후에 JVM 에 대해서 학습하겠습니다.

{% hint style="info" %}
니모닉 이란?\
비유법, 다른 유사한 것에 빗대어 잘 모르는 것을 설명하고자 하는 방법을 뜻합니다.
{% endhint %}

{% hint style="info" %}
컴파일 이란?&#x20;

컴퓨터는 0과 1만 이해할 수 있습니다. 우리가 인간의 언어 즉, 자연어를 컴퓨터에 입력하더라도 이것을 0과 1로 이루어진 이진코드로 해석해야 합니다.

* 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정.
* 주어진 언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 과정.
* 우리가 작성한 원시코드를, 컴퓨터가 이해할 수 있는 목적코드로 번역하는 과정.

이와 같은 컴파일의 기능을 수행하는 것을 컴파일러라고 부릅니다.
{% endhint %}
