Chapter .01 자바 시작하기
이것이 자바다 학습을 하며 책에 있는 내용을 정리한 글 입니다.
1.1 프로그래밍 언어란?
사람과 컴퓨터가 대화하기 위한 다리 역할을 하는 언어.
고급언어 | 저급언어 |
사람이 바로 이해 할 수 있음 | 사람이 이해하기 어려움 |
컴파일(Compile) 필요 (컴파일 하여 컴퓨터가 이해 할 수 있는 언어로 변환) |
어셈블리어 |
C, C++, Java, |
고급언어로 작성된 내용을 소스(Source)라고 부르고,
이 소스는 컴파일러(Compiler)라는 소프트웨어에 의해 기계어로 변환된후 컴퓨터에서 실행 할 수 있게 된다.
우리가 흔히 말하는 프로그램이란 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기게어로 변역한 것을 말한다.
1.2 자바란?
- 1995년 썬마이크로시스템즈(Sun Microsystems)에서 최초 발표한 언어
- 1991년 가전 제품에서 사용할 목적인 오크(Oak) 언어에서부터 시작
- 인터넷 프로그래밍 언어로 발전하면서 자바라는 이름으로 변경
- 2010년 오라클에서 썬을 인수하여 Java 개발,관리,배포 주관
1.2.2 자바의 특징
1) 이식성이 높은 언어이다.
이식성이란 서로 다른 실행환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말한다.
예를 들어 MS 윈도우(Microsoft Windows)에서 실행하는 프로그램을 리눅스 또는 유닉스에서 실행할 수 있다면 이식성이 높은 것이고, 실행할 수 없다면 낮다고 볼 수 있다.
자바 언어로 개발된 프로그램은 소스파일을 다시 수정하지 않아도, 자바 실행 환경(JRE : Java Runtime Environment)이 설치 되어 있는 모든 운영체제에서 실행 가능하다.
따라서 자바는 이식성이 높은 언어라고 볼 수 있다.
2) 객체 지향 언어이다.
프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법을 객체 지향 프로그래밍(OOP:Object Oriented Programing)이라고 한다.
JAVA는 100% 객체 지향 언어이다. 객체를 만들기 위해 설계도인 클래스를 작성해야 하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만들어 낸다.
자바는 아무리 작은 프로그램이라도 객체를 만들어 사용한다.
처음부터 객체를 고려하여 설계되었기 떄문에 객체 지향 언어가 가져야 할 캡슐화, 상속, 다형성 기능 완벽하게 지원하고 있다.
3) 함수적 스타일 코딩을 지원한다.
함수적 스타일 코딩 방식인 람다식(Lambda Expressions) 지원
- 코드 간결하게 작성 가능
- 컬렉션 요소를 필터링, 매핑, 그룹핑, 집계 처리시 주로 사용
자바는 객체 지향 프로그래밍이 소프트웨어 개발의 주요 패러다임이었던 1990년대에 디자인 되었다.
객체 지향 프로그래밍이 나오기 오래전부터 Lisp 또는 Scheme와 같은 함수적 프로그래밍 언어들이 있었는데, 학계를 제외하고는 현업에서 큰 호응을 얻지 못했다.
최근들어 함수적 프로그래밍이 다시 부각되고 있는데, 대용량 데이터의 병렬 처리 그리고 이벤트 지향 프로그래밍을 위해 적합하기 때문이다.
자바는 함수적 프로그래밍을 위해 람다식(Lambda Expressions)을 JAVA 8 부터 지원한다.
람다식을 이용하면 컬렉션의 요소를 필터링, 매핑, 집계처리 하는데 쉬워지고, 코드가 매우 간결해진다.
4) 메모리를 자동으로 관리한다.
- 사용하지 않는 객체를 자동으로 메모리에서 제거
- 핵심 기능 코드에 집중할 수 있도록 하는 기능
C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다.
만약 이 작업을 성실하게 해주지 않으면 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 된다.
자바는 개발자가 직접 메모리에 접근 할 수 없도록 설계 되었으며, 메모리는 자바가 직접 관리한다.
객체 생성 시 자동적으로 메모리영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜준다.
따라서 개발자의 메모리 관리의 수고스러움을 덜고, 핵심 기능 코드 작성에 집중할 수 있다.
5) 다양한 애플리케이션을 개발할 수 있다.
자바는 윈도우, 리눅스, 유닉스, 맥 등 다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.
단순한 콘솔 프로그램에서 부터 클라이언트용 윈도우 애플리케이션, 서버용 웹 애플리케이션 그리고 모바일용 안드로이드 앱에 이르기까지 거의 모든 곳에서 실행되는 프로그램을 개발할 수 있다.
자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의하고 있다.
6) 멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다.
- 동시에 여러 가지 작업을 할 경우
- 대용량 작업을 빨리 처리할 경우
하나의 프로그램이 동시에 여러가지 작업을 처리해야 할 경우와 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해서 병렬 처리하려면 멀티 스레드 프로그래밍이 필요하다.
프로그램이 실행되는 운영체제에 따라서 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 떄문에 실행되는 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있다.
7) 동적 로딩(Dynamic Loading)을 지원한다.
자바 애플리케이션은 여러 개의 객체가 서로 연결되어 실행되는데, 이 객체들은 클래스로부터 생성된다.
애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성한다.
또한 개발 완료 후 유지보수(수정)가 발생하더라도 해당 클래스만 수정 하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없다.따라서 유지보수를 쉽고 빠르게 진행 할 수 있다.
8) 막강한 오픈소스 라이브러리가 풍부하다.
자바는 오픈소스(Open Source) 언어이기 때문에 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스가 넘쳐난다.고급 기능을 구현하는 코드를 직접 장성할 경우, 시간과 노력이 필요하고, 실행 안전성을 보장할 수 없지만, 검증된 오픈소스 라이브러리르 사용하면 개발 기간을 단축하면서 안전성이 높은 애플리케이션을 쉽게 개발할 수 있다.
많은 회사들이 자바를 선택하는 이유중의 하나가 막강하고 풍부한 자바 오픈소스 라이브러리가 있기 때문이다.
1.2.3 자바 가상 기계(JVM)
운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제가 필요하다.
이것이 자바 가상 기계(JVM : Java Virtual Machine)이다.
JVM은 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.
영어권에서는 컴퓨터를 흔히 기계(Machine) 이라고 부르기 때문에 "자바를 실행하는 가상의 기계"라고해서 "JVM"이라는 용어가 나오게 된 것이다.
운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다.
따라서 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.
바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 운영체제에 종속적이다.
자바 프로그램을 운영체제가 이해하는 기계어로 변역해서 실행해야 하므로 JVM은 운영체제에 맞게 설치되어야 한다.
JVM은 JDK 또는 JRE를 설치하면 자동으로 설치 되는데, JDK와 JRE가 운영체제 별로 제공이 된다.
■ Java Standard Edition 구현체의 종류
• JDK(Java Development Kit) = JRE + 개발 도구
– 자바 프로그램 개발하고 실행하기 위해 반드시 설치
• JRE(Java Runtime Environment) = JVM + 표준 클래스 라이브러리
– 자바 프로그램을 실행만 할 경우 설치
운영체제와 JVM 그리고 자바 프로그램의 실행 단계를 그림으로 표현하면 다음과 같다.
자바프로그램은 확장자가 .java인 파일을 작성하는 것부터 시작이 된다.
이것을 소스파일이라고 하는데, 이 소스 파일을 컴파일러(javac.exe)로 컴파일 하면서 확장자가 .class인 바이트 코드 파일이생성된다.
바이트 코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역 된다.
바이트 코드는 하나지만, JVM에 의해서 번역되는 기계어는 운영체제에 따라서 달라진다.
자바의 큰 장점중의 하나인 "Write once, run anywhere". (한번 작성하면 어디서든 실행된다.)는 매우 매력적임에는 틀림없지만, 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되기 떄문에, C와 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다는 단점을 가지고 있다.
그러나 기계어로 빠르게 변환해주는 JVM 내부의 최적화된 JIT 컴파일러를 통해서 속도의 격차는 많이 줄어들고 있다.
1.3.2 API 도큐먼트
자바 프로그램을 개발하기 위해서는 JDK에서 제공하는 표준 클래스 라이브러리를 반드시 사용해야 한다.
이 클래스는 API(Application Programming Interface) 라고도 하는데, JDK에 포함되어 있는 API들은 매우 방대하기 때문에 쉽게 찾을 수 있도록 API도큐먼트를 제공한다.
API 도큐먼트는 HTML페이지로 작성되어 있어 웹 브라우저로 접속 해볼수 있다.
API 도큐먼트 : https://docs.oracle.com/javase/8/docs/api/
1.4 자바 프로그램 개발 순서
1.4.1 소스 작성에서 부터 실행까지
자바 프로그램을 개발하려면 다음과 같은 순서로 진행해야 한다.
자바 프로그램을 개발하기 위해서는 우선 파일 확장자명이 .java인 텍스트 파일을 생성하고 프로그램 소스를 작성한다.
이렇게 만들어진 파일을 자바 소스파일이라고 한다.
작성 완료된 자바 소스파일은 컴파일러(javac.exe)로 컴파일 해야 한다.
컴파일이 성공되면 확장자명이 .class인 바이트 코드 파일이 생성 된다.
예를들어, 명령프롬프트에서 Hello.java 소스파일을 다음과 같이 컴파일 하면 Hello.class파일이 생성 된다.
javac Hello.java
바이트 코드 파일은 완전한 기계어가 아니므로 단독으로 실행할 수 없고 JVM이 실행되어야 한다.
JVM을 구동시키는 명령어는 java.exe이다.
예를 들어 Hello.class라는 바이트 코드 파일을 java.exe로 실행하려면 명령 프롬프트에서 다음과 같이 입력하고 Enter키를 누르면 된다.
주의할 점은 java.exe로 방치트 코드 파일을 실행할 떄는 .class 확장자명을 제외한 이름을 입력해야 한다.
java Hello
java.exe 명령어가 실행되면 JVM은 바이트 코드 파일(Hello.class)을 메모리로 로드하고, 최적의 기계어로 번역한다.
그리고 main() 메소드를 찾아 실행시킨다.
자바 소스 작성에서 부터 실행까지의 과정을 도식화 하면 다음과 같다.
소스 작성에서 부터 실행까지의 순서를 이해했다면, 다음 순서대로 실습을 진행해보자.
1) 메모장을 실행하고 다음과 같이 [파일] - [다른이름으로 저장]을 누른다.
2) 저장위치를 C:\Temp로 변경한다. 만약 Temp가 없다면 생성한다.
이때 H를 반드시 대문자로 입력한다.
3) 다음과 같이 소스 파일을 작성하고 저장한다.
public class Hello{
public static void main(String[] args){
System.out.println("Hello, welcome to the java world!");
}
}
4) 명령프롬프트를 실행시키고, C:\Temp 디렉토리까지 이동하기위해 다음과 같이 입력후 Enter키를 누른다.
4-1) 명령프롬프트 실행
4-1-1) windows키 + R
4-1-2) cmd 입력 후 확인
4-2) Temp 디렉토리로 이동
cd C:\temp
5) Temp 디렉토리 안에 Hello.java파일이 있는지 확인을 위해 "dir"명령어를 실행한다.
6) 컴파일러로 Hello.java 소스파일을 다음과 같이 컴파일 한다.
javac Hello.java
7) Hello.class를 실행하기 위해 JVM구동 명령어인 java.exe를 다음과 같이 실행하고 Enter키를 누룬다.
java Hello
Hello.class가 실행 된것을 확인 할 수 있다.
쥐의할 점은 프로그램을 실행할 때에 java Hello.class와 같이 바이트 코드의 확장자 명을 포함해서는 안된다.
또한 바이트 코드 파일명과 대소문자가 일치해야 한다.
즉 H를 소문자로 입력하면 안된다.