본문 바로가기

BackEnd/Java

[Java] 프로그램이란, Java의 기초 개념

 

프로그램 Program 이란 무엇인가?

 

프로그램은 컴퓨터를 위한 작업 지시서로서 구체적으로 컴퓨터가 특정한 작업을 하기 위한 명령어들의 리스트이다.

 

명령어(instruction)

CPU가 수행하는 기초적인 연산들을 말한다. 예로 두 개의 정수를 더하는 연산, 메모리에서 CPU로 정수를 가져오는 연산 등이 명령어에 속한다. 

 

CPU (Central Processing Unit)

컴퓨터에서 구성 단위 중 기억, 해석, 연산, 제어라는 4대 기능을 종합하는 중앙 처리 장치로서 컴퓨터의 대뇌라고 할 정도로 매우 중요한 부분 중 하나다. 

 

 

프로그래밍 언어

컴퓨터가 이해하는 단 하나의 언어는 기계어이다. 기계어는 프로그램이 CPU에 내리는 명령들을 표현하며, 0과 1로만 이루어져 있다. 그러나 기계어는 인간들의 관점에서는 이해하기 어렵고 불편한 언어이기때문에 프로그래밍 작업에 용이한 언어들을 만들었고 그 중에 하나가 Java 이다. 

 

소스 코드 (source code) : 인간이 프로그래밍 언어를 사용하여 원하는 작업을 텍스트로 기술한 것 

소스 파일 (source file) : 소스코드가 파일에 저장된 것

컴파일러 (compiler) : java와 같이 프로그래밍 언어로 작성된 프로그램을 기계어로 변환해주는 것

오브젝트 파일 (object file) : 컴파일러(compiler)가 소스파일을 기계어로 변환한 파일

 

 


 

 

 

Java '자바' 의 탄생


 

Java는 19991년 미국의 '썬 마이크로시스템즈' 라는 회사에서 제임스고슬링을 비롯한 Green 연구팀에서 1995년에 개발한 객체지향 프로그래밍 언어이다. 처음에 이들은 가정용 전자제품 내에 탑재하는 프로그램을 만들기 위해 어떤 특정한 CPU에 의존하지 않는 가상 기계의 virtual machine 개념을 가져오게 되었다. 그러던 중 1993년 그래픽 기반의 월드 와이드 웹(World Wide Web)이 발표되어 자바팀은 자바와 월드와이드웹과의 연동을 추진하였다. 현재는 웹 어플리케이션 개발에 가장 많이 사용하는 언어가 되었다. 2010년에 '오라클(Oracle)'이 '썬마이크로시스템즈'를 인수하면서 Java의 저작권을 소유하게 되었다.

 

 

2020/12 기준, Tiobe 티오베 프로그래밍 언어 순위에서 Java는 2위를 차지하고 있을 만큼 많은 개발자들이 사용하는 언어이다.

 

 

 

 

자바 플랫폼 Java platform

 

플랫폼 platform

프로그램이 실행되는 하드웨어나 소프트웨어 환경이다. 자바 플랫폼은 다음과 같이 두가지 요소로 이뤄져있다.

 

1) 자바 가상기계 (JVM : Java Virtual Machine)

 

2) 자바 응용 프로그래밍 인터페이스 (API : Application Programming Interface)

  • API란 많은 유용한 기능을 제공하는 라이브러리들의 모임을 말한다.
  • 자바 프로그래밍 언어의 핵심 기능 제공
  • 즉시 사용가능한 라이브러리 제공
  • 네트워킹, 보안, XML 생성, 데이터베이스 접근에 필요한 기능 포함

JVM과 API는 프로그램과 하드웨어를 분리하는 역할을 통해 하드웨어의 종류에 상관없이 어디서나 실행될 수 있다는 큰 장점이 있다. 그러나 기계어로만 구성된 네이티브 코드(Native code)보다 속도는 느리다.

 

 

 

 

 

 

Java 의 특징


 

1) Java는 플랫폼 독립적이다.

 

어떤 하드웨어 (CPU), 운영체제(OS)를 사용하든 상관 없이 컴파일(Compile)된 바이트 코드*를 실행시킬 수 있다. 이러한 특징은 웹 애플리케이션의 특성과 부합해 많은 개발자들이 웹개발에 사용하는 이유이기도 하다. Windows, Mac OS, Liux, Android 에서 실행 가능하다.

 

보통 프로그래밍 언어의 경우 소스 코드가 컴파일러에 의하여 기계어로 변환되면 컴퓨터에서 바로 실행가능하다.

