본문 바로가기
👨‍💻 프로그래밍/📦 Backend

자바 0 - 코딩이란 뭘까?

by 개발자 진개미 2021. 3. 31.
반응형

자바를 배우러 오신 모든 분들 환영합니다! 이 시리즈에서는 기초적인 자바 프로그래밍을 배움과 동시에 컴퓨터를 배웁니다. 코딩이란 기본적으로 컴퓨터에게 명령을 내리는 행위입니다. 따라서 컴퓨터가 어떻게 구성되어 있는지, 원리가 무엇인지, 컴퓨팅의 본질이 무엇인지 이해를 해야 좋은 코드를 짤 수 있습니다. 오늘은 우리가 코드를 입력할 때, 어떻게 마법같이 컴퓨터가 처리할 수 있는지 알아보겠습니다.

 

1. 컴퓨터의 구조

2. 코드의 구조

3. 자바의 특징

 

자바의 어원은 커피


1. 컴퓨터의 구조

현대인이라면 기본적인 컴퓨터의 구조가 하드디스크, 메모리, 시피유, 모니터, 키보드, 마우스 등으로 이루어진 것은 잘 것이다. 컴퓨터는 이와 같은 장치들의 통신을 통해 원하는 일을 수행한다. 이와 같이 장치들을 연결해 주는 역할을 하는 것을 버스라고 부른다.

CPU는 연산을 하기 위해 존재한다. 즉, 컴퓨터의 뇌라고 할 수 있다.

InputOutput 기기들은 각각 컴퓨터를 사용하는 사람의 입력을 받아오고, 그걸 출력하기 위해 존재하고, 통신 장비는 다른 컴퓨터와 데이터를 주고 받기 위해 존재한다. 쉽게 말해 인터넷이라고 할 수 있다.

하지만, 하드디스크메모리는 둘 다 데이터를 저장하기 위해 존재하는데, 왜 각자 역할이 나눠져 있을까? 이는 이 둘의 속도가 다르기 때문이다. 일반적으로 메모리는 하드보다 훨씬 빠르게 데이터를 주고받을 수 있다. 하지만 메모리는 하드보다 비싸고, 게다가 휘발성(전원이 차단되면 데이터가 사라진다!) 이기 때문에 하드에 저장된 데이터를 메모리가 불러와서 CPU와 통신을 하며 연산을 하는 구조로 되어 있다.


2. 코드의 구조

코드는 컴퓨터에게 명령을 내리기 위해 존재한다. 컴퓨터의 구조를 보면 알 수 있듯이, 하드와 메모리는 이런 코드를 저장하는 역할이고, 다른 기기들(Input, Output, 통신 장비)은 컴퓨터를 사용을 보조해주는 역할은 한다. 즉, 사실상 CPU가 컴퓨터의 핵심이다. 그렇기 때문에 코드가 어떻게 컴퓨터에게 일을 시키는지 알려면 CPU의 구조를 이해해야 한다. 이는 매우 흥미로운 주제이지만, 상당히 난해하기에 여기서는 CPU의 구조 전체를 이해하기보다는 코드의 기초적인 구조를 이해할 수 있을 정도에 한해서 CPU의 구조를 탐구해보자. CPU의 구조에 대해 알고 싶은 분은 여기(예정) 참고.

 

우선, 매우 간단한 프로그램을 상상해보자. 숫자 3개의 평균을 구하는 프로그램이 있다고 하자. 당장 이해할 필요는 전혀 없지만, 아래는 이 프로그램을 자바로 구현한 것이다.

public class Mean{
	public static double mean(double num1, double num2, double num3){
    	double sum = num1 + num2 + num3;
        double mean = sum / 3;
        return mean;
    }
}

모든 부분에 집중하지 말고, 우리가 자세히 봐야 할 부분은 여기이다.

double sum = num1 + num2 + num3;
double mean = sum / 3;

즉, 숫자 3개를 더하고, 3으로 나눈 간단한 코드이다. 더 정확히는 sum이라는 변수에 (지금은 일단 수학에서의 x와 같은 역할은 한다고 생각하자) 세 숫자의 합을 저장하고, 그 값을 다시 3으로 나눠서 mean이라는 변수에 저장한 코디이다. 앞에 double이나 ;는 지금은 신경 쓰지 말자.

 

이 프로그램은 어떻게 CPU에게 명령을 내리는 걸까?

 

우선 CPU에는 명령을 내릴 수 있는 숫자가 정해져 있다. 예를들면, 더하기는 3번, 특정 메모리 주소로부터 값을 불러오는 건 15번 이런 식이다. 즉, 여기서 우리가 할 것은 숫자 세 개를 하나씩 불러와, 더한 값을 메모리에 저장하고, 그 저장한 값을 다시 불러와서 3으로 나눈 뒤, 다시 새로운 장소에 저장하는 것이다. 실제로 이렇게 되어 있는 CPU는 없겠지만, 편의성을 위해 CPU상의 명령어를 아래와 같이 정의해보자.

 

1 - 불러오기 - 특정 메모리 주소에 있는 값을 불러오기

2 - 더하기 - 불러온 2개의 값을 더해서 특정 메모리 주소에 저장하기

3 - 불러온 값 초기화하기 - 불러온 값을 초기화한다.

 

