문제 개요 이진 트리가 주어졌을 때, 홀수 위치에 있는 노드들의 합과 짝수 위치에 있는 노드들의 합의 차이를 구하는 프로그램을 작성하는 것이 목표입니다. 여기서 말하는 위치는 레벨 순서(Level Order) 탐색을 기준으로 합니다. 각 레벨에서 왼쪽부터 차례대로 노드를 살펴보며, 해당 레벨에서 가장 먼저 만나는 노드를 홀수 위치로 간주하고 그다음 노드부터는 짝수 → 홀수 → 짝수 순으로 번갈아 분류합니다. 즉, 루트 노드는 항상 홀수 위치에서 시작합니다. 예시로 이해하기 5 / \ 2 6 /
정수로 이루어진 배열이 주어지고, 모든 요소는 1,000,000 미만이라고 가정합니다. 이 문제의 목표는 배열에 포함된 소수 중 가장 큰 소수와 가장 작은 소수를 찾아 그 차이를 계산하는 것입니다.문제 설명배열의 각 요소가 소수인지 판별한 뒤, 소수들 사이의 최댓값과 최솟값을 구하고 두 값의 차를 반환하면 됩니다. 단순히 매번 소수 여부를 검사하는 방식도 가능하지만, 배열의 크기가 커질 경우 비효율적일 수 있습니다.예시배열: [ 1, 2, 3, 4, 5 ] 가장 큰 소수 = 5 가장 작은 소수 = 2 차이 = 5 - 2 = 3해
스칼라(Scala)에서는 트레이트(Trait)와 추상 클래스(Abstract Class)를 통해 공통 기능을 재사용하고 다형성을 구현할 수 있습니다. 두 개념은 자바 개발자에게 익숙하지만, 스칼라에서는 각각의 특징과 용도가 뚜렷하게 구분됩니다.트레이트(Trait)란?트레이트는 자바의 인터페이스(Interface)와 유사한 개념으로, trait 키워드를 사용하여 선언합니다. 트레이트는 추상 메서드뿐만 아니라 구현이 완료된 메서드도 포함할 수 있으며, 하나의 클래스가 여러 트레이트를 믹스인(mixin)할 수 있어 매우 유연한 설계가 가
Java 9의 가장 큰 변화는 모듈 시스템(Module System)의 도입입니다. 이를 통해 모듈화된 JVM이 제공되며, 가용 메모리가 적은 기기에서도 실행할 수 있게 되었습니다. JVM은 애플리케이션에 필요한 모듈과 API만으로 구동되므로 리소스 사용이 크게 최적화됩니다.module Module-Name { requires moduleName; exports packageName; }모듈 시스템은 위와 같은 간결한 문법으로 정의하며, requires로 의존 모듈을 선언하고 exports로 외부에 공개할 패키지를 지정합
JShell이란 무엇인가? JShell은 Java 9에 새롭게 도입된 대화형 Java Shell 도구입니다. 코드를 한 줄씩 입력하면 즉시 실행 결과를 확인할 수 있어, 간단한 문법 테스트나 API 학습에 매우 유용합니다. JShell은 REPL(Read-Evaluate-Print-Loop), 즉 읽기-평가-출력-반복 방식으로 동작하며, 명령줄 프롬프트에서 바로 실행할 수 있습니다. --startup 플래그로 시작 스크립트 지정하기 JShell은 실행 시점에 미리 정의된 스크립트를 자동으로 로드하는 기능을 제공합니다. --star
Stream API는 스트림 파이프라인을 통해 컬렉션에 대한 다양한 연산을 손쉽게 수행할 수 있도록 풍부한 내장 기능을 제공합니다. 이 API는 선언형 프로그래밍(Declarative Programming) 방식을 채택하고 있어 코드가 간결해지고 오류 발생 가능성도 크게 줄어듭니다. Java 9에서는 Stream API에 실무에서 유용하게 활용할 수 있는 몇 가지 메서드가 새롭게 추가되었습니다. Stream.iterate(): 전통적인 for 루프를 대체할 수 있는 스트림 버전의 반복 메서드입니다. Stream.takeWhile(
Publisher 인터페이스는 무제한 개수의 순차적 요소를 제공하는 공급자 역할을 하며, Subscriber(구독자)로부터 전달받은 수요(demand)에 따라 요소들을 발행(publish)합니다. Java 9부터 표준 라이브러리에 포함된 java.util.concurrent.Flow API는 리액티브 스트림(Reactive Streams) 사양을 기반으로 하며, 비동기 환경에서 안정적인 데이터 흐름 처리를 지원합니다. Publisher.subscribe(Subscriber) 메서드가 호출되면 Subscriber의 메서드들은 일반적으
VarHandle이란?VarHandle(변수 핸들)은 변수에 대한 타입이 지정된 참조(reference)를 의미합니다. 참조 대상은 배열 요소, 클래스의 인스턴스 필드 또는 정적(static) 필드가 될 수 있습니다. VarHandle 클래스는 특정 조건 하에서 변수에 대한 읽기 및 쓰기 접근을 제공하며, 불변(immutable) 객체로서 별도의 가시성 상태를 갖지 않습니다. 또한 상속을 통해 서브클래스를 만들 수 없고, 각 VarHandle은 해당 핸들이 나타내는 변수의 타입을 나타내는 제네릭 타입 T를 가집니다.VarHandle
JShell이란 무엇인가?JShell은 Java 9에서 처음 도입된 명령줄 도구(command-line tool)로, Java 역사상 최초의 공식 REPL(Read-Eval-Print Loop) 도구입니다. 사용자가 입력한 코드를 즉시 읽고(read), 평가하고(evaluate), 결과를 출력(print)하는 간단한 프로그래밍 환경을 제공하여, 별도의 클래스 파일 작성이나 컴파일 과정 없이도 코드를 빠르게 테스트하고 학습할 수 있습니다.일반적인 Java 프로그램과 달리, JShell에서는 클래스나 인터페이스 외부에서 직접 변수, 메
VarHandle이란? VarHandle은 변수에 대한 참조(reference)로, 일반(plain) 읽기/쓰기, volatile 읽기/쓰기, compare-and-swap(CAS)과 같은 다양한 접근 모드(access mode)를 통해 변수에 안전하게 접근할 수 있도록 해주는 기능입니다. 기존의 java.util.concurrent.atomic 패키지나 sun.misc.Unsafe가 제공하던 기능과 유사하지만, 표준 API로서 더 안전하고 명확한 방식으로 동시성 제어를 구현할 수 있습니다. VarHandle이 참조할 수 있는 대상
다중 버전 호환 JAR(Multi-Release JAR)란?Java 9에서 도입된 다중 버전 호환 JAR(Multi-Release JAR) 기능을 사용하면 하나의 JAR 파일 안에 여러 Java 버전에 맞는 클래스 파일을 함께 포함시킬 수 있습니다. 이를 통해 라이브러리가 특정 Java 환경에서 실행될 때, 해당 버전에 최적화된 클래스 버전이 자동으로 선택되어 사용되도록 만들 수 있습니다.컴파일 시 대상 Java 버전은 --release 옵션을 통해 지정할 수 있으며, 이 덕분에 구버전과 신버전의 Java 환경을 모두 지원하는 라이
Java 9에서는 Optional<T> 클래스에 stream(), or(), ifPresentOrElse() 세 가지 새로운 메서드가 추가되었습니다. 이 중 or() 메서드는 값이 없는 상황을 더욱 우아하게 처리할 수 있게 해주는 핵심 기능입니다.애초에 Optional 클래스가 도입된 목적은 NullPointerException(널 포인터 예외)을 방지하는 것이었습니다. Java 9의 or() 메서드는 이러한 안전성을 한 단계 더 발전시켜 줍니다.Optional.or() 메서드란?or() 메서드는 값이 존재하면 해당 값을
Java 9 이전에는 특정 패키지, 클래스, 인터페이스, 메서드에 대한 정보를 확인하려면 구글 등 외부 검색 엔진을 활용해야 하는 번거로움이 있었습니다. 하지만 Java 9부터는 Javadoc 자체에 검색 기능이 포함되어 API 문서 내에서 바로 원하는 항목을 찾을 수 있게 되었으며, 생성되는 문서 역시 HTML5 표준을 준수하도록 개선되었습니다.HTML5 호환 Javadoc이란?HTML5 호환 문서는 모바일 기기에서의 가독성이 뛰어나고, 웹 접근성이 향상되며, 최신 브라우저 환경에서 더욱 안정적으로 동작한다는 장점이 있습니다. J
다이아몬드 연산자(diamond operator, <>)는 Java 7에서 코드의 가독성을 높이기 위해 도입되었습니다. 하지만 초기 버전에서는 익명 내부 클래스(anonymous inner class)에는 사용할 수 없었다는 제한이 있었습니다.Java 9부터는 이러한 제한이 해소되어, 다이아몬드 연산자를 익명 내부 클래스와 함께 사용할 수 있게 되었습니다. 이를 통해 제네릭 타입을 중복으로 명시할 필요가 없어지고 코드가 훨씬 간결해집니다.사용 예제아래 예제는 Java 9에서 익명 클래스에 다이아몬드 연산자를 적용하는 방법
Java 9에서는 Process API가 크게 개선되었으며, 그 핵심에는 ProcessHandle 인터페이스의 도입이 있습니다. ProcessHandle 인터페이스의 인스턴스는 로컬 프로세스를 식별하며, 프로세스의 상태(status)를 조회하고 프로세스를 관리할 수 있도록 지원합니다. 또한 ProcessHandle.Info를 사용하면 로컬 프로세스의 PID(프로세스 ID)를 비롯한 다양한 정보를 손쉽게 얻을 수 있습니다.ProcessBuilder 클래스는 운영체제 수준의 별도 프로세스를 생성하는 데 사용됩니다. 아래 예제에서는 Pr
Java 9 Subscriber 인터페이스란?Subscriber(구독자) 인터페이스는 Publisher(발행자)를 구독하여 데이터를 수신하는 역할을 담당합니다. 구독자는 onNext() 메서드를 통해 발행되는 아이템을 받고, 오류가 발생하면 onError() 메서드로 에러 메시지를 전달받으며, 더 이상 받을 아이템이 없다는 신호는 onComplete() 메서드를 통해 확인할 수 있습니다.이러한 신호들이 시작되기 전에, Publisher는 반드시 onSubscribe() 메서드를 먼저 호출해 구독 관계를 설정합니다.public int
JShell은 Java 9에서 새롭게 도입된 명령줄 기반 대화형 도구입니다. main() 메서드를 선언하지 않고도 간단한 문장, 표현식, 변수, 메서드, 클래스, 인터페이스 등을 즉시 실행해 볼 수 있어 학습과 테스트에 매우 유용합니다. JShell에서 컴파일러는 타입 캐스팅(typecasting) 문제가 발생할 가능성이 있으면 오류를 통해 개발자에게 경고합니다. 그럼에도 불구하고 개발자가 의도적으로 변환하려는 경우에는 명시적 캐스팅(explicit casting)이 필요합니다. 반대로 작은 데이터 값을 더 큰 타입에 저장하는 경우
try-with-resources 문은 Java 9에서 크게 개선되었습니다. 이미 final 변수이거나 사실상 final(effectively final)인 리소스가 있다면, try-with-resources 문 내부에서 새 변수를 다시 선언하지 않고도 기존 변수를 그대로 사용할 수 있습니다.try 블록에서는 여러 개의 리소스를 동시에 선언할 수 있습니다. 각 리소스는 세미콜론(;)으로 구분하며, 초기화 부분에는 null 또는 non-null이 되는 리소스를 원하는 만큼 자유롭게 나열할 수 있습니다.try 블록이 정상적으로 종료되거
@Deprecated 어노테이션이 지정된 요소는 더 이상 사용하지 않는 것이 권장됩니다. 해당 요소가 사용 중단(deprecated) 처리되는 주요 이유는 다음과 같습니다.사용 시 오류가 발생할 위험이 있고 잠재적으로 위험할 수 있습니다.향후 버전과 호환되지 않을 가능성이 있습니다.향후 버전에서 제거될 수 있습니다.더 나은 성능과 효율성을 갖춘 대체 솔루션이 이미 존재합니다.Java 9에서 추가된 두 가지 새로운 속성Java 9에서는 @Deprecated 어노테이션에 since와 forRemoval이라는 두 가지 새로운 속성(ele
Java 9 Subscription 인터페이스란?Subscription(구독)은 정확히 하나의 Publisher(발행자)와 하나의 Subscriber(구독자) 사이에서만 공유되며, 두 객체 간의 데이터 교환을 중재하는 역할을 합니다. 바로 이러한 이유 때문에 subscribe() 메서드는 생성된 Subscription 객체를 반환하지 않고 void를 반환합니다. Subscription은 오직 onSubscribe() 메서드 콜백을 통해서만 Subscriber에게 전달됩니다.Subscription 인터페이스는 두 가지 메서드를 포함합