본문 바로가기

Work/책 정리

[이것이 자바다] Chap01. 자바 시작하기

728x90

Chap01. 자바 시작하기

1.1 프로그래밍 언어란?

  • 컴퓨터가 이해할 수 있는 언어는 기계어.
    • 0과 1로 이루어진 이진 코드이기 때문에 사람이 이해하기에는 매우 어렵다.
  • 사람이 사용하는 언어는 컴퓨터 입장에서 보면 이해할 수 없는 문자 집합
  • 사람과 컴퓨터가 대화하기 위해서는 다리 역할을 하는 프로그래밍 언어가 필요하다.
  • 프로그래밍 언어는 고급언어와 저급언어로 구분.
    • 고급 언어 : 컴퓨터와 대화할 수 있도록 만든 언어 중에서 사람이 쉽게 이해할 수 있는 언어.
      • 컴퓨터가 바로 이해할 수 없기 때문에 컴파일 과정을 통해서 이진 기계어로 변환 후 컴퓨터가 사용.
    • 저급 언어 : 기계어에 가까운 언어.
      • 대표적으로 어셈블리어.
  • 일반적으로 프로그래밍 언어라고 하면 고급언어를 말한다.
    • C, C++, Java 등.
  • 이 언어들로 작성된 내용을 소스라고 부르고 이 소스는 컴파일러라는 소프트웨어에 의해 기계어로 번역된 후 컴퓨터에서 실행할 수 있게 된다.
  • 프로그램이란 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기계어로 번역한 것을 말한다.

1.2 자바란?

1.2.1 자바 소개

  • 1995년도에 처음 썬 마이크로시스템즈에서 자바 언어 발표.
  • 1991년에 썬의 엔지니어들에 의해서 고안된 오크라는 언어에서부터 시작.
    • 오크는 처음에 가전제품에서 사용될 목적.
    • 인터넷 등장과 함께 인터넷에서 실행되는 프로그래밍 언어로 사용되었고, 이름도 자바로 변경.
  • 자바 언어를 발표한 1995년부터 1999년까지는 윈도우 프로그램 개발이 주류였기 때문에 C++언어에 비해 자바는 아주 열세였다.
    • 메모리 및 CPU 를 지나치게 많이 사용하기 떄문에 윈도우 프로그래밍 언어로는 부적합하다는 문제점.
  • 1999년도부터 인터넷이 활성화되면서 웹 애플리케이션 구축용 언어로 자바가 급부상.
    • 단 한번의 작성으로 모든 곳에서 실행 가능한 언어는 자바뿐이었기 때문.
  • 초기에는 가전 제품에 탑재할 프로그래밍 언어로 개발되었지만, 지금은 스마트폰을 비롯해서 각종 장비와 데스크톱에서 실행되는 애플리케이션, 그리고 금융, 공공, 대기업 등의 엔터프라이즈 기업환경에서 실행되는 서버 애플리케이션을 개발하는 중추적인 언어로 자리매김하고 있다.

1.2.2 자바의 특징