그리고 메모리 주소는 100부터 시작한다고 하자. 즉, 100에는 첫번째 숫자를, 101에는 두 번째 숫자를, 102에는 세 번째 숫자를, 103에는 sum, 즉 세 숫자를 합한 것을 저장할 값을, 104에는 mean, 즉 평균을 저장할 값을 미리 할당해 놓자.

 

그렇다면 우리의 프로그램은 다음과 같은 것이다.

 

1, 100, 1, 101, 2, 103, 3, 1, 103, 1, 102, 2, 104

 

즉, sum1, sum2를 불러와 더하고, 그 값을 103번에 저장한 뒤, 불러온 값을 초기화 한 뒤, 103번에 있는 sum1+sum2와 sum3를 불러온뒤 더해 104번에 저장한다. 매우 간단한 프로그램이지만 믿을 수 없을 정도로 복잡하다.

 

이게 다가 아니다. 컴퓨터는 0과 1 밖에 못 한다는 말을 들어봤을 것이다. 그렇기에 실제론 우리의 프로그램은 다음과 같이 0과 1의 조합으로 되어 있다.

 

00000001, 1100100, 00000001, 1100101, 00000010, 1100111, 00000011, 00000001, 1100110, 00000010, 1101000

 

만약 우리가 코드를 짤 때마다 위와 같은 과정을 반복한다면, 매우 간단한 프로그램을 짜는데도 하루 종일이 걸릴 것이다. 하지만 다행스럽게도 우리가 위에서 한 것과 같은 과정을 자동으로 해 주는 마법 같은 프로그램이 존재한다. 이 프로그램을 우리는 컴파일러라고 부른다. 즉, 다행스럽게도 우리가 해야 할 것은 인간이 상대적으로 이해하기 쉽도록 디자인 된 프로그래밍 언어를 사용해서 코드를 짜고, 이를 컴파일러에 넣어서 CPU가 이해할 수 있는 0과 1로 바꾸는 것이다. 이를 그림으로 나타내면 아래와 같다.

 

소스파일은 우리가 짠 코드를 말한다. 컴파일러는 소스파일을 머신언어 (더 정확히는 어셈블리 어지만 일단 넘어가자), 혹은 기계어라고 불리는, CPU가 이해할 수 있는 0과 1로 이루어진 코드로 바꾼다. 더 나아가, 우리가 흔히 보는 .exe 파일은, 이 기계어를 링커가 불리는 프로그램에 넣어서 실행파일로 만든것이다.


3. 자바의 특징

코드의 구조에서 볼 수 있듯이, 프로그래밍 언어란 기계어(0과 1)에 비해 인간이 이해하기 쉽도록 컴퓨터에게 명령을 내릴 수 있는 도구이다. 모든 코드는 컴파일러에 의해 기계어로 번역되고, 그렇기 때문에 미리 정의된 엄격한 규칙을 반드시 하나도 빠짐없이 모두 지켜야 한다. 이게 바로 프로그래밍을 어렵게 만드는 요소 중에 하나이다. 

 

모든 프로그래밍 언어는 각자 다른 목적을 위해 디자인됐다. 프로그래밍 언어 중에는 기계어와 상대적으로 가까워서, 인간이 이해하기는 어렵지만 컴퓨터가 이해하기는 쉬운 언어도 있는 반면 (대표적으로 C언어가 그렇다) , 인간이 이해하기는 쉽지만  컴퓨터가 이해하기는 어려운 언어도 있다 (대표적으로 Python). 일반적으로, 컴퓨터가 이해하기 쉬우면 더 빠르고, 인간이 이해하기 쉬우면 더 느리다. 

 

그렇다면 자바는 어떤 특징을 가지고 있을까? 먼저 자바는 플랫폼 독립적인 언어이다. 자바는 바이트 코드라 불리는, 자바 가상 머신 (JVM, Java Virtual Machine)에 의해서 돌아갈 수 있는 코드로 컴파일 되기 때문에, 자바 가상 머신을 설치하면 운영체재나 환경에 상관없이 돌아 갈 수 있다. 다른 언어는 소스 파일이 있으면, 이를 컴파일하고 운영체제에 따라 다른 링커에 넣어서 프로그램으로 만들기 때문에, 윈도에서 돌아가는 프로그램이 맥에서나 안드로이드에서는 돌아가지 않지만 자바는 JVM이 설치된 모든 컴퓨터에서 자유롭게 돌아간다. 이는 자바가 매우 큰 인기를 얻은 요인 중 하나였다.

 

자바의 또 다른 특징은 객체지향적이라는 것이다. 객체지향적이 뭔지는 나중으로 미루고, 당장 알아둬야 할 것은 언어의 문법에 객체지향적인 요소가 깊게 녹아있기 때문에, 처음에는 혼란스럽고, 쓸데없어 보이지만, 나중에는 이 모든 문법이 왜 필요한지 알게 될 것이다. 간단한 예로, Hello World를 프린트하는 프로그램을 자바와 파이썬으로 비교해 보면, 똑같은 일을 함에도 자바 코드가 훨씬 긴 걸 알 수 있다.

 

자바:

public class Hello {
	public static void main(String[] args) {
    	System.out.println("Hello, world!");
    }
}

파이썬:

print("Hello, World!")

이 문서에 삽입된 모든 그림은 직접 제작한 것이며, 저작권은 이 블로그에 있습니다.

 

혹시 모르는 점이나 더 궁금한 점, 지적할 점이 있으면 언제든지 댓글 남겨주세요. 늦어도 24시간 이내에 답변드립니다.

 

 

반응형