그러나, Java 컴파일러는 특정한 컴퓨터를 위한 코드를 바로 생성하지 않고 대신에 가상적인 기계(JVM)를 위한 코드(바이트코드 Byte code)를 생성한다. 그 이후 "Java Virtual Machine" 자바 가상 머신이 컴파일된 코드를 실행한다. 이렇게 두 단계로 나눠서 컴파일하고 실행하는 이유는 응용프로그램들을 다시 컴파일하지 않아도 모든 컴퓨터에서 실행되도록 하기 위해서이다.

 

바이트 코드 Byte code : 가상기계의 기계어

JVM이 이해할 수 있는 코드로서 컴퓨터가 이해할 수 있는 0과 1로 이뤄져있다. 일종의 중간 코드로서 특정 컴퓨터의 기계어와 일치하지는 않지만, 어떠한 기계어로도 쉽게 변환이 가능하다.

 

Java Virtual Machine 자바 가상 기계에 대한 설명은 아래쪽에 있다.

 

 

2) 객체 지향 프로그래밍 (OOP) 언어 이다.

 

객체 지향은 객체별로 코드를 작성하고 객체들을 조합하여 전체 프로그램을 완성하는 프로그램 설계 방법론이다.

객체 지향 개념을 사용하는 이유는 '재사용'이다. 재사용을 함으로서 보다 빠르고 신뢰성있는 프로그램을 만들 수 있다.

자바에서는 기본 데이터 타입(int, float, long) 등을 제외한 거의 모든 것이 객체로 표현된다.

 

이케아에서 가구를 샀는데 완성품이 오지 않고 딸려온 부품들을 조립해서 완성해야하는 경우가 있다.

이와 같이 프로그래밍에서는 각종 객체들을 조합해서 내가 원하는 기능을 수행할 수 있도록 만드는 것을 

'Object-Oriented Programming' (OOP) 객체 지향 프로그래밍 이라고 한다.

 

이와같이 조립식으로 만든 프로그램에서 버그(문제)가 생기면 프로그램 전체를 수정하는 것이 아닌,

문제가 되는 부분만 수정 · 교체할 수 있어 프로그램의 유지 보수성 및 확장성을 증가시킨다.

 

 

3) 분산 환경 지원

자바는 네트워크상에서 동작되는 것을 기본으로 설계된 언어로 TCP/IP, HTTP, FTP 같은 프로토콜을 처리할 수 있는 라이브러리를 가지고 있다. 이를 통해 다른 언어보다 쉽게 네트워크 관련 프로그램을 개발할 수 있다.

 

4) 멀티스레딩 지원 (multithreading)

자바는 언어수준에서 멀티스레딩을 지원하기 때문에 효율적인 프로그램을 작성할 수 있다. 멀티스레딩이란 많은 작업을 동시에 할 수 있음을 의미하며 이는 CPU를 유휴 시간없이 효율적으로 사용할 수 있게끔 한다. 예로 브라우저에서 이미지를 다운로드 받으며 페이지를 스크롤하는 동시에 몇 가지 애니메이션을 실행시킬 수 있다는 것을 들 수있다. 

 

 

 

 

Java 로 만들 수 있는 것

1) 자바 애플리케이션 (Java application)

: 독립적으로 실행될 수 있는 일반 응용 프로그램. ex) 이클립스

 

2) 자바 애플릿 (Java applet)

: 웹 브라우저 안에서 실행되는 프로그램. HTML 문서 안에서 애플릿을 지정하면 웹 서버로부터 다운로드 되어 클라이언트 컴퓨터에서 실행된다.

 

3) 자바 서블릿 (Java servlet)

: 웹서버에서 동작하는 서버 모듈로서 클라이언트의 요구를 받아서 그에 대한 처리를 한 후에 실행 결과를 HTML문서 형태로 클라이언트 컴퓨터로 전송한다.

 

4) JSP (Java Server Page) 

: 자바를 기반으로 동적인 웹페이지를 구축할 수 있는 서버-사이드 스크립트 언어이다. 자바 서블릿을 기반으로 한다.

 

5) 자바 빈즈 (Java Beans)

: 자바로 작성된 컴포넌트를 자바 빈즈라고 한다. 객체지향 프로그래밍에서 컴포넌트는 애플리케이션을 형성하기 위한 프로그램 빌딩 블록이다. 컴포넌트를 조립하면 애플리케이션을 빠르게 만들 수 있다.

 

6) 안드로이드 애플리케이션

