jcmd는 JVM 진단(diagnostic) 도구로, 로컬 머신에서 실행 중인 특정 JVM에 진단 명령을 전달할 수 있는 명령줄 유틸리티입니다. 이 도구는 Java 7 버전부터 JDK 설치에 기본 포함되어 있으며, 실행 파일은 %java_home%\bin\jcmd.exe 경로에 위치합니다. 환경 변수 path에 %java_home%\bin 디렉터리가 등록되어 있다면, 아래와 같이 jcmd -h 명령을 실행해 사용 가능한 모든 옵션 목록을 확인할 수 있습니다. C:\Users\User>jcmd -h Usage: jcmd
자바 9(Java 9)에는 코드 마이그레이션과 유지보수를 돕는 다양한 진단 도구가 포함되어 있으며, 그중 Jdeps와 Jdeprscan이 가장 널리 활용됩니다. 두 도구는 이름이 비슷하고 JDK와 함께 배포되지만, 목적과 기능은 완전히 다릅니다.Jdeps는 클래스와 패키지 수준의 의존성(dependency)을 분석하는 도구입니다. 예를 들어 jdeps -jdkinternals jararchive.jar 명령을 실행하면 자바 내부 API(JDK Internal API)를 사용 중인 모든 클래스의 목록이 출력되며, 의존성에 대한 상세한
JShell은 Java 9에서 도입된 명령줄 도구로, 표현식, 클래스, 인터페이스, 메서드 등 간단한 코드 조각을 즉시 실행하고 결과를 확인할 수 있는 REPL(Read-Eval-Print Loop) 환경을 제공합니다.Set은 Java에서 중복되지 않는 고유한 요소(unique elements)만 저장하는 컬렉션의 규약을 정의하는 인터페이스입니다. object1.equals(object2)가 true를 반환한다면, object1과 object2 중 하나만 Set 구현체에 저장될 수 있습니다.불변(Immutable) Set 생성과 a
Java에서 destroyForcibly() 메소드는 실행 중인 프로세스를 강제로 종료하는 데 사용됩니다. 일반적인 종료 요청에 응답하지 않거나 멈춰 있는(frozen) 프로세스를 처리해야 할 때 특히 유용합니다.예를 들어, destroyForcibly()를 호출한 직후에는 프로세스가 아직 완전히 종료되지 않았을 수 있으므로 isAlive() 메소드가 여전히 true를 반환할 수 있습니다. 또한 destroyForcibly()는 종료 요청이 성공적으로 접수되면 true를, 실패하면 false를 반환하므로 이 반환값을 활용해 종료 처
Java 9에서는 기존의 Process API가 대폭 개선되어 새로운 메서드들이 추가되었으며, 프로세스와 관련된 세부 정보를 손쉽게 조회할 수 있는 새로운 인터페이스인 ProcessHandle과 ProcessHandle.Info가 도입되었습니다.ProcessHandle 인터페이스는 운영체제 수준의 네이티브 프로세스를 식별하고 제어할 수 있는 기능을 제공합니다. 이를 통해 각각의 프로세스에 대해 실행 여부(liveness)를 모니터링하거나, 자식 프로세스(children) 목록을 확인하고, 프로세스의 상세 정보를 조회하며, 필요한 경
CompletableFuture<T> 클래스는 Java에서 Future<T> 인터페이스를 구현한 클래스입니다. CompletableFuture는 명시적으로 완료된 상태의 Future처럼 사용할 수도 있습니다.Future 인터페이스의 한계Future 인터페이스는 제공하는 기능이 많지 않습니다. 비동기 연산의 결과를 얻으려면 블로킹(blocking) 방식으로 동작하는 get() 메서드를 호출해야 하며, 결과가 준비될 때까지 호출 스레드가 대기하게 됩니다. 이 때문에 여러 개의 의존적인 작업을 논블로킹(non-blo
JShell은 Java 9에서 새롭게 도입된 명령줄(command-line) 프롬프트 도구입니다. 흔히 REPL(Read-Eval-Print Loop) 도구라고도 불리며, 간단한 코드 문장을 입력하면 즉시 평가하고 실행한 뒤 그 결과를 바로 출력해 주는 기능을 제공합니다.Map 인터페이스는 요소들을 키(key)/값(value) 쌍의 형태로 저장하는 컬렉션을 구현하기 위한 규약(계약)을 정의합니다. 이 Map 인터페이스를 구현하는 대표적인 Java 컬렉션 클래스로는 HashMap, LinkedHashMap, TreeMap이 있습니다.
JShell이란 무엇인가?JShell은 Java 9부터 새롭게 도입된 REPL(Read-Eval-Print Loop) 도구로, 코드 조각이나 샘플 표현식을 컴파일 과정 없이 즉시 실행하고 결과를 확인할 수 있는 대화형 환경을 제공합니다. 일반적으로는 명령줄 인터페이스에서 사용되지만, JavaFX 애플리케이션과 결합하면 GUI 기반의 JShell도 프로그래밍 방식으로 손쉽게 구현할 수 있습니다.JavaFX 애플리케이션에서 JShell을 활용하려면 먼저 자바 프로그램에 다음 패키지들을 임포트해야 합니다.import jdk.jshell.
JShell은 REPL(Read-Evaluate-Print-Loop) 도구로, main() 메서드 없이도 간단한 문장을 입력해 즉시 실행하고 그 결과를 화면으로 확인할 수 있습니다. 명령 프롬프트에서 jshell이라고 입력하기만 하면 곧바로 시작할 수 있습니다.JShell에서 시스템 속성을 확인하려면 System.getProperty()와 System.getProperties() 메서드를 사용하면 됩니다.아래 첫 번째 예제에서는 System 클래스의 정적(static) 메서드인 getProperty()를 활용해 JShell에서 특정
JShell은 클래스, 메서드, 인터페이스, 열거형(enum) 등 간단한 Java 구문을 입력하면 즉시 평가하고 그 결과를 명령줄(command-line) 프롬프트에 출력해 주는 Java Shell 도구입니다.Java 9에서는 운영체제 프로세스를 보다 효과적으로 관리하고 제어할 수 있도록 Process API가 대폭 개선되었습니다. 새롭게 추가된 ProcessHandle 인터페이스는 네이티브 프로세스를 식별하고 제어하는 기능을 제공하며, 프로세스의 생존 여부(liveness)를 확인하거나 프로세스를 종료(destroy)하는 메서드도
문제 소개 정수 num이 하나 주어집니다. 해야 할 일은 이 수의 모든 약수를 구한 뒤, 그중에서 num의 자릿수와 최소 한 개 이상 공통된 숫자를 포함하는 약수의 개수를 세는 것입니다. 예시 1 입력 — num = 24 출력 — 개수는 4 풀이 과정은 다음과 같습니다. 먼저 주어진 수의 약수를 모두 구합니다.→ 24의 약수: 1, 2, 3, 4, 6, 8, 12, 24 다음으로, 각 약수가 num의 자릿수(2, 4)와 일치하는 숫자를 하나라도 포함하는지 확인합니다.→ 조건을 만족하는 약수는 2, 4, 12, 24이며, 따라서
Java에서 16진수 문자열을 바이트 배열로 변환하려면 먼저 Integer 클래스의 parseInt() 메서드를 사용하여 16진수를 10진수 정수 값으로 변환합니다. 이어서 BigInteger 클래스의 toByteArray() 메서드를 호출하면 최종적으로 바이트 배열을 얻을 수 있습니다.변환 과정전체 변환 절차는 다음 세 단계로 정리할 수 있습니다.parseInt() 메서드에 변환할 문자열과 진수(16)를 인자로 전달하여 16진수 문자열을 10진수 정수로 변환합니다.BigInteger.valueOf() 메서드를 사용해 해당 정수 값
체크섬(checksum)은 네트워크를 통해 데이터를 전송할 때 발생할 수 있는 오류를 검출하기 위해 널리 사용되는 대표적인 오류 검출 기법입니다. 송신 측에서 데이터를 기반으로 특정 값을 계산해 함께 전송하면, 수신 측에서 동일한 방식으로 값을 다시 계산하여 두 값을 비교함으로써 데이터가 전송 중에 변형되지 않았는지 확인할 수 있습니다.다음은 Java를 사용하여 체크섬을 구현하는 코드입니다.예제 코드import java.util.*; public class Demo{ public static void main(String a
자바의 HashSet은 해싱(Hashing) 기법을 기반으로 데이터를 저장하고 관리하는 대표적인 컬렉션입니다. 해싱은 요소의 해시 코드를 이용해 저장 위치를 결정하기 때문에 데이터의 추가, 삭제, 검색을 매우 빠른 속도로 처리할 수 있다는 강력한 장점이 있습니다.아래 예제를 통해 HashSet이 해싱을 활용해 데이터를 처리하는 과정을 살펴보겠습니다.예제 코드import java.util.*; public class Demo{ private final String f_str, l_str; public Demo(Strin
Java 컴파일러는 초기화되지 않은 지역 변수를 그대로 두는 것을 허용하지 않습니다. 지역 변수가 조건부 블록 내부에서 초기화되는 경우, 다음과 같은 세 가지 상황이 발생할 수 있습니다.조건부 블록 안에 값이 직접 제공되고, 주어진 조건이 참(true)이라면 코드는 정상적으로 컴파일됩니다.조건부 블록 안에 값 대신 변수가 사용되고, 조건이 참(true)이라면 컴파일 오류가 발생합니다.검사하려는 조건이 거짓(false)이라면 컴파일 오류가 발생합니다.반면, 조건부 블록 외부에서 지역 변수를 기본값으로 미리 초기화해두면 어떠한 오류도
Java에서 배열에 값을 할당하는 방식에는 몇 가지 중요한 규칙과 특징이 있습니다. 이 글에서는 실제 동작하는 예제 코드와 함께 배열 할당과 관련된 핵심 사실들을 살펴보겠습니다. 1. 객체 타입 배열에는 하위 클래스 객체도 저장할 수 있다 객체 타입의 배열을 생성할 때, 배열 내부에 들어갈 요소는 배열이 선언된 타입 그대로일 수도 있고, 해당 타입의 하위 클래스(자식 클래스) 객체일 수도 있습니다. 이는 다형성(polymorphism) 덕분에 가능한 것으로, 상위 클래스 타입의 참조 변수가 하위 클래스 객체를 가리킬 수 있는 Jav
Java에서는 증가(++), 감소(--) 연산자와 관련하여 알아두면 유용한 흥미로운 특징들이 많습니다. 이 글에서는 대표적인 두 가지 규칙을 예제 코드와 함께 살펴보겠습니다.1. final 변수에는 증감 연산자를 사용할 수 없다첫 번째 특징은 final 키워드로 선언된 변수에는 증가·감소 연산자를 사용할 수 없다는 점입니다. 그 이유는 final 변수는 한 번 값이 초기화되면 프로그램 실행 중에 절대 변경할 수 없기 때문입니다. 증감 연산자는 본질적으로 변수의 값을 수정하는 연산이므로, final 변수에 적용하면 컴파일 오류가 발생
전 세계에서 가장 널리 사용되는 프로그래밍 언어 중 하나인 자바(Java). 하지만 이 강력한 언어가 어떻게 탄생했는지, 그리고 어떤 숨겨진 이야기들을 담고 있는지 알고 계셨나요? 오늘은 자바에 관한 흥미로운 사실 여덟 가지를 소개해 드립니다.1. 우연한 실수로 탄생한 자바자바는 사실 철저한 우연 속에서 만들어졌습니다. 당시 개발자 팀은 셋톱박스(set-top box)를 개발하는 프로젝트에 참여하고 있었고, 그 과정에서 C++ 코드를 정리하고 개선하는 작업을 진행했습니다. 그런데 이러한 수정 작업을 마무리하던 중, 팀은 어느새 새로
자바(Java)에서 null이 동작하는 방식 자바에는 null과 관련된 여러 가지 중요한 규칙과 특성이 있습니다. 이 글에서는 실제 예제 코드와 함께 자바 개발자라면 반드시 알아야 할 null의 핵심 특징들을 하나씩 살펴보겠습니다. 1. 참조 변수의 기본값은 항상 null이다 자바에서 모든 참조형(reference) 변수는 명시적으로 초기화하지 않으면 기본값으로 null을 갖습니다. 아래 예제를 통해 확인해 보겠습니다. 예제 코드 public class Demo { private static Object my_obj;
자바에서 hashCode 함수는 객체의 해시 코드를 얻기 위해 사용됩니다. 이 함수는 모든 클래스의 최상위 부모인 Object 클래스에 정의되어 있으며, 객체 참조의 메모리 주소를 정수 형태로 반환합니다. hashCode는 네이티브(native) 함수로 선언되어 있어, 자바 코드만으로는 객체의 실제 참조 값을 직접 가져올 수 없습니다.hashCode()와 버킷(Bucket)의 개념HashMap의 성능을 극대화하려면 hashCode()를 올바르게 활용하는 것이 중요합니다. 기본적으로 이 함수는 해시맵 내부의 버킷(bucket)과 인덱