클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

자바 시작 1 - 컴퓨터와 프로그래밍 및 자바의 출현과 WORA 본문

프로그래밍 언어/자바

자바 시작 1 - 컴퓨터와 프로그래밍 및 자바의 출현과 WORA

huenuri 2024. 8. 7. 07:29

어제 밤 12시까지 2시간 정도 HTML/CSS 공부를 했다. 30분 정도는 책을 보며 학습했지만 1시간 반 이상은 벨로그에 어떻게 하면 동영상을 올릴 수 있을지 연구하며 시간을 보냈다. 아무리 찾아도 해결책을 찾지 못하자 마음이 안좋아지는 것 같아 안 되는 걸 붙잡기보다 그냥 다른 걸 하기로 했다.
그리고 잠이 몰려와서 1시간 정도는 자바 책과 정보처리기사 필기책 훑어보다가 잠을 청했다.

 

정처리 필기가 한달 앞으로 다가왔는데 공부할 건 정말 많고 준비한 건 하나도 없었다. 오늘은 바빠서 힘들겠지만 내일부터는 매일 2시간 이상씩 공부를 진행해볼 생각이다.
어쨌든 오늘은 하루종일 자바를 공부해야 한다. 5시 반에 일어나는 것도 조금 늦기는 하지만 그래도 맑은 정신으로 하는 게 좋을 것이다. 오늘 목표는 4일치 수업인 4시간짜리 강의를 모두 듣고 자바 책까지 읽고 학습하며 반복문 전까지 학습을 마치는 것이다. 너무 빡빡하지만 여기까지는 해야 다음주에도 자바 수업을 따라갈 수 있을 것 같다.

그럼 바로 새벽 공부를 시작해보자! 금요일 저녁부터 어제 하루를 놀았더니 일정이 조금 빡빡하다. 아, 그리고 깜빡 잊을뻔 했는데 오늘 꼭 최종 테스트 시험을 봐야 한다!


 

 

컴퓨터와 프로그래밍

 

프로그래밍 언어

기계어, 어셈블리어, 고급언어는 전에 C언어 학습을 할 때 모두 정리했던 개념이지만 다시 한번 간단히 요약해본다.

  • 기계어 : 컴퓨터의 CPU는 이진수인 0과 1밖에 이해하지 못해 이진수 명령어로 구성된 언어
  • 어셈블리어 : 사람이 직접 기계어 프로그램을 작성하는 것이 힘들기 때문에, 기계어의 각 명령을 ADD, SUB, MOVE 등 가급적 표현하기 쉬운 상징적인 니모닉 기호로 일대잉 대응시킨 언어
  • 고급 언어 : 사람이 이해하기 쉽고 복잡한 알고리즘이나 프로그램, 자료를 효율적으로 표현할 수 있는 언어
  • 객체 지향 언어 : 초기의 절차 지향 언어 형태를 거쳐 더 편리하고 사용하기 좋은 언어

 

 

 

프로그램 컴파일과 실행

 

프로그래밍은 컴퓨터 언어로 프로그램 소스 파일을 작성하는 것으로 시작한다. 컴퓨터는 C/C++, 자바와 같은 고급 언어로 작성된 프로그램은 직접 처리할 수 없기 때문에 컴퓨터가 실행할 수 있는 기계어 코드로 변환하는 컴파일 과정이 필요하다.

  • 컴파일러 : 컴파일을 전담하는 소프트웨어. 각 언어마다 전용 컴파일러가 있음
  • 자바는 소스 프로그램의 확장자가 .java이고, 자바 전용 컴파일러에 의해 .class 파일로 컴파일되며, 클래스 파일은 자바 가상 기계에 의해 실행된다.


 

자바의 출현과 WORA

 

자바의 태동

자바는 애초 지금과 같이 일반 컴퓨터나 인터넷 환경에서 사용될 목적으로 설계된 것이 아니었다. 1991년 선마이크로시스템스(SUN Microsystems)는 제임스 고슬링이란 엔지니어를 중심으로 그린 프로젝트(green project)라는 이름의 가전제품 소프트웨어 개발을 시작한다.

안드로이드는 가전제품에 주로 사용하는데 그 사용 점유률이 70%를 넘는다.

 

 

 

 

 

 

기존의 프로그래밍 언어로 작성된 프로그램은 플랫폼 간의 호환성이 없어 사용자 컴퓨터의 플랫폼에 따라 다시 소스를 컴파일하거나 아예 프로그럼을 재작성해야 하는 단점이 있었다.

특히 다양한 플랫폼을 갖는 가전제품을 위해 플랫폼에 독립적인 언어의 필요성이 대두되었다. 이에 선마이크로시스템스는 플랫폼 독립적이며 메모리 사용량이 적은 새로운 언어와 실행 체계를 개발하였고, 처음에는 이 언어의 이름을 오크(oak)라고 지었다.


