자바 16 - 새로운 기능

안녕하세요, 자바 프로그래밍에 도전하는 여러분! 이 흥미로운 여정에서 여러분의 안내자로서 자바 16의 세계로 안내해드리게 되어 기쁩니다. 프로그래밍을 가르치는 지식을 많이 쌓아온 저로서는 자바는 프로그래밍 세계에서 스위스 아르미Knife와도 같은 존재입니다. 다재다능하며 강력하고, 항상 진화하고 있습니다. 오늘 우리는 자바 16이 제공하는 반짝이는 새로운 기능을 탐구해보겠습니다. 좋아하는 음료를 한 잔 마시고 편안하게 앉아, 함께 빠져들어 보세요!

Java 16 - New Features

자바 제어 문장

새로운 기능에 뛰어들기 전에, 자바의 기본 제어 문장을 간단히復習해보겠습니다. 이 것들은 우리가 프로그램의 흐름을 제어하는 데 필요한 기본 블록들입니다.

If-Else 문장

If-Else 문장은 코드의 트래픽警察과도 같습니다. 특정 조건에 따라 흐름을 제어합니다.

int age = 18;
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you're too young to vote.");
}

이 예제에서, 나이가 18이상이면 "You can vote!"를 인쇄합니다. 그렇지 않으면, 안타까운 메시지를 인쇄합니다.

For 루프

For 루프는 우리를 위해 반복 작업을 수행하는 충실한 노동자입니다.

for (int i = 1; i <= 5; i++) {
System.out.println("Count: " + i);
}

이 루프는 1에서 5까지의 숫자를 인쇄합니다.

객체 지향 프로그래밍

자바는 우리 주변의 현실 세계와 같은 객체들로 가득 차 있습니다. 간단한 클래스를 만들어 보겠습니다.

public class Dog {
String name;
int age;

public void bark() {
System.out.println(name + " says Woof!");
}
}

// Dog 클래스 사용
Dog myDog = new Dog();
myDog.name = "Buddy";
myDog.age = 3;
myDog.bark();  // 출력: Buddy says Woof!

여기서 우리는 Dog 클래스를 생성했으며, 속성(이름과 나이)과 메서드(bark)를 정의했습니다. Dog 객체를 만들고 그것을 짖게 할 수 있습니다!

자바 내장 클래스

자바는 우리의 삶을 더 쉽게 만들어주는 많은 내장 클래스를 제공합니다. String 클래스를 보겠습니다. 자바 16에서 cool 업데이트를 받았습니다.

String name = "John Doe";
System.out.println(name.toLowerCase());  // john doe
System.out.println(name.toUpperCase());  // JOHN DOE
System.out.println(name.length());       // 8

자바 16의 새로운 기능

이제 자바 16의 흥미로운 새로운 기능을 탐구해보겠습니다!

레코드

레코드는 단순한 데이터 운반 클래스를 만드는 데 게임 체인저입니다. 데이터를 저장하는 데 사용되는 클래스를 만드는 단축 경로와도 같습니다.

record Person(String name, int age) {}

// 레코드 사용
Person john = new Person("John Doe", 30);
System.out.println(john.name());  // John Doe
System.out.println(john.age());   // 30

레코드를 사용하면 자바가 자동으로 생성자, 접근자, equals(), hashCode(), toString() 메서드를 생성해줍니다. 모든 보일러플레이트 코드를 관리해주는 개인 비서가 있는 것과도 같습니다!

instanceof에 대한 패턴 매칭

이 기능은 타입 검사와 캐스팅을 더 간결하고 덜 오류가 발생하게 합니다.

Object obj = "Hello, Java 16!";
if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}

이 예제에서, obj가 String인지 검사하고, 그렇다면 자동으로 String 변수 s로 캐스팅합니다. 명시적인 캐스팅이 필요 없습니다!

封闭类

封闭类은 다른 클래스가 그것을 확장할 수 있는 것을 제한합니다. 클래스들의 독점 클럽을 만드는 것과도 같습니다!

public sealed class Shape permits Circle, Square, Triangle {
// Shape 구현
}

final class Circle extends Shape {
// Circle 구현
}

final class Square extends Shape {
// Square 구현
}

final class Triangle extends Shape {
// Triangle 구현
}

이 예제에서, Circle, Square, Triangle만 Shape를 확장할 수 있습니다. 다른 클래스가 Shape를 확장하려고 하면 컴파일 오류가 발생합니다.

자바 파일 처리

파일 처리는 많은 애플리케이션에서 필수입니다. 자바 16에서 파일을 읽는 방법을 보겠습니다.

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

try {
String content = Files.readString(Path.of("example.txt"));
System.out.println(content);
} catch (IOException e) {
System.out.println("An error occurred: " + e.getMessage());
}

이 코드는 "example.txt"의 전체 내용을 문자열로 읽어들입니다. 새로운 readString 메서드는 파일 읽기를 간편하게 만듭니다!

자바 오류 및 예외

오류를 부드럽게 처리하는 것은 좋은 프로그래밍의 표징입니다. try-catch 블록을 보겠습니다:

try {
int result = 10 / 0;  // 이는 ArithmeticException을 발생시킵니다
} catch (ArithmeticException e) {
System.out.println("Oops! You can't divide by zero.");
} finally {
System.out.println("This always runs, no matter what!");
}

여기서 우리는 0으로 나누는 작업을 시도하고 있습니다(수학에서는 큰 금지입니다!). 자바는 이 오류를 잡아주고 우리가 부드럽게 처리할 수 있게 해줍니다.

자바 다스레드

다스레드는 우리의 프로그램이 동시에 여러 가지 작업을 수행할 수 있게 합니다. 두 손으로 동시에 머리를 쓰고 배를 문지르는 것과도 같습니다!

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();
}
}

이 코드는 두 개의 다스레드를 생성하여 동시에 실행합니다. 각각의 다스레드는 일련의 숫자를 인쇄합니다.

자바 동기화

여러 다스레드가 공유된 리소스에 접근할 때, 그것들을 동기화하여 충돌을 피해야 합니다. 문이 동시에 두 사람이 지나갈 수 없도록 하는 것과도 같습니다!

class Counter {
private int count = 0;

public synchronized void increment() {
count++;
}

public int getCount() {
return count;
}
}

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

결론적으로, 자바 16은 우리의 코딩 생활을 더 쉽고 생산적으로 만들어주는 흥미로운 새로운 기능들을 많이 제공합니다. 레코드는 보일러플레이트 코드를 줄이고, instanceof에 대한 패턴 매칭은 타입 검사와 캐스팅을 간결하게 만들어줍니다. 이러한 기능들은 자바를 더 표현력 있고 덜 verbose하게 만듭니다.

기억하시길, 코딩 배우는 여정이 목적지가 아닙니다. 꾸준히 연습하며 호기심을 가지고, 실수를 두려워하지 마세요 - 우리는 이러한 실수를 통해 배우고 성장합니다. 행복하게 코딩하시고, 커피는 강하고 버그는 적기를 바랍니다!

Credits: Image by storyset