💻Day 01. Hello World!

프로그래밍 언어.. 자바는 왜 배우나요?

언어의 역사

  • 대량의 데이터를 기억하고 연산하는 컴퓨터를 보고 있자면 경외심이 들때가 있습니다. 하지만 컴퓨터는 0과 1밖에 이해하지 못하는데 '사실 내가 더 똑똑한게 아닐까?' 하는 생각을 할 때가 있습니다. Java 언어를 본격적으로 학습하기에 앞서 프로그래밍 언어가 어떻게 발전해 왔는지 간단하게 살펴보고 가겠습니다.

  • 우리는 컴퓨터와 대화하기 위해 눈높이를 낮출 필요가 있었습니다. 그렇지만 우리는 매우 똑똑한 고등 생물...입니다...

    48시간은 며칠일까? 180분은 몇 시간일까? 365일은 몇 년일까?

  • 우리는 단번에 2일, 3시간, 1년 이라고 답을 내릴 수 있을 것입니다. 반대로 컴퓨터는 어떨까요? 2진법 밖에 할 줄 모르는 컴퓨터는 10, 24, 60, 365 진법을 한번에 계산하는 우리를 경외하지 않을까요?

  • 대신 컴퓨터는 매우 빠른 속도를 가지고 있습니다. 컴퓨터의 두뇌 역할을 하는 CPU가 3.2GHz 라면 1core 기준 컴퓨터는 1초당 대략 32억번의 연산을 수행합니다.

  • 즉, 컴퓨터는 바보지만 빠르고 정확한 친구입니다. 간단하게 컴퓨터가 어떻게 연산을 하는지 살펴 보겠습니다.

    애드삭 전자계산기: 1 + 3 => 01010101 00000001 00001001 유니박 컴퓨터: 1 + 3 => 11011100 00011000 10011000

  • 우리 사람은 1 + 3 이라고 하면 바로 이해하고 계산할 수 있지만 컴퓨터는 이를 0과 1로 표현해야 합니다. 컴퓨터가 이해할 수 있게 '01010101 00000001 00001001' 이렇게 표현이 되는 언어를 우리는 기계어라고 부릅니다.

  • 앞에서 컴퓨터와 대화를 하기 위해 우리가 눈높이를 낮췄다고 했지만 기계어는 사람의 입장에서는 너무 복잡하고 어렵습니다.

  • 그래서 우리는 이를 해결하기 위해 기계 명령어와 일상 용어를 일대일로 매칭하는 기계어와 니모닉의 매칭 코드표를 만들었습니다.

어셈블리어

  • 그 매칭 코드표를 ‘어셈블리’ 라고 불렀습니다. 그리고 CPU 마다 실행할 수 있는 기계어가 달랐기 때문 어셈블리어도 다르게 만들어졌습니다. 추가로 어셈블리어를 기계어로 번역해 주는 소프트웨어는 ‘어셈블러’ 라고 불렀습니다.

  • ”더하기를 의미하는 기계어 01010101 에 매칭 되는 어셈블리의 니모닉은 add 라고 정하자! “ ⇒ ex) add 1, 3

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

  • 이를 해결하기 위해 어셈블리어 이후 많은 언어들이 등장했지만 다음으로는 우리 모두가 알고 있는 C언어의 등장을 보겠습니다.

C언어

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

  • C언어는 하나의 소스파일을 각 기계어 에 맞는 컴파일러로 컴파일을 하여 기계어 목적파일을 만들기 때문에 개발자는 소스파일이 동작하는 기계에 상관없이 개발이 가능해 졌습니다.

  • 즉, C언어는 하나의 소스만 작성하면 모든 기종의 컴퓨터에서 실행이 가능합니다.

  • 물론 C언어는 어셈블리어와 비교하면 이상적인 상황이지만 운영체제들은 각각의 특성이 존재하기 때문에 C언어를 컴파일 하기전에 각 기종별로 소스코드를 수정할 필요가 있습니다.

    short는 int 보다 크지 않은 정수

    long은 int 보다 작지 않은 정수

  • 풀어서 설명하자면 어떤 운영체제는 int 타입을 2바이트로 인지하고, 다른 어떤 운영체제는 int를 4바이트로 인지한다는 뜻입니다.

  • 어셈블리어로 개발할 때와 비교하자면 매우 편해졌지만 아직도 개선할 점이 있었습니다.

Java의 등장

  • Java는 ‘객체지향 언어’ 입니다. 객체지향? 아직은 생소하거나 이해가 되지 않겠지만 이는 차차 알아보도록 하겠습니다!

  • C에 객체지향 개념을 도입한 C++ 이라는 언어도 존재하지만 Java 와는 결이 다릅니다. 객체지향 언어의 중심에는 클래스(Class)가 있습니다.

  • C++은 클래스 없이도 개발이 가능하기 때문에 객체지향지원 언어라고 부르기도 합니다.

  • 반대로 Java는 클래스 없이는 개발이 불가능 합니다. Java는 개발의 시작과 끝 모두 클래스에서 시작하고 클래스에서 끝나게 됩니다.

  • 프로그램이 시작하는 main() 메서드로 예를 들어보자면 C++은 클래스와는 별개로 존재할 수 있지만 Java는 무조건 클래스 내부에 존재해야 합니다.

#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;
}
  • 그럼 Java의 장점에 대해서 한번 이야기 해보겠습니다.

  • Java는 단 하나의 소스 파일로 모든 기종의 컴퓨터에서 실행이 가능합니다.

  • 아마도 "그럼 C언어랑 같은 거 아니야?" 라고 대부분 생각 하셨을 겁니다.

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

니모닉 이란? 비유법, 다른 유사한 것에 빗대어 잘 모르는 것을 설명하고자 하는 방법을 뜻합니다.

컴파일 이란?

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

  • 사람이 이해하는 언어를 컴퓨터가 이해할 수 있는 언어로 바꿔주는 과정.

  • 주어진 언어로 작성된 컴퓨터 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 과정.

  • 우리가 작성한 원시코드를, 컴퓨터가 이해할 수 있는 목적코드로 번역하는 과정.

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

Last updated