본문 바로가기
책 & 강의/스프링 입문을 위한 자바 객체 지향의 원리와 이해

01. 사람을 사랑한 기술

by _최우석 2023. 3. 6.

01. 사람을 사랑한 기술

기술 발전의 흐름 - 언어의 변천사

개요

기술은 계속해서 사람 친화적으로 발전한다. 그래서 기술이 발전할 때마다 어떤 점에서 사람에게 편리하게 되었는지를 중점으로 살펴본다. 즉, 이전 기술에서 사람에게 불편했던 점과 이것이 어떻게 개선되었는가를 살펴보면 좋을 것 같다.

기계어

초창기 컴퓨터는 0과 1로 구성된 기계어만을 이해할 수 있었다. 이는 곧바로 기계가 이해할 수 있는 언어만을 이용해서 컴퓨터와 소통해야만 한다는 것이다. 컴퓨터는 기본적으로 논리회로로 이루어져 있다. 그래서 이 논리회로를 조작하기 위해선 on, off의 의미를 가진 0과 1만으로 컴퓨터를 조작했어야 한다.

그러나 이것은 사람이 해석하기 어렵다는 단점이 있다. 또한 이때 당시에는 하드웨어마다 다른 기계어를 사용했기 때문에 기계어를 사용한다는 것은 사람에게 매우 불편한 일이었다. 즉, 다음과 같은 두 가지의 문제점이 기계어에 존재한다.

  1. 사람이 이해하기 어렵다.
  2. 기계마다 다른 기계어를 사용한다.

그리하여 이런 문제점을 극복하기 위한 새로운 기술이 또 다시 탄생하였다.

어셈블리어

어셈블리어는 기계어의 문제점을 해결하기 위한 기술로서 제시된 언어이다. 기계어는 위에서도 언급했듯이 사람이 이해하기 어려운 0과1의 조합으로 이루어져 있다. 어셈블리어는 이러한 문제점을 기계어를 일상언어(니모닉)로 대응시켜 사용함으로써 해결하였다. 즉, 더하라는 연산이 기계어로 01101이었다면, 이것을 ADD라는 언어로 대응시켜서 사람이 이해할 수 있도록 바꾼 것이다.

그러나 어셈블리어가 기계어의 모든 점을 해결하진 못했다. 왜냐하면 아직도 기계마다 다른 기계어를 사용했듯이 기계마다 다른 어셈블리어를 사용했기 때문이다.

그럼에도 불구하고 어셈블리어는 큰 교훈을 사람들에게 남겼다. 바로 기계어를 사람에게 보다 더 친숙하게 바꿀 수 있다는 가능성을 제시했기 때문이다. 이러한 교훈은 앞으로 나타날 기술에도 영향을 미쳤다.

<aside> 💡 니모닉(Mnemonic) : 어떤 것을 기억하는 데 쉽게 하도록 도움을 주는 것.

</aside>

C언어 - One Source Multi Object Use Anywhere

C언어는 기계어의 두 가지 문제점을 모두 해결하기 위해 탄생한 기술이다. 즉, 기계어를 인간에게 친숙한 고급 프로그래밍 언어(수학적 기호) 등으로 표현하고, 동시에 모든 기계가 하나의 언어를 사용하도록 고안되었다. 그러나 C언어에도 문제는 존재했다.

다시 말해 C언어는 인간에게 친숙하도록 수학적 언어들을 이용하여 기계에 명령을 내릴 수 있게 되었다. 그리고 그렇게 작성한 언어들은 각각 기계에 맞는 컴파일러를 통해서 그 기계에 맞는 기계어로 변환되었다. 이때 수학적 언어들로 작성된 코드는 기계어와 M:N 대응이 되었다. 또한 C언어에서는 구조적 프로그래밍이란 새로운 패러다임 또한 제시되었다.

구조적 프로그래밍의 핵심은 함수를 사용하여 프로그램을 작성하라는 것이다. 즉, 함수라는 논리적 단위를 통해서 코드를 구분하고 분할해서 문제를 정복하자는 것이 핵심 개념이다.

이제부터 C언어의 문제점을 살펴보자. C언어의 첫 번째 문제점은 컴파일러가 기계에 따라서 다른 해석을 하는 경우가 있다는 것이다. 즉, int라는 자료형을 어떤 운영체제(기계)에서는 4바이트로 해석하지만, 어떤 운영체제(기계)에서는 2바이트로 해석하는 경우가 발생한다. 이렇듯 컴파일러는 완전하게 기계마다 동일한 해석을 해내지 못했다. 그래서 각각의 기계에 맞춰 코드는 약간의 변화를 필요로 하게 되었다.

두 번째 문제점은 아직도 C언어에는 사람에게 친숙하지 않은 부분이 존재한다는 것이다. 대표적으로 포인터라는 개념은 여전히 기계에 가까운 것이었다.

C++언어

C++언어는 객체지향 개념을 도입함으로써 C언어의 문제점을 해결하고자 했다. 즉, 포인터와 같이 사람에게 친숙하지 않은 개념들을 없애고, 사람에게 보다 더 친숙한 개념을 도입한 것이다. 이때 객체지향 프로그래밍 패러다임이란 인간이 세상을 바라보는 관점을 모방하여 문제를 해결하고자 하는 방법이다.

그러나 C++언어는 절차적/구조적 프로그래밍 패러다임과 객체지향 프로그래밍 패러다임이 공존하는 언어로서 완전한 객체지향 프로그래밍 언어가 아니라는 한계가 존재하였다. 즉, 아직 완전한 인간 친화적 언어가 아니었다는 것이다.

자바 - Write Once Use Anywhere

자바는 기계어가 가진 모든 문제점을 해결하기 위해 제시된 언어이다. 즉, 사람에게 친숙한 언어이며, 동시에 모든 기계에서 작동 가능한 언어인 것이다. 이러한 목표는 이전에도 추구되었지만 자바에 이르러서 그 절정을 찍게 되었다.

첫 번째로 자바는 철저한 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍 패러다임은 인간이 세상을 바라보는 관점을 모방하여 소프트웨어 내의 문제를 해결하고자 하는 해법이다. 즉, 절차적/구조적 프로그래밍 패러다임보다 더 인간 친화적인 것이다.

두 번째로 자바는 JVM이란 개념을 도입하였다. 이를 통해 완전하게 하나의 코드를 서로 다른 기계에서 실행할 수 있게 되었다. 먼저 자바라는 언어를 이용하여 소스 코드를 작성한다. 그러면 이것을 ‘자바 컴파일러’가 JVM이란 가상 컴퓨터에서 돌아갈 수 있도록 바이트 코드로 해석한다. 그러면 JVM은 바이트 코드를 실행함으로써 해당 명령들을 기존의 컴퓨터에서 작동하도록 하는 것이다. (이 부분은 이후에 자바만을 집중적으로 다시 다룰 때 깊게 말해보겠다.)