Java 11 - 새로운 기능

안녕하세요, Java 학습자 여러분! Java 11의 세계로 인도해드리는 여정에 함께해 주셔서 기쁩니다. 컴퓨터 과학을 오랫동안 가르쳐온 저는 수많은 학생들이 초보자에서 자신감 있는 코더로 변모하는 과정을 목격했습니다. 걱정하지 마세요.我们从基础开始一步步学习,不久的将来,您将能够像专业人士一样编写Java 코드!

Java 11 - New Features

Java 제어 문장

基础부터 시작해보겠습니다. 제어 문장은 프로그래밍의 교통 신호와 같아요 - 코드의 흐름을 제어합니다. Java 11에서는 프로그램 실행을 제어하는 몇 가지 새로운 방법을 제공합니다.

If-Else 문장

if-else 문장은 가장 흔하게 사용하는 제어 구조 중 하나입니다. 실제 생활에서 결정을 내리는 것과 같습니다. 간단한 예제를 보겠습니다:

int age = 18;
if (age >= 18) {
System.out.println("당신은 투표할 수 있습니다!");
} else {
System.out.println("죄송합니다, 당신은 투표할 수 있는 연령이 아닙니다.");
}

이 코드에서 우리는 age 변수가 18 이상인지 확인하고, 그렇다면 사람이 투표할 수 있음을 출력합니다. 그렇지 않으면 그들이 너무 어리다고 말합니다. 이렇게 간단합니다!

Switch 문장

switch 문장은 여러 조건을 확인할 때 유용합니다. 여러 개의 if-else 문장을 더 효율적으로 작성하는 방법입니다. Java 11은 switch 문장에 몇 가지 흥미로운 개선을 도입했습니다. 예제를 보겠습니다:

String day = "Monday";
switch (day) {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> System.out.println("평일");
case "Saturday", "Sunday" -> System.out.println("주말");
default -> System.out.println("유효하지 않은 날");
}

이 switch 문장은 day 변수를 확인하고 평일인지 주말인지 출력합니다. 화살표 문법(->)은 Java 11에서 새로 도입된 것이며, 코드를 더 간결하게 만듭니다.

객체 지향 프로그래밍

객체 지향 프로그래밍(OOP)은 Java의 기본 개념입니다. 이는 LEGO 블록으로 무언가를 만드는 것과 같아요 - 서로 상호작용하는 다양한 객체를 만들어 프로그램을 형성합니다.

클래스와 객체

클래스는 객체를 만드는 설계도입니다. 간단한 차량 클래스를 예로 들어보겠습니다:

public class Car {
String make;
String model;
int year;

public void startEngine() {
System.out.println("Vroom! The " + year + " " + make + " " + model + " is starting.");
}
}

이제 이 클래스에서 객체를 만들어보겠습니다:

Car myCar = new Car();
myCar.make = "Toyota";
myCar.model = "Corolla";
myCar.year = 2021;
myCar.startEngine();

이 코드를 실행하면 "Vroom! The 2021 Toyota Corolla is starting."를 출력합니다.

Java 내장 클래스

Java는 우리의 생활을 더 쉽게 만드는 내장 클래스를 제공합니다. 몇 가지를 살펴보겠습니다:

String 클래스

String 클래스는 텍스트를 조작하는 데 사용됩니다. 예제를 보겠습니다:

String greeting = "Hello, World!";
System.out.println(greeting.length());  // 출력: 13
System.out.println(greeting.toUpperCase());  // 출력: HELLO, WORLD!

ArrayList 클래스

ArrayList는 필요에 따라 확장되거나 축소될 수 있는 동적 배열입니다:

import java.util.ArrayList;

ArrayList<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
System.out.println(fruits);  // 출력: [Apple, Banana, Cherry]

Java 파일 처리

파일 처리는 파일에서 읽고 쓰는 데 필수적입니다. Java 11은 이를 더 쉽게 만드는 몇 가지 새로운 메서드를 도입했습니다:

import java.nio.file.Files;
import java.nio.file.Path;

String content = "Hello, Java 11!";
Path filePath = Path.of("example.txt");
Files.writeString(filePath, content);

String readContent = Files.readString(filePath);
System.out.println(readContent);  // 출력: Hello, Java 11!

이 코드는 문자열을 파일에 쓰고 그 파일을 다시 읽어 들입니다. writeStringreadString 메서드는 Java 11에서 새로 도입된 것입니다.

Java 오류 및 예외

오류와 예외는 프로그래밍의 길에서 만나는 돌과 구덩이와 같습니다. Java는 이를 부드럽게 처리할 수 있도록 도와줍니다:

try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Oops! You can't divide by zero.");
} finally {
System.out.println("This always runs, error or not.");
}

이 코드는 0으로 나누는 것을 시도하고, 그로 인해 발생하는 예외를 catch하여 친절한 메시지를 출력합니다.

Java 다 스레딩

다 스레딩은 저글링과 같아요 - 프로그램이 동시에 여러 가지 작업을 수행할 수 있게 합니다. 간단한 예제를 보겠습니다:

class MyThread extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getId() + " Value " + i);
}
}
}

public class Main {
public static void main(String args[]) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.start();
t2.start();
}
}

이 코드는 두 개의 스레드를 만들어 동시에 실행합니다.

Java 동기화