: 안드로이드는 운영체제로 리눅스(linux)를 사용하지만, 운영 체제를 제외한 안드로이드 SDK의 나머지 부분은 모드 자바로 작성되어 있다. 안드로이드에서는 자바를 지원하기 위해 자체적인 가상머신을 구현하였다. 자바의 표준 JVM을 사용하지 않는 이유는 스마트폰이 데스크탑에 비해 처리 속도와 메모리 측면에서 한참 뒤쳐지기 때문이다. 모바일 장치에서는 모든것을 최적화시키는 것이 중요한데 안드로이드에서는 가상 머신에서 JIT컴파일러를 없애버리고 가비지 콜렉터를 다시 작성했으며 클래스 파일에서 중복된 정보를 제거한 새로운 실행 파일 형식인 달빅 실행파일(.dex)를 사용한다. 이러한 자체적인 자바 가상 머신을 달빅(Dalvik) 가상 머신이라고 부른다. 

 

 

 

Java 의 동작 원리


 

[원인] source / code / language ---> [결과] application / program

 

 

상기 표를 간단히 설명하자면, 

 

Java Source code (확장자가 .java)

: 자바 문법에 맞게 작성된 소스 코드 (사람이 이해할 수 있는 코드)

 

Compile 컴파일 → javac

: 확장자가 .java 인 파일을 JVM이 이해할 수 있도록 Java Compiler를 통해 전환하는 작업

* 이클립스 사용시, Java Source code를 저장하면 자동으로 .class 라는 확장자를 가진 파일이 만들어진다.

 

Java Application (확장자가 .class)

: 기계가 이해할 수 있는 언어로 전환된 파일

 

Run

: 실행

 

Java Virtual Machine (JVM)

: 확장자가 class인 파일을 읽어서 적혀있는 대로 컴퓨터가 동작하도록 한다.

 

 

 

JVM 이란?


Java Virtual Machine (JVM) '자바 가상 머신'은 실제 존재하는 컴퓨터가 아닌, 가상 컴퓨터를 시뮬레이션하는 소프트웨어이다. JVM은 다른 프로그램을 실행시키는 것이 목적인 프로그램이며 하드웨어, 운영체제에 관계 없이 JVM 만 설치되어 있으면 동일한 자바 프로그램을 동작시킬 수 있다.

 

자바의 슬로건

" Write Once Run Anywhere " 한번만 작성하고 모든 곳에서 실행시키세요.

 

 

 

 

JVM 의 역할


1) 어떤 운영체제에서도 실행될 수 있게끔 한다. -> Write Once Run Anywhere

2) 프로그램 메모리를 관리하고 최적화한다. -> Garbage Collection

JVM은 Java Application 을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행한다.

 

 

 

JVM  구성 요소


1) 클래스 로더 ( Class Loader )

    Java 클래스를 JVM으로 동적 로드하는 JRE(자바 런타임 환경)의 일부이다.

 

2) 런타임 데이터 영역 ( Runtime Data Area )

JVM 의 메모리영역으로, 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역.

 

3) 실행 엔진 ( Execution Engine )

클래스를 실행시키는 엔진이다. 클래스 로더가 JVM 내 런타임 데이터 영역에 바이트 코드를 배치시키고 이것이 실행엔진에 의해 실행된다. 

 

 

 

 

JDK / JRE 차이


JDK자바 개발 도구(Java Development Kit) 의 약자이다.

JDK는 JRE에 추가로 자바 프로그램을 개발하는 데 필요한 컴파일러, 디버거와 같은 명령어행 개발 도구를 추가한 것이다. JDK안에 JRE가 포함되어 있다.

 

JRE자바 실행 환경(Java Runtime Environment) 의 약자이다.

JRE는 자바 프로그램을 실행하기 위한 라이브러리, 자바 가상기계, 기타 컴포넌트들을 제공한다. 자바 프로그램을 단순히 실행만 하고 개발은 하지 않는 일반인들을 위한 환경이다.

 

 

Java API 문서

자바는 방대한 라이브러리를 가지는데 이 덕분에 강력하고 복잡한 기능의 프로그램을 손쉽게 작성할 수 있다. 아래 페이지를 이용하면 API에 포함된 어떤 클래스에 대한 정보도 찾을 수 있다.

 

docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

 

 

 

 

 


 

References

 

github.com/binghe819/TIL/blob/master/JAVA/live-study/1%EC%A3%BC%EC%B0%A8%20-%20JVM.md

www.itworld.co.kr/news/110837

yadon079.github.io/2020/java%20study%20halle/week-01

asfirstalways.tistory.com/158

namu.wiki/w/CPU

brunch.co.kr/@wangho/6

 

 

 

'BackEnd > Java' 카테고리의 다른 글

실수 타입 - Double  (0) 2020.12.24
Java 프로그래밍 기초 - Scanner 스캐너 클래스  (0) 2020.12.23
JDK 프로그램 설치 매뉴얼  (0) 2020.12.22
[Java] 자바 출력문 - println, printf,  (0) 2020.12.17
[Java] Comment 주석 처리  (0) 2020.12.16