Set 자료구조는 오직 고유한 값(unique values)만 저장하도록 설계되어 있습니다. 즉, Set에는 중복된 값이 절대 저장되지 않습니다. 그렇다면 HashSet은 어떻게 중복을 걸러낼까요? 비밀은 바로 내부 구현에 있습니다.HashSet은 내부적으로 HashMap을 사용한다HashSet 객체가 생성되면, 내부적으로는 HashMap이 함께 만들어집니다. HashSet에 요소를 추가할 때 우리가 호출하는 것은 add() 메서드이지만, 실제로는 내부에 존재하는 HashMap의 put() 메서드가 호출됩니다. 결국 Set은 Has
문자열 인턴십(String Interning)이란?문자열 인턴십은 서로 구별되는 모든 문자열 값에 대해 단 하나의 복사본만 저장하는 기법입니다. 자바에서 String 객체는 한 번 생성되면 내용을 변경할 수 없는 불변(immutable) 객체이므로, 동일한 데이터를 가진 여러 문자열이 하나의 메모리 공간을 공유할 수 있습니다. 이러한 방식 덕분에 프로그램 전체의 메모리 사용량을 크게 줄일 수 있습니다.intern() 메서드 호출 시의 동작먼저 두 문자열 간의 동등성을 검사합니다. 즉, 해당 문자열 객체가 이미 문자열 상수 풀(Str
Java는 Java 8부터 본격적으로 함수형 프로그래밍을 지원하기 시작했으며, Java 9에서는 이를 더욱 편리하게 활용할 수 있도록 IntUnaryOperator 인터페이스가 도입되었습니다. 이 인터페이스는 하나의 int 값을 입력받아 연산을 수행한 뒤 int 결과를 반환하는 단일 항 연산(unary operation)을 표현하는 데 사용됩니다.주요 메서드 살펴보기identity(): 입력값을 그대로 반환하는 항등 연산자를 생성합니다.applyAsInt(int): 정의된 연산을 실제로 적용하고 결과를 반환합니다.andThen():
배열은 자바에서 객체다자바에서 배열은 객체(object)로 취급됩니다. 그 이유는 배열이 new 키워드를 사용하여 생성될 수 있기 때문입니다. new 키워드(연산자)는 항상 객체를 생성할 때 사용되며, 바로 이러한 특성 때문에 배열 역시 객체로 인식되는 것입니다.또한 모든 배열의 직계 부모 클래스, 즉 슈퍼 클래스는 Object 클래스입니다. 자바의 모든 배열 타입은 특정 클래스에 속하며, 이는 정수(int) 배열 타입, float 배열 타입, double 배열 타입 등 각각에 대해 명시적인 클래스가 존재한다는 의미이기도 합니다.배
isAlive() 메서드는 자바 Thread 클래스에서 해당 스레드가 현재 살아 있는(alive) 상태인지 확인하는 데 사용됩니다. 여기서 살아 있다는 것은 스레드가 start() 메서드를 통해 시작되었지만 아직 종료되지 않은 상태를 의미합니다. run() 메서드가 호출되면 스레드는 일정 시간 동안 작업을 수행한 뒤 실행을 멈추며, 이후에는 더 이상 alive 상태가 아닙니다.문법(Syntax)final Boolean isAlive()isAlive()는 호출 대상 스레드가 아직 종료되지 않고 실행 중이라면 true를 반환하고, 그렇
join() 메소드란?자바에서 join() 메소드는 현재 실행 중인 스레드가 다른 스레드의 작업이 끝날 때까지 기다리도록 만드는 기능을 합니다. 즉, join()이 호출된 대상 스레드가 종료될 때까지 호출한 스레드는 대기 상태에 머무르게 됩니다.예를 들어, 메인 스레드에서 특정 작업 스레드에 대해 join()을 호출하면, 해당 작업 스레드가 모든 작업을 마친 후에야 메인 스레드가 다음 코드를 실행할 수 있습니다. 여러 스레드 간의 실행 순서를 제어해야 할 때 매우 유용한 메소드입니다.문법final void join() throws
가비지 컬렉션과 객체 소멸자바에서 객체는 사용이 끝나면 가비지 컬렉터(Garbage Collector)에 의해 메모리에서 자동으로 해제됩니다. 가비지 컬렉터는 더 이상 해당 객체를 참조하는 참조 변수가 존재하지 않는다고 판단되면 객체를 소멸시키며, 이때 소멸 대상 객체의 finalize() 메서드를 호출합니다.고립 섬(Island of Isolation)이란?두 객체 a와 b가 서로를 참조하고 있지만, 외부의 다른 어떤 객체도 이들을 참조하지 않는 상태를 고립 섬이라고 합니다. 즉, 고립 섬은 서로를 참조하는 객체들의 그룹이면서,
Iterator(반복자)란?Iterator는 자바 컬렉션 프레임워크(Collection Framework)에서 저장된 요소들을 필요한 시점에 하나씩 순차적으로 꺼내어 접근할 수 있도록 지원하는 인터페이스입니다.public interface IteratorIterator는 next() 메서드를 통해 커서를 다음 요소로 이동시키며 각 요소에 접근하고, remove() 메서드를 사용해 현재 위치의 요소를 데이터 구조에서 안전하게 삭제할 수 있습니다.또한 Iterator는 내부적으로 처리해야 하는 연산의 수가 적기 때문에, 컬렉션 객체를
JAR(Java ARchive) 파일이란?JAR은 자바 클래스 파일과 관련된 메타데이터, 그리고 각종 리소스를 하나의 파일로 묶어주는 파일 형식입니다. 여러 개의 파일을 단일 아카이브로 패키징함으로써 배포와 관리가 훨씬 편리해지며, ZIP 기반 압축 방식을 사용해 파일 크기도 줄일 수 있습니다.JAR 파일 생성하기JAR 파일을 만들 때는 jar cf 명령어를 사용합니다. 여기서 cf는 create file(파일 생성)을 의미하며, 뒤에 생성할 JAR 파일 이름과 압축할 대상 파일들을 나열하면 됩니다.jar cf jar_file_na
자바에서 Comparator를 활용해 PriorityQueue(우선순위 큐)를 구현하는 방법을 예제 코드와 함께 알아보겠습니다. 아래 예제는 사용자 정의 클래스의 객체를 특정 기준(나이)에 따라 정렬하여 처리하는 과정을 보여줍니다. 예제 코드 import java.util.*; public class Demo{ public static void main(String[] args){ Scanner my_scan = new Scanner(System.in); PriorityQueue<Demo_c
yield() 함수란 무엇인가? 자바에서 yield() 함수는 현재 실행 중인 스레드가 프로세서를 자발적으로 양보하도록 힌트를 주는 역할을 합니다. 즉, 상대적으로 덜 중요하거나 오랜 시간 점유하고 있는 스레드보다 더 중요한 스레드가 먼저 실행될 수 있도록 유도하는 것입니다. 스레드가 java.lang.Thread.yield() 메소드를 호출하면, 이는 스레드 스케줄러에게 현재 스레드의 실행을 잠시 멈춰도 된다는 신호를 보내는 것입니다. 다만 스케줄러는 이 신호를 받아들일 수도 있고, 무시할 수도 있습니다. 스레드가 yield()
Thread.sleep() 메서드란? Thread.sleep() 메서드는 현재 실행 중인 스레드를 매개변수로 전달된 밀리초(1/1000초) 단위의 시간 동안 일시 정지시키는 역할을 합니다. 지정된 시간이 경과하면 스레드는 다시 실행 가능한(runnable) 상태로 전환되어 CPU 할당을 기다리게 됩니다. 이 메서드는 java.lang.Thread 클래스에 포함된 정적(static) 메서드로, 스레드 간 작업 간격을 조절하거나 특정 타이밍 제어가 필요할 때 자주 활용됩니다. 예제 코드 두 개의 스레드가 sleep() 메서드를 사용하
join() 메서드란?자바에서 join() 메서드는 한 스레드의 실행 시작을 다른 스레드의 실행 종료와 연결(join)하는 역할을 합니다. 즉, 어떤 스레드가 join()을 호출하면 대상 스레드의 작업이 끝나거나 지정된 시간이 경과할 때까지 현재 스레드는 대기 상태에 머무르게 됩니다. 이를 통해 스레드 간 실행 순서를 명확하게 보장할 수 있습니다.join()은 밀리초(millisecond) 단위로 대기 시간을 지정할 수 있습니다. 지정한 시간이 지나면 더 이상 대기하지 않고 다음 코드를 실행하며, 인자 없이 호출하면 해당 스레드가
ConcurrentHashMap의 clear() 메서드는 맵에 저장된 모든 키-값(key-value) 매핑을 제거하는 데 사용됩니다. 이 메서드를 호출하면 해당 ConcurrentHashMap의 모든 요소가 삭제되어 빈 맵이 됩니다.문법public void clear()이 메서드는 매개변수를 받지 않으며, 반환값도 없습니다(void). 실제 동작을 확인할 수 있는 예제를 살펴보겠습니다.예제import java.util.concurrent.ConcurrentHashMap; import java.util.*; public class D
자바에서 인터페이스(interface)의 메소드는 기본적으로 추상(abstract)입니다. 이는 인터페이스 안의 메소드가 메소드 시그니처(선언부)만 가지며, 실제 실행 코드인 본문(body)은 포함하지 않는다는 의미입니다. 따라서 인터페이스의 메소드가 실제로 어떻게 동작할지는 인터페이스를 구현하는 클래스에서 반드시 정의해야 합니다.다음 예제를 통해 자세히 살펴보겠습니다.예제interface Car{ public void carSpeed(); public void sleep(); } class Porsche implem
들어가며자바(Java) 면접에서는 기본 개념이 명확하지 않으면 예상치 못한 곳에서 막히기 쉽습니다. 따라서 자바 클래스, 메서드, 인터페이스, 상속 등 객체지향 프로그래밍(OOP)의 핵심 개념과 동작 원리를 철저히 이해해 두는 것이 중요합니다. 특히 생성자(Constructor)는 객체 생성의 출발점이 되는 요소로, 면접에서 단골로 다뤄지는 주제입니다.아래는 자바 생성자와 관련해 자주 등장하는 대표적인 면접 질문들을 정리한 목록입니다. 각 질문에 스스로 답해 보면서 개념을 점검해 보세요.생성자 기본 개념 질문상위 클래스(슈퍼 클래스
Java 8부터 도입된 람다 표현식(Lambda Expression)은 코드를 간결하게 작성할 수 있게 해주는 강력한 기능입니다. 특히 컬렉션(Collection)의 요소를 정렬할 때, 별도의 Comparator 클래스나 익명 내부 클래스를 구현하는 번거로움 없이 한 줄의 람다식만으로 원하는 정렬 기준을 지정할 수 있습니다.1. 람다 표현식으로 리스트(List) 요소 정렬하기Collections.sort() 메소드에 람다식을 전달하여 ArrayList의 요소를 내림차순으로 정렬하는 예제입니다.예제 코드import java.util.
Math.multiplyExact()는 자바에 내장된 메서드로, 인수로 전달된 두 값을 곱한 결과를 반환합니다. 일반적인 곱셈 연산자(*)와 달리, 연산 결과가 int 또는 long 타입의 표현 범위를 벗어나면 ArithmeticException을 발생시킨다는 점이 특징입니다. 이 메서드는 자바 8에서 도입되었으며, 오버플로우를 명확하게 감지해야 하는 상황에서 유용하게 활용됩니다. 예제 코드 import java.lang.Math; public class Demo{ public static void main(String ar
자바의 조건 연산자(삼항 연산자, ? :)는 하나의 불리언(boolean) 값을 기준으로 어떤 표현식을 평가할지 결정합니다. 그런데 흥미롭게도 이 조건식 안에서 두 피연산자의 타입이 서로 다를 경우, 자바는 내부적으로 숫자 승격(numeric promotion)을 수행합니다. 예제를 통해 살펴보겠습니다.예제 1: 조건 연산자에서 숫자 승격 발생import java.io.*; public class Demo{ public static void main (String[] args){ Object my_obj = t
칵테일 정렬(Cocktail Sort)은 버블 정렬(Bubble Sort)의 변형 알고리즘으로, 양방향 버블 정렬 또는 셰이커 정렬(Shaker Sort)이라고도 불립니다. 일반적인 버블 정렬이 요소를 한 방향(왼쪽에서 오른쪽)으로만 순회하며 가장 큰 값을 배열 끝으로 밀어내는 것과 달리, 칵테일 정렬은 양방향(왼쪽→오른쪽, 오른쪽→왼쪽)을 번갈아가며 순회한다는 점이 특징입니다.칵테일 정렬 자바 예제 코드다음은 자바로 작성한 칵테일 정렬 프로그램입니다.public class Demo{ static int temp; s