[Java] Intro

박은지·2022년 2월 26일
0

자바

C언어에 객체 지향적인 기능을 추가하여 만든 C++과 다르게,
자바(Java)는 처음부터 객체 지향 언어로 개발된 프로그래밍 언어이다.

자바는 자바 가상머신 (JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있다.


특징

장점

  • 운영체제와는 독립적으로 실행할 수 있다.
  • 불필요한 기능을 과감히 제거하고 다른 언어에 비해 배우기 쉽다.
  • 자동 메모리 관리 등을 지원하여 다른 언어에 비해 안정성이 높다.
  • 연산자 오버로딩을 금지하고, 제네릭을 도입함으로써 코드의 가독성이 높아졌다.
  • 자바에 대한 많은 참고 자료들이 존재한다.

단점

  • 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어보다 실행 속도가 느리다.
  • 자바는 예외 처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 주어야 한다는 번거로움이 있다.
  • 다른 언어에 비해 작성해야 하는 코드가 많다.

Java 프로그램 실행 과정

자바 컴파일러 ( Java Compiler )

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

자바 바이트 코드 ( Java bytecode )

자바 바이트코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.

자바 가상 머신 ( JVM )

자바 가상 머신(JVM, Java Virtual Machine)은 자바 바이트 코드를 실행시키기 위한 가상의 기계라고 할 수 있다.
자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.
오라클은 대부분의 주요 운영체제와 웹 브라우저, 스마트 폰, 가전기기 등에서도 자바 가상 머신을 쉽게 설치하도록 지원하고 있다.

서로 다른 운영체제라도 자바 가상 머신만 설치되어 있으면 같은 자바 프로그램이 정상 동작할 수 있다.
따라서 개발자는 한 번만 프로그램을 작성하면, 모든 운영체제에서 같이 사용할 있다는 장점이 있다.

그러나, 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 한다. 또한 자바 프로그램은 일반 프로그램보다 한 단계(자바 가상 머신)가 더 존재하기 때문에 실행속도가 느리다는 단점이 있다.

자바 가상 머신의 구성

  • 자바 인터프리터 (Interpreter)
    자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석
  • 클래스 로더 (Class Loader)
    동적으로 클래스를 로딩
  • JIT 컴파일러 (Just-In-Time Compiler)
    자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기게어로 변환하는데 사용
  • 가비지 컬렉터 (Garbage Collector)
    더는 사용하지 않는 메모리를 자동으로 회수

자바 프로그램

자바 프로그램은 한 개 이상의 클래스(Class)로 구성되어있으며,
이 클래스(Class)는 한 개 이상의 필드(Field) 혹은 메소드(Method)로 구성되었다.

class 클래스이름 {
    . . .
    // 필드 선언
    . . .
    // 메소드 선언
    . . . 
}

main() 메소드

자바 프로그램이 실행되면 가장 먼저 main() 메소드를 찾아 그 안의 모든 명령을 차례로 실행한다.
따라서 하나의 자바 프로그램에는 main() 메소드를 가지는 클래스(Class)가 반드시 하나는 존재해야 한다.

public static void main( String[] args ) {
    . . .
}

명령문 (Statement)

자바 프로그램의 동작을 명시할 때 컴퓨터에 알려주기 위해 작성하는 문장이 명령문(Statement)이다.

주석 (Comment)

주석은 다음과 같이 한 줄 // 또는 여러 줄 /**/로 작성할 수 있다.

// 한 줄 주석

/*
여러 
줄 
주석
*/

System

사용자와 프로그램이 대화하기 위해서는 그 사이에 입출력을 담당하는 수단이 필요하다.
자바에서는 모든 것을 객체로 표현하므로, 입출력을 담당하는 수단 또한 객체이다.

자바는 System이라는 표준 입출력 클래스를 제공한다.
이 클래스에는 다음과 같은 클래스 변수(static variable)가 정의되어 있다.

  • System.in
  • System.out
  • System.err

System.in 스트림을 통해 표준 입력 작업을 수행한다.
System.out 스트림 혹은 System.err 스트입을 사용하여 표준 출력 작업을 수행한다.

System.out.println()

System.out.println() 메소드는 전달된 데이터를 출력한 후 줄 바꿈을 한다.

System.out.println( 출력할데이터 );

System.out.print()

System.out.print() 메소드는 전달된 데이터를 출력한 후에 줄 바꿈을 하지 않는다.

System.out.print( 출력할데이터 );

Java8 변경사항

2014년에 발표된 Java SE 8 버전에서 변경되거나 새로 추가된 사항은 다음과 같다.

1. 람다 표현식 (Lambda Expression) : 함수형 프로그래밍

람다 표현식(Lambda Expression)이란 메소드를 하나의 표현식으로 표현한 것이다.
즉, 식별자 없이 실행할 수 있는 함수 표현식을 의미하며, 이를 익명 함수(Anonymous funciton)라고도 부른다.

메소드를 람다 표현식으로 표현하면 클래스를 만들고 객체를 생성하지 않아도 메소드를 사용할 수 있다.
또한, 람다 표현식은 메소드의 매개변수로 전달될 수 있고, 메소드의 결괏값으로 반환될 수도 있다.

이러한 람다 표현식의 특징은 불필요한 코드를 줄이고, 코드의 가독성을 높여준다는 장점이 있다.

// 메소드
int min(int a, int b) {
  return a < b ? a : b;
}

// 람다 표현식
(a, b) -> a < b ? a : b;

// 람다 표현식 (익명 클래스)
new Object( ) {
  int min(int a, int b) {
    return a < b ? a : b;
  }
}

람다 표현식 작성

( 매개변수 ) -> {코드 }

함수형 인터페이스 (Functional Interface)

참조변수의\_타입 참조변수의\_이름 = 람다표현식

2. 스트림 API (stream API) : 데이터의 추상화

자바에서는 많은 양의 데이터를 저장하기 위해 배열이나 컬렉션을 사용한다.
그리고 이렇게 많은 양의 데이터에 접근하기 위해서는 반복문 혹은 반복자(iterator)를 사용하여 코드를 작성해야 했다.
이렇게 작성한 코드는 길이가 길고 가독성도 떨어지며 재사용이 불가능하다는 문제가 있었다.
또한 데이터베이스의 쿼리와 같이 정형화된 처리 패턴을 가지지 못하였기 때문에 데이터마다 다른 방법으로 접근해야 했다.

이 문제점을 해결하고자 Java SE 8 버전부터 스트림(Stream) API가 도입되었다.
스트림(Stream) API는 데이터를 추상화해서 다루고 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다.
따라서 스트림 API를 이용하면 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 동일한 방법으로 다룰 수 있다.

스트림 API 특징

  • 외부 반복을 통해 작업하는 컬렉션과 달리, 내부 반복(internal iteration)을 통해 작업 수행
  • 재사용 가능한 컬렉션과 달리, 단 한 번만 사용 가능
  • 원본 데이터를 변경하지 않음
  • 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy)연산을 통해 성능 최적화
  • parallelStream() 메소드를 통한 손쉬운 병렬처리 지원

스트림 API 동작 흐름

  1. 스트림의 생성
  2. 스트림의 중개 연산 (스트림의 변환)
  3. 스트림의 최종 연산 (스트림의 사용)

3. java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API

JDK 1.0에서는 Date 클래스를 사용하여 날짜에 관련된 작업을 수행하였다.
하지만 이 Date 클래스는 현재 대부분의 메소드가 사용을 권장하지 않고 있다.
그 이유는 다음과 같다.

  1. Calendar 인스턴스는 불변 객체(immutable object)가 아니라서 값이 수정될 수 있다.
  2. 윤초(leap second)와 같은 특별한 상황을 고려하지 않는다.
  3. Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있다.

따라서 자바 개발자들은 Calender 클래스 뿐만 아니라 더 나은 성능의 Joda-Time이라는 라이브러리를 사용해 왔다.

새로 출시된 Java SE 8 버전에서는 이 Joda-Time이라는 라이브러리를 발전시켜 새로운 날짜와 시간 API인 java.time이라는 패키지를 제공한다.
java.time 패키지는 위에서 명시한 문제점들을 모두 해결하고, 다양한 기능을 지원하는 다수 하위 패키지를 포함하고 있다.

4. 니즈혼 (Nashorn) : 자바스크립트의 새로운 엔진

지금까지 자바스크립트의 기본 엔진으로 모질라의 리노(Rhino)가 사용되었다.
당시에는 훌륭한 스크립트 엔진이었지만, 시간이 지날수록 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 상황이 발생하였다.

따라서 새로 출시된 Java SE 8 버전부터는 자바스크립트의 새로운 엔진으로 오라클의 나즈혼(Nashorn)을 도입하였다.
오라클의 나즈혼(Nashorn)은 기존에 사용했던 리온(Rhino)에 비해 성능과 메모리 관리 측면에서 개선된 스크립트 엔진이다.

0개의 댓글