스투지 정렬(Stooge Sort)은 재귀 호출을 기반으로 동작하는 정렬 알고리즘입니다. 구현 방식이 매우 단순하지만 시간 복잡도가 약 O(n^2.71)로 비효율적이기 때문에 실무보다는 재귀와 분할 개념을 학습하기 위한 교육용 예제로 주로 활용됩니다. 예제 코드 2){ int temp = (h_val - l_val + 1) / 3; stooge_sort(my_arr, l_val, h_val - temp); stooge_sort(my_arr, l_val + temp,
자바(Java)에서는 정규 표현식(Regular Expression)을 활용하면 문자열에 특수 문자가 포함되어 있는지 손쉽게 확인할 수 있습니다. 아래 예제를 통해 그 구현 방법을 살펴보겠습니다.예제 코드import java.util.regex.Matcher; import java.util.regex.Pattern; public class Demo { public static void main(String[] args){ String my_str="This is
문장 속에서 특정 단어를 찾아 별표(*)로 바꿔야 하는 경우가 종종 있습니다. 민감한 정보를 가리거나 퀴즈의 빈칸 문제를 만들 때처럼 말이죠. 이번 글에서는 자바(Java)를 활용해 문장에서 지정한 패턴과 일치하는 단어를 같은 길이의 별표 문자열로 대체하는 프로그램을 만들어 보겠습니다.예제 코드public class Demo{ static String replace_word(String sentence, String pattern){ &nb
Java에서 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy)는 모두 주어진 객체를 복제한다는 공통점이 있지만, 복사하는 방식과 그 결과에서 중요한 차이가 있습니다. 두 방식의 개념과 동작 차이를 예제 코드와 함께 살펴보겠습니다. 얕은 복사(Shallow Copy)란? 얕은 복사는 객체의 새 인스턴스를 생성한 뒤, 원본 객체의 필드 값을 그대로 새 인스턴스에 복사하는 방식입니다. 이때 배열이나 객체처럼 참조 타입인 필드는 값 자체가 아니라 참조(주소)만 복사되기 때문에, 원본과 복사본이 동일한 내부 객체를 공유하게
표준 정규 분포(SND)란?표준 정규 분포(Standard Normal Distribution, SND)는 평균이 0이고 표준 편차가 1인 정규 분포를 의미합니다. 통계학에서 가장 널리 사용되는 개념 중 하나로, 임의의 정규 분포 데이터를 z-점수(z-score)라 불리는 표준화된 값으로 변환하여 비교하고 분석할 수 있게 해줍니다.표준 정규 편차(표준화 점수)는 다음 공식으로 계산됩니다.z = (X − μ) / σ여기서 X는 관측값, μ는 평균, σ는 표준 편차를 나타냅니다.Java 예제 코드다음은 Java를 사용해 표준 정규 편차
Java에서 정적 블록(static block)은 클래스 로더(classloader)가 해당 클래스를 메모리에 로드하는 시점에 단 한 번 실행되는 특별한 코드 블록입니다. 정적 블록은 main() 메서드보다 먼저 호출되기 때문에, 클래스 초기화 작업이나 정적 변수의 초기값 설정에 주로 활용됩니다.정적 블록의 실행 시점정적 블록은 다음과 같은 특징을 가집니다.클래스가 JVM에 의해 로드될 때 자동으로 실행됩니다.인스턴스 생성 여부와 관계없이 딱 한 번만 수행됩니다.main() 메서드보다 항상 먼저 호출됩니다.예제class Demo{
자바에서 정적 제어 흐름(Static Control Flow)은 클래스가 JVM에 의해 로드되는 시점에 정적(static) 멤버들이 처리되는 순서를 의미합니다. 이 흐름은 정적 멤버를 식별하는 것으로 시작하여, 정적 블록을 실행한 뒤, 마지막으로 정적 main 메서드를 실행하는 순서로 진행됩니다. 정적 제어 흐름의 3단계 정적 멤버 식별: 소스 코드 위에서부터 아래로 정적 변수와 정적 블록을 식별하며, 이 단계에서 정적 변수에는 타입별 기본값(int의 경우 0)이 임시로 할당됩니다. 정적 변수 할당 및 정적 블록 실행: 코드에 작
자바(Java) 8부터는 인터페이스 내부에 정적(static) 메서드를 직접 정의할 수 있습니다. 정적 메서드는 객체 생성 없이 인터페이스 이름을 통해 바로 호출할 수 있으며, 유틸리티성 기능을 인터페이스 안에 함께 제공할 때 유용하게 활용됩니다. 아래 예제를 통해 인터페이스에서 정적 메서드를 구현하는 방법을 살펴보겠습니다. 예제 코드 interface my_interface{ static void static_fun(){ System.out.println(In the newly created static m
자바의 이니셜라이저 블록(Initializer Block)은 클래스 안에 중괄호({ })로 감싸 선언하는 특별한 코드 블록입니다. 여러 생성자에서 반복해서 수행해야 하는 공통 초기화 작업을 한 곳에 모아두면 코드 중복을 줄이고 유지보수성을 크게 높일 수 있습니다. 아래 예제를 통해 동작 방식을 살펴보겠습니다. 예제 코드 import java.io.*; public class Demo{ { System.out.println(The common constructor has been invoked); }
파일 시스템을 다루다 보면 특정 디렉토리뿐만 아니라 그 안에 중첩된 모든 하위 디렉토리의 파일까지 한 번에 확인해야 하는 경우가 자주 있습니다. 이럴 때 재귀(Recursion) 기법을 활용하면 깊이에 상관없이 모든 파일과 폴더를 체계적으로 탐색할 수 있습니다. 아래 예제를 통해 그 구현 방법을 살펴보겠습니다.예제 코드import java.io.File; public class Demo{ static void print_recursively(File[] my_arr,int my_index,int sub_level){
개요여러 개의 텍스트 파일을 하나로 합쳐야 하는 경우가 종종 있습니다. Java에서는 File, BufferedReader, PrintWriter 클래스를 조합하면 특정 디렉토리에 있는 모든 파일의 내용을 손쉽게 읽어 들여 하나의 텍스트 파일로 병합할 수 있습니다.예제 코드import java.io.*; public class Demo { public static void main(String[] args) throws IOException { File my_dir = new File(파일이 생성된 경로);
주어진 정수를 크기로 하는 정사각형 숫자 패턴을 콘솔에 출력하는 Java 프로그램을 소개합니다. 아래 예제에서는 사용자로부터 범위를 입력받은 뒤, 2차원 배열을 활용해 행이 교차되는 독특한 형태의 정사각형 패턴을 완성합니다. 예제 코드 import java.util.*; import java.lang.*; public class Demo{ public static void main(String[] args){ Scanner my_scan = new Scanner(Syst
여러 스레드가 동시에 하나의 공유 변수에 접근해 읽기·쓰기를 수행하면, 각 스레드의 연산이 서로 엇갈리면서 최종 결과가 예상과 달라지는 경우가 있습니다. 이러한 현상을 스레드 간섭(Thread Interference) 오류라고 하며, 자바에서 대표적인 동시성(concurrency) 문제 중 하나입니다. 아래 예제를 통해 구체적으로 살펴보겠습니다.예제 코드import java.io.*; class Demo_instance{ static int val_1 = 6; &nbs
멀티스레딩을 구현할 때 한 스레드에서 변경한 값이 다른 스레드에는 보이지 않는 상황이 발생할 수 있습니다. 이는 각 스레드가 동일한 메모리에 대해 서로 일관되지 않은 관점을 가진다는 의미이며, 이를 메모리 일관성 오류(memory consistency error)라고 부릅니다. 메모리 일관성 오류가 발생하는 원인 CPU는 성능 최적화를 위해 메인 메모리에 접근하는 순서를 재배열할 수 있으며, 실제 스레드가 메모리에 접근하는 순서와 달라질 수 있습니다. 이러한 현상은 특히 쓰기(write) 작업이 수행될 때 두드러지는데, 이는 C
네, run() 메서드는 start() 없이 직접 호출하는 것이 가능합니다. 다만 두 방식에는 중요한 차이가 있으며, 아래 예제를 통해 자세히 살펴보겠습니다. 예제 class my_thread extends Thread{ public void run(){ try{ System.out.println ("The thread " + Thread.currentThread().getId() + "
Java에서 확대 변환(Widening Primitive Conversion)은 작은 크기의 기본 타입이 더 큰 크기의 타입으로 자동 변환되는 과정을 말합니다. 예를 들어 byte → short → int → long → float → double 순서로 데이터 손실 없이 변환이 이루어집니다.아래는 확대 기본 변환의 동작을 보여주는 대표적인 예제입니다.예제 코드public class Demo { public static void main(String[] args) { System.out.print(H + E);
Java에서 부동 소수점 수(10진수)를 2진수로 변환하기 위한 코드는 다음과 같습니다. 예제 import java.io.*; public class Demo { static void decimal_to_bin(int n){ int[] bin_num = new int[50]; int i = 0; &
새로운 프로그래밍 언어를 배우기 전에는 기본기를 탄탄히 다지고 핵심 개념을 명확히 이해하는 것이 무엇보다 중요합니다. 이 글에서는 자바(Java)를 배우는 입문자부터 실무 개발자까지 모두에게 도움이 될 만한 유용한 팁과 트릭을 소개합니다. 1. 배열(Array)과 ArrayList의 차이점 완벽히 이해하기 데이터 구조는 데이터를 어떻게 저장하고, 접근하고, 조작하며, 최종적으로 사용자에게 보여줄지를 결정하는 핵심 요소입니다. 배열은 생성 시 크기가 고정되지만 ArrayList는 요소의 추가·삭제에 따라 크기가 동적으로 변합니다.
LinkedHashMap이란?LinkedHashMap은 Map 인터페이스를 해시 테이블(hash table)과 연결 리스트(linked list)로 구현한 클래스입니다. 일반 HashMap과 달리 요소가 삽입된 순서(insertion order)를 그대로 유지하며, 따라서 반복(iteration) 시 예측 가능한 순서로 데이터에 접근할 수 있다는 것이 가장 큰 특징입니다.또한 하나의 키(key)에는 하나의 값(value)만 저장되므로, 동일한 키로 다시 값을 넣으면 기존 값이 새로운 값으로 덮어써진다는 점도 기억해야 합니다.Link
Java에서는 println과 printf 메서드를 활용해 단일 변수 또는 여러 변수를 손쉽게 출력할 수 있습니다. 이 글에서는 실제 예제 코드와 실행 결과를 통해 그 차이와 사용법을 자세히 살펴보겠습니다. 예제 코드 public class Demo { public static void main(String args[]){ String name_1 = Hello; String name_2 = World; &nb