여러 스레드가 공유된 리소스에 접근할 때, 충돌을 피하기 위해 동기화가 필요합니다. 교차로에 트래픽 신호가 있는 것과 같습니다:

class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}

synchronized 키워드는 increment 메서드를 동시에 실행하는 스레드가 하나만 있도록 합니다.

Java 네트워킹

Java는 네트워크 애플리케이션을 쉽게 만들 수 있게 합니다. 간단한 서버를 만들어 보겠습니다:

import java.net.*;
import java.io.*;

public class SimpleServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is listening on port 8080");
Socket socket = serverSocket.accept();
System.out.println("Client connected");
}
}

이 서버는 포트 8080에서 듣고 있으며, 클라이언트가 연결되면 메시지를 출력합니다.

Java 컬렉션

Java 컬렉션은 객체를 저장하는 다양한 유형의 컨테이너입니다. 몇 가지를 살펴보겠습니다:

List

import java.util.*;

List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
System.out.println(fruits);  // 출력: [Apple, Banana]

Set

Set<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(1);  // 중복, 추가되지 않음
System.out.println(numbers);  // 출력: [1, 2]

Map

Map<String, Integer> ages = new HashMap<>();
ages.put("Alice", 25);
ages.put("Bob", 30);
System.out.println(ages.get("Alice"));  // 출력: 25

Java 인터페이스

인터페이스는 클래스가 따르기로 동의한 계약과 같습니다. 예제를 보겠습니다:

interface Animal {
void makeSound();
}

class Dog implements Animal {
public void makeSound() {
System.out.println("Woof!");
}
}

class Cat implements Animal {
public void makeSound() {
System.out.println("Meow!");
}
}

DogCat은 모두 Animal 인터페이스를 구현하여 makeSound 메서드를 제공합니다.

Java 데이터 구조

데이터 구조는 데이터를 조직하고 저장하는 방법입니다. 간단한 링크드 리스트를 보겠습니다:

class Node {
int data;
Node next;

Node(int d) { data = d; }
}

class LinkedList {
Node head;

public void add(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}

public void print() {
Node current = head;
while (current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
}

public class Main {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add(1);
list.add(2);
list.add(3);
list.print();  // 출력: 1 2 3
}
}

이 코드는 간단한 링크드 리스트 데이터 구조를 구현합니다.

Java 컬렉션 알고리즘

Java는 컬렉션을 다루는 데 유용한 알고리즘을 많이 제공합니다. 정렬의 예제를 보겠습니다:

import java.util.*;

List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5));
Collections.sort(numbers);
System.out.println(numbers);  // 출력: [1, 1, 2, 3, 4, 5, 5, 6, 9]

고급 Java

학습을 계속하면서 더 복잡한 Java 개념을 만나게 될 것입니다. 람다 표현식은 Java 8에서 도입되었으며, Java 11에서 더 개선되었습니다:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.forEach(n -> System.out.println(n * 2));

이 코드는 람다 표현식을 사용하여 각 숫자를 2배로 곱하고 출력합니다.

Java 기타

Java 11은 몇 가지 기타 기능을 도입했습니다. 하나는 지역 변수 타입 추론을 위한 var 키워드입니다:

var message = "Hello, Java 11!";
System.out.println(message);

컴파일러는 message가 String 타입임을 추론합니다.

Java API 및 프레임워크

Java는 방대한 API와 프레임워크 생태계를 가지고 있습니다. 하나의 인기 프레임워크는 Spring Boot입니다. 간단한 "Hello World" Spring Boot 애플리케이션을 보겠습니다:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class HelloWorldApplication {

public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}

@GetMapping("/")
public String hello() {
return "Hello, World!";
}
}

이 애플리케이션은 루트 URL에 접근할 때 "Hello, World!"를 응답합니다.

Java 클래스 참조

Java는 실행 중에 클래스에 대한 참조를 가져올 수 있습니다. 예제를 보겠습니다:

Class<?> stringClass = String.class;
System.out.println(stringClass.getName());  // 출력: java.lang.String

Java 유용한 자원

Java를 배우는 데 유용한 몇 가지 자원을 소개합니다:

  1. Oracle의 공식 Java 문서
  2. Codecademy의 Java 과정
  3. "Head First Java" 책
  4. Stack Overflow에서 질문하기

새로운 기능

Java 11은 여러 가지 새로운 기능을 도입했습니다. 다음은 몇 가지 요약입니다:

기능 설명
지역 변수 문법을 위한 람다 매개변수 람다 표현식에서 var 사용
표준 HTTP 클라이언트 표준화된 HTTP 클라이언트 API
단일 파일 소스 코드 프로그램 실행 Java 소스 파일을 직접 실행
String 메서드 isBlank(), lines(), strip() 등 새로운 메서드
Files 메서드 readString(), writeString() 등 새로운 메서드

이렇게 Java 11의 흥미로운 여정을 마치겠습니다! 코드를 배우는 것은 새로운 언어를 배우는 것과 같아요 - 연습, 인내, 그리고 열정이 필요합니다. 초보자였던 시절이 어려웠다고 느꼈던 적이 있을지도 모릅니다. 계속编写 코드하고, 계속 실험하고, 가장 중요한 것은 즐겁게 만들어 가세요! 곧 복잡한 Java 애플리케이션을 작성하고 있을 때, 모든 것이 어렵게 보였던 첫날을 기억할 것입니다. 즐거운 코딩 되세요!

Credits: Image by storyset