자바 시작

Updated:

강의 사이트

http://tcpschool.com/

자바 시작

1. 자바란?

  • 객체 지향 언어로 개발된 프로그래밍 언어
  • 자바는 자바 가성 머신을 사용하여 운영체제와는 독립적으로 동작할 수 있다.
  • 따라서 어느 운영체제에서나 같은 형태로 실행될 수 있다.

2. 자바의 역사

  • 썬 마이크로 시스템즈사의 제임스 고슬링 팀에 의해 개발
  • 썬 마이크로 시스템즈사가 오라클고 인수 합병되어 오라클의 소유

3. 자바의 특징

3.1 장점

  • 운영체제와 독립적으로 실행 가능
  • 자동 메모리 관리 지원
  • 연산자 오버로딩 금지하고 제네릭을 도입함으로써 코드의 가독성을 높임

3.2 단점

  • 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느림
  • 자바는 예외 처리가 잘 되어 있지만, 개발자가 일일이 지정해줘야 함
  • 다른 언어에 비해 코드 길이가 길다.

4. 자바 표준

  • 1.0/1.1 버전에서는 JDK
  • 1.2 버전은 J2SE
  • 1.6 버전부터 Java SE
  • 2014년 자바 SE 8버전

자바 프로그래밍

1. 자바 프로그램의 실행 과정

2. 자바 컴파일러

  • 컴파일러는 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 바이트 코드로 변환
  • 컴파일러는 자바를 설치하면 javac.exe라는 실행 파일 형태로 설치된다.

3. 자바 바이트 코드

  • 바이트 코드란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미
  • 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불림
  • 바이트 코드 확장자는 .class 이다.
  • 자바 가상 머신만 설치되어 있으면 어디서든 실행가능

4. 자바 가상 머신

  • 바이트 코드를 실행시키기 위한 가상의 기계
  • 운영체제에 종속적으로 운영체제에 맞는 가상 머신을 설치해야 함
  • JVM을 한 단계를 더 거쳐야 하므로 상대적으로 실행 속도가 느림

5. 자바 가상 머신의 구성

  • 클래스 로더
    • 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다.
    • 이렇게 동적으로 클래스를 로딩해주는 역할
  • 런타임 데이터 area

    • 런타임 데이터 영역은 JVM이 실행될 때 할당 받는 메모리 영역

    • Method Area (메소드, 클래스, 스태틱 영역)

      • 클래스에 대한 정보와 함께 클래스 변수가 저장되는 영역

      • JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 대한 정보를 메소드 영역에 저장

    • Heap area

      • 인스턴스 변수 저장 공간
      • 낮은 주소에서 높은 주소의 방향으로 할당
    • stack area

      • 스레드가 시작될때마다 생성
      • 메소드 정보, 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
      • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
    • program counter registers (PC 레지스터)

      • 현재 수행 중인 JVM 명령 주소를 갖는다.
    • native 메서드 stack

      • 자바 외 언어로 작성된 네이티브 메서드 정보를 저장
  • 샐행 엔진 : 런타임 데이터 영역에 할당 된 바이트 코드를 실행

    • 인터프리터
      • 바이트 코드 해석, 하나의 메소드가 여러번 호출되면 매번 새로 해석하여 느리게 실행
    • JIT 컴파일러
      • 인터프리터 단점을 해소. 전체 바이트 코드를 컴파일하고 원시코드(기계어)로 변경
    • 가비지 컬렉터
      • 애플리케이션이 생성한 객체의 생존 여부를 판단하여 더 이상 사용되지 않는 객체를 해제하는 방식으로 메모리를 자동 관리한다.
      • Heap Area 영역의 메모리 관리
  • Java Native interface

    • 자바코드가 다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프레임워크
  • Native 메서드 라이브러리

    • 실행 엔진에 필요한 원시 라이브러리

6. JDK, JRE, JVM 차이

  • Java를 실행시키기 위해선 JVM, JRE, JDK 세 가지가 모두 필요하다.
  • JDK > JRE > JVM

  • JDK
    • 개발도구
    • JRE와 개발용 라이브러리를 포함
  • 일반적으로 JDK를 설치하면 다 포함.

  • JRE
    • JVM용 운영체제(소프트웨어 역할)
    • JVM이 자바 프로그램을 실행하기 위해 필요한 라이브러리와 파일을 가지고 있다.
    • JRE만 있어도 프로그램을 구동시킬수는 있다.
  • JVM
    • 자바 가상 머신(하드웨어 역할)
    • 파일명.java 들을 컴파일한 파일명.class 들을 실행
    • 플랫폼에 의존적(window, mac, linux etc)

자바 8 변경 사항

1. 변경 사항

  • 람다 표현식 : 함수형 프로그래밍
  • 스트림 API : 데이터의 추상화
  • java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API
  • 나즈혼 : 자바스크립트의 새로운 엔진

2. 람다 표현식

  • 메소드를 하나의 식으로 표현한 것
  • 식별자 없이 실행할 수 있는 함수 표현식을 의미, 익명 함수라고도 불림
  • 클래스를 만들고 객체를 생성하지 않아도 메소드를 사용 가능
  • 불필요한 코드를 줄여 가독성을 높이는데 목적

3. 스트림 API

  • 자바에서는 많은 양의 데이터를 저장하기 위해서 배열과 컬렉션을 사용
  • 이런 데이터를 접근하기 위해서는 반복문이나 반복자를 사용해야 함
  • 그러나 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가능
  • 정형화된 처리 패턴을 가지지 못해 데이터마다 다른 방법으로 접근해야만 했다.
  • 이런 문제를 극복하기 위해서 스트림 API이 개발
  • 스트림 API는 데이터를 추상화하여 다루기에 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다.
  • 스트림 API를 이용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다.

4. java.time 패키지

  • JDK 1.0에서는 Date 클래스를 사용하여 날짜에 관한 처리를 수행. 그러나 지금 권장하지 않음
  • JDK 1.1부터 새롭게 제공된 Calendar 클래스로 날짜와 시간에 대한 정보를 얻을 수 있다.
  • 그러나 이것도 문제가 있음
    • 불변 객체(immutable object)가 아니라서 값이 수정될 수 있다.
    • 윤초(leap second)와 같은 특별한 상황을 고려하지 않습니다.
    • 월을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있다.
  • 그래서 Java SE 8 전까지 Joda-Time 라이브러리를 사용
  • 자바 SE 8부터 Joda-Time 라이브러리를 발전시킨 새로운 날짜와 시간 API인 java-time 패키지를 제공.
LocalDate today = LocalDate.now();

System.out.println("올해는 " + today.getYear() + "년입니다.");
//올해는 2017년입니다.

LocalDate otherDay = today.withYear(1982);

System.out.println("올해는 " + otherDay.getYear() + "년입니다.");
//올해는 1982년입니다.

5. 나즈혼

  • 기본 자바스크립트의 기본 엔진으로는 모질라의 리노가 사용되어 왔음
  • 이번부터는 오라클의 나즈혼을 도입
  • 성능과 메모리 관리 면에서 크게 개선된 스크립트 엔진이다.

Tags:

Categories:

Updated: