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