초기에는 별로 알려지지 않았으나 인터넷과 웹이 엄청난 속도로 발전하면서 급속도로 퍼지게 되었다. 웹의 특징은 웹 콘텐츠가 클라이언트의 다양한 플랫폼상의 웹 브라우저에서 실행되도록 하는 것인데, 이 언어가 여기에 딱 들어맞았다.

선마이크로시스템스는 오크를 인터넷 환경에 적합하도록 발전시켰으며, 1995년 Sunworld 95에서 자바(Java)라는 이름으로 새로운 기술을 발표했다. 데이터베이스로 유명한 오라클 사에서 2009년에 선마이크로시스템스를 인수함으로써 현재는 오라클에서 자바를 제공하고 있다.

 

 

자바 이름의 유래

자바 섬이라는 섬에서 개발했고 그 섬은 커피가 많이 나서 자바의 아이콘이 커피가 되었다는 유래가 생겼다.


 

WORA(Write Once Run Anywhere)

자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상 컴퓨터의 CPU와 운영체계에 종속적인 코드로 변환한다. 그렇기에 이 코드를 다른 플랫폼(다른 CPU나 운영체제)에서 실행하려면 다시 컴파일하든지 플랫폼에 맞도록 코드를 수정해야 했다.
이러한 특징을 플랫폼 종속성(platform dependence)라고 한다.

 

자바는 개발 단계에서부터 플랫폼에 독립적으로 설계되었다. 운영체제나 하드웨어에 상관없이 자바 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제공하며 동일한 실행 결과를 기대할 수 있다.
또 자바는 웹 브라우저, 분산 환경의 지원 등으로 네트워크에 연결된 어느 클라이언트에서도 실행이 가능하다. 자바 프로그램은 어디서든 한 번 작성하면 다시 컴파일하거나 수정하지 않고, 어떤 하드웨어나 운영체제에서도 실행시킬 수 있다. 이를 WORA라고 한다.

윈도우뿐 아니라 모바일 환경에서도 잘 동작이 된다.

 

 

 

자바의 구조

 

 

IDE는 통합개발환경도구로 개발할 수 있는 환경을 제공한다. JDK는 자바 개발 Kit로 개발하려면 기본적으로 필요하다. 여기에는 JRE와 JVM을 포함하고 있어서 이 JVM이 컴퓨터에게 명령을 전달하는 구조로 되어 있다. IDE 없이도 프로그래밍을 할 수 있지만(메모장 등에서) 이렇게 하면 가독성이 떨어지고 오류가 나기 쉽다.
이러한 불편함을 해소하고 개발환경을 최적화하기 위한 IDE가 생겨났고 비주얼 스튜디오, 이클립스 등을 말한다.

자바는 IntelliU나 Eclipse를 주로 사용하는데 IntelliU는 중견기업에서, Eclipse는 공공기관이나 국가기관에서 사용하는 편이다. 스프링 프레임워크는 국가에서 사용하는 프레임워크이므로 이클립스가 적당하다.

필요한 것 : JDK, Eclipse

 

 

 

자바 가상 기계와 바이트 코드

자바의 플랫폼 독립성을 가능하게 하는 것은 자바 가상 기계와 바이트 코드 때문이다.

 

 

 

바이트 코드

자바 가상 기계에서만 실행되는 기계어로서, 어떤 CPU와도 관계없는 바이너리(binary code) 코드이다. 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일을 생 성한다.
이 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행되지 않고, 자바 가상 기계가 인터프리터 방식으로 실행시킨다. 어떤 플랫폼이든 상관없이 자바 가상 기계만 있으면 바로 실행 가능하다.
오라클에서 배포하는 JDK에는 자바 클래스 파일을 디어셈블하여 바이트 코드를 볼 수 있는 도구를 제공한다.

디어셈블은 기계어를 어셈블리어로 바꾸어주는 작업이다

이것은 자바 프로그램을 컴파일하여 만들어진 클래스 파일을 javap를 이용하여 디어셈플한 바이트 코드를 보여준다.


 

 

 

자바의 실행 환경

자바는 C/C++와 개발 및 실행 환경에 있어 상당한 차이가 있다. 이 차이점이 바로 자바 언어의 차별성이자 장점이기도 하다.

C/C++ 프로그램의 개발 및 실행

개발자는 보통 여러 개의 소스 파일을 나누어 C/C++ 프로그램을 작성한다. 그리고 각 C/C++ 소스 프로그램을 컴파일하여 목적 파일을 생성하고, 링크 과정을 통해 목적 파일들을 연결하여 하나의 실행 파일을 만든다.
린크 과정에서는 C/C++ 프로그램에서 호출한 C/C++ 라이브러리 함수들을 찾고 이 함수들의 목적 코드를 라이브러리 파일에서 꺼내 .exe 파일에 삽입한다.

이제 링크의 과정을 통해 만들어진 .exe 실행 파일에는 실행에 필요한 모든 코드가 들어있어 .exe 파일만 있으면 실행에 아무 문제가 없다. 하지만 .exe 파일이 매우 큰 경우 적은 량의 메모리를 가진 컴퓨터에서는 처음부터 실행조차 할 수 없는 문제점이 있다.

 

 

 

자바 프로그램의 개발 및 실행

자바 프로그램도 보통 여러 소스 파일(.java)로 나누어 작성하며, 자바 컴파일러는 각 소스 파일을 컴파일하여 클래스 파일(.class)을 생성한다. 하지만 자바에서는 이들을 하나의 실행파일(.exe)로 뭉치는 링크의 과정이 없다.
개발자는 여러 클래스 파일 중 하나를 지정하여 실행을 시작하면, 자바 가상 기계는 그 클래스 파일을 메모리에 로딩하고 실행한다. 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일이 필요하면, 자바 가상 기계는 그때 이 클래스 파일을 로딩하고 실행한다.
이런 방식이라면 처음부터 모든 클래스 파일을 로딩해놓을 필요 없이 당장 실행할 클래스 파일만 로딩하며 실행할 수 있다. 따라서 적은 량의 메모리를 가진 컴퓨터에서 얼마든지 큰 자바 응용프로그램을 실행할 수 있다.

이것이 바로 플랫폼 독립성과 함께 달성하고자 하는 자바 언어의 본질이다. 메모리가 충분한 PC에서는 실행 중에 클래스 로딩으로 인한 시간을 줄이기 위해 사용자 클래스 파일과 필요한 자바 클래스 파일을 미리 로딩해 둔다.

 

 

 

 

 

자바와 C/C++의 실행 비교

C/C++는 컴파일한 목적 파일을 링크시켜 하나의 실행 파일을 만들며, 이 실행 파일 하나만 있으면 실행이 가능하다. 그리고 이 실행 파일은 컴퓨터의 CPU가 바로 실행한다.
그러나 자바의 경우 링크 과정이 없으며 자바 가상 기계가 컴파일된 클래스 파일을 실행한다. 자바는 컴파일된 클래스 파일이나 이들을 하나로 압축한 jar 파일 형태로 배포한다.

자바

  • 컴파일러가 바로 바이트 코드를 생성하며, 링크 과정이 없다.
  • 바이트 코드는 자바 가상 기계에서만 실행 가능하다.
  • 자바는 실행시간에, 필요한 클래스들이 자바 가상 기계에 의해 링크되며 클래스 로더가 필요한 클래스를 동적으로 로딩한다.
  • ClassLoader 객체를 이용하여 개발자가 직접 클래스를 로딩할 수 있다.

C/C++

  • C/C++에서는 컴파일러가 중간 단계인 목적 코드를 생성한 후 링커가 필요한 라이브러리들을 링크하여 최종 실행 가능한 .exe 실행 파일을 만든다.
  • 정적 라이브러리의 경우 실행 파일에 포함시키므로 실행 파일 크기가 커진다.
  • 동적 라이브러리의 경우 실행 시간에 링크가 일어난다.
  • 목적 코드 및 실행 파일은 플랫폼에 따라 다르므로, 플랫폼이 바뀌면 소스 코드를 수정하거나 컴파일과 링크를 새로 해야 한다.

 

학습문제 풀기

 


 

 

1~2장 학습을 마치고

5시 반부터 1시간 반이 조금 넘도록 이 단원을 학습했다. 내겐 처음 듣는 수업이기에 온라인 학습과 책을 넘나들며 학습해보았다. 선생님은 책에 있는 내용을 설명 안하고 넘어가시기도 하고 실습 위주로 하시는 것 같았다.
하지만 난 어떻게 해서 자바가 태동했고 자바의 언어는 다른 언어와 다른어떤 특징이 있는지 궁금해서 이 부분을 자세히 살펴보았다.

사실 이런 부분을 모르고 그동안 2주 동안 자바 수업을 들었더니 뭔가 중요한 것이 빠진 것처럼 허전했다. 앞부분도 알지 못하고 클래스부터 배우니 기초도 많이 약했다. 오늘 이렇게 공부해보니 정말 재미있었다. 시간이 좀 걸리더라도 책과 함께 병행해볼 생각이다.

2주동안 거의 5~6 chapter나 나갔지만 매일 차근차근 학습하면 금새 따라잡을 수 있을 것이다. 사람들이 왜 자바를 많이 사용하는지 알게 되었고, 나도 이 자바를 왠지 사랑하게 될 것 같은 예감이 든다. 이제 다음 포스트에서는 개발 도구와 자바 플랫폼에 대해서 더 자세히 학습해보겠다~