이식성이 높은 언어이다.

  • 이식성이란? 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것.
  • 자바 언어로 개발된 프로그램은 소스파일을 다시 수정하지 않아도, 자바 실행환경(JRE : Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능.

객체 지향 언어이다.

  • 객체 지향 프로그래밍(OOP: Object Oriented Programming) : 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이를 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법.
    • 이때 사용되는 언어를 객체 지향 언어라고 한다.
  • 자바는 100% 객체 지향 언어.
    • 아무리 작은 프로그램이라도 객체를 만들어 사용.
    • 캡슐화, 상속, 다형성 기능을 완벽하게 지원.

함수적 스타일 코딩을 지원한다.

  • 자바는 객체 지향 프로그래밍이 소프트웨어 개발의 주요 패러다임이었던 1990년대에 디자인되었다.
  • 최근들어 함수적 프로그래밍이 다시 부각되고 있다.
    • 대용량 데이터의 병렬 처리 그리고 이벤트 지향 프로그래밍을 위해 적합하기 때문.
  • 자바는 함수적 프로그래밍을 위해 람다식을 자바 8 부터 지원.
  • 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해진다.

메모리를 자동으로 관리한다.

  • 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었다.
    • 메모리는 자바가 직접 관리.
    • 객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 Garbage Collector를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜준다.
  • 개발자는 메모리 관리의 수고스러움을 덜고, 핵심 기능 코드 작성에 집중할 수 있다.

다양한 애플리케이션을 개발할 수 있다.

  • 윈도우, 리눅스, 유닉스, 맥 등 다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.
  • 콘솔 프로그램, 윈도우 애플리케이션, 서버용 웹 애플리케이션, 모바일용 안드로이드 앱에 이르기까지 거의 모든 곳에서 실행되는 프로그램을 개발할 수 있다.
  • 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션 형태로 정의하고 있다.
Java SE(Standard Edition) - 기본 에디션

- Java SE는 자바 프로그램들이 공통적으로 사용하는 JVM을 비롯해서 자바 프로그램 개발에 필수적인 도구와 라이브러리 API를 정의한다.
- 클라/서버 프로그램에 상관없이 자바 프로그램을 개발하고 실행하기 위해서는 반드시 JAVA SE 구현체인 자바 개발 키트(JDK: Java Development Kit)을 설치해야 한다.
Java EE(Enterprise Edition) - 서버용 애플리케이션 개발 에디션

- 분산 환경(네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의
- 서버용 애플리케이션으로는 Servlet/JSP를 이용한 웹 애플리케이션, 분산 처리 컴포넌트인 EJB(Enterprise Java Bean), XML 웹 서비스 등이 있다.

멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다.

  • 프로그램이 실행되는 운영체제에 따라서 멀티 스레드 구현 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 운영체제에 상관없이 멀티스레드를 쉽게 구현할 수 있다.

동적 로딩(Dynamic Loading)을 지원한다.

  • 자바 애플리케이션은 여러 개의 객체가 서로 연결되어 실행된다.
    • 이 객체들은 클래스로부터 생성.
  • 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스에 동적 로딩해서 객체를 생성.
  • 개발 완료 후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 다시 컴파일할 필요가 없다.

막강한 오픈소스 라이브러리가 풍부하다.

  • 자바는 오픈소스 언어
    • 라이브러리 또한 오픈소스로 넘쳐남.
    • 오픈 소스 라이브러리를 사용하면 개발 기간을 단축하면서 안정성이 높은 애플리케이션을 쉽게 개발할 수 있다.
  • 많은 회사들이 자바를 선택하는 이유 중의 하나가 막강하고 풍부한 자바 오픈소스 라이브러리가 있기 때문.

1.2.3 자바 가상 기계(JVM)

  • 운영체제는 자바 프로그램을 바로 실행할 수 없다.
    • 자바 프로그램은 완전한 기계어가 아닌 중간 단계의 바이트 코드이기 때문.
    • 이를 해석하고 실행할 수 있는 가상의 운영체제가 필요.
  • JVM은 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.
  • 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제별로 자바 프로그램을 별도로 개발하는 것보다 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다.
  • 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장.
    • 하지만 JVM은 운영체제에 종속적이다.
    • JVM은 운영체제에 맞게 설치되어야 한다.
  • JVM은 JDK 또는 JRE를 설치하면 자동으로 설치.
  • 자바 프로그램은 .java인 파일(소스 파일)을 작성하는 것부터 시작. 이 소스 파일을 컴파일러(javac.exe)로 컴파일하면 확장자가 .class인 바이트 코드 파일이 생성된다.
    • 바이트 코드 파일은 JVM 구동 명령어 javac.exe에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역된다.
  • Write once, run anywhere.
    • 한 번 작성하면 어디서든 실행된다.
  • 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되기 때문에, C와 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다는 단점이 있다.
    • 기계어로 빠르게 변환해주는 JVM 내부의 최적화된 JIT 컴파일러를 통해 속도의 격차는 많이 줄어들고 있다.

1.3 자바 개발 환경 구축

1.3.1 자바 개발 도구(JDK) 설치

  • JDK : 프로그램 개발에 필요한 JVM, 라이브러리 API, 컴파일러 등의 개발도구가 포함.(JRE+개발에 필요한 도구)
  • JRE : 프로그램 실행에 필요한 JVM, 라이브러리 API만 포함.(JVM + 표준 클래스 라이브러리)
    • 개발이 아니고 실행만 하는 경우 JRE만 설치
  • JDK 내부의 bin 디렉토리는 컴파일러인 javac.exe와 자바 가상 기계(JVM) 구동 명령어인 java.exe가 포함되어 있다.

1.3.2 API 도큐먼트

  • 자바 프로그램을 개발하기 위해서는 JDK에서 제공하는 표준 클래스 라이브러리를 반드시 사용해야 한다.
    • 이 클래스는 API(Application Programming Interface)라고도 하는데, JDK에 포함되어 있는 API들은 매우 방대하기 때문에 API 도큐먼트를 제공한다.

1.4 자바 프로그램 개발 순서

1.4.1 소스 작성에서부터 실행까지

.java 소스 파일 작성 > 컴파일러로 바이트코드 파일 생성 > JVM 구동 명령어로 실행
  • 파일 확장명이 .java인 텍스트 파일을 생성하고 프로그램 소스를 작성한다.
    • 이렇게 만들어진 파일을 자바 소스 파일이라고 한다.
  • 작성 완료 된 자바 소스 파일은 컴파일러(javac.exe)로 컴파일해야 한다.
  • 컴파일이 성공되면 확장명이 .class인 바이트 코드파일이 생성된다.
    • 바이트 코드 파일은 완전한 기계어가 아니므로 단독으로 실행될 수 없고 JVM이 실행되어야 한다.

JVM 구동

  • 구동시키는 명령어는 java.exe

    • Hello.class라는 바이트 코드 파일을 java.exe로 실행하려면

      java Hello
      • .class 확장명을 제외한 이름 입력
  • java.exe 명령어가 실행되면 JVM은 바이트 코드 파일을 메모리에 로드하고, 최적의 기계어로 번역한다.

  • 이 후 main() 메소드를 찾아 실행 시킨다.

1.4.2 프로그램 소스 분석

  • 자바 실행 프로그램은 반드시 클래스 블록과 main() 메소드 블록으로 구성되어야 한다.
  • 클래스 : 필드 또는 메소드를 포함하는 블록
    • 클래스의 이름은 개발자가 마음대로 정할 수 있다.
    • 주의 : 소스 파일명과 클래스 이름의 대소문자가 일치해야 한다.
  • 메소드 : 어떤 일을 처리하는 실행문들을 모아 놓은 블록
    • 메소드 이름도 개발자가 마음대로 정할 수 있지만 main() 메소드는 다른 이름으로 바꾸면 안된다.
      • JVM이 구동되면서 제일 먼저 main() 메소드를 찾아서 실행하기 때문.
      • main() 메소드를 entry point 라고 한다.

1.5 주석문과 실행문

1.5.1 주석 사용하기

  • 주석은 프로그램 실행과는 상관없이 코드에 설명을 붙인 것.
  • 컴파일 과정에서 주석은 무시되고 실행문만 바이트코드로 번역된다.
    • 주석을 많이 작성한다고 해서 전체 프로그램의 크기가 커지는 것은 아니므로 가급적 설명이 필요한 코드에 주석을 달아두는 것이 좋다.
  • 주석문의 종류
    • // : 행 주석
    • /* ~ */ : 범위 주석

1.5.2 실행문과 세미콜론(;)

  • 실행문의 마지막에 반드시 세미콜론을 붙여서 실행문이 끝났음을 표시해주어야 한다.
    • 컴파일러는 세미콜론이 나올 때까지 실행문이 계속해서 연결된 것으로 인지.


728x90