참조되지 않는 객체를 제거하는 과정을 가비지 컬렉션(Garbage Collection, GC)이라고 합니다. 객체가 더 이상 참조되지 않으면 사용되지 않는 객체로 간주되며, JVM이 자동으로 해당 객체를 소멸시킵니다.그렇다면 객체를 GC 대상으로 만드는 방법에는 어떤 것들이 있을까요? 대표적인 두 가지 방법을 살펴보겠습니다.1. 참조 변수에 null 할당하기객체 생성의 목적이 달성되었다면, 해당 객체를 참조하는 모든 참조 변수에 null을 할당할 수 있습니다. 참조가 끊어진 객체는 더 이상 접근할 수 없으므로 GC의 수거 대상이 됩
스택(Stack)은 Vector 클래스의 하위 클래스로, 객체들을 후입선출(LIFO, Last-In-First-Out) 방식으로 저장하는 자료구조입니다. 즉, 스택의 맨 위에 가장 마지막에 추가된 요소(In)가 가장 먼저 제거(Out)되는 구조입니다. 반면 큐(Queue)는 Collection 인터페이스를 확장한 인터페이스로, 선입선출(FIFO, First-In-First-Out) 방식으로 삽입(insert)과 제거(remove) 연산을 지원합니다. 두 자료구조의 동작 방식은 서로 반대이지만, 큐를 적절히 활용하면 스택을 구현할 수
parseBoolean() 메서드는 Java의 Boolean 클래스에서 중요한 역할을 하는 메서드입니다. 이 메서드는 정적(static) 메서드로, String 타입의 인수를 Boolean 값으로 변환(파싱)할 수 있습니다. Boolean 클래스의 parseBoolean() 메서드는 문자열 인수가 나타내는 boolean 값을 반환합니다.문법(Syntax)public static boolean parseBoolean(String s)동작 방식parseBoolean() 메서드는 다음과 같은 규칙으로 동작합니다:문자열이 true와 일치하
자바에서 문자열을 조작할 때 StringBuilder와 StringBuffer 중 어떤 것을 선택해야 할지 고민되는 경우가 많습니다. 두 클래스는 기능적으로 거의 동일하지만, 결정적인 차이가 하나 있습니다. 바로 스레드 안전성(Thread Safety)입니다.StringBuffer와 StringBuilder의 핵심 차이StringBuffer 객체는 여러 스레드가 동시에 같은 객체에 접근할 수 있는 멀티스레드 환경에서도 안전하게 사용할 수 있도록 설계되었습니다. 내부 메서드들이 synchronized로 선언되어 있어 한 번에 하나의
Java에서 문자 배열을 입력 스트림처럼 다루고 싶다면 CharArrayReader 클래스를 사용하면 됩니다. CharArrayReader는 Reader 클래스의 하위 클래스로, 문자 배열을 문자 입력 스트림(character input stream)처럼 활용할 수 있게 해주는 어댑터 역할을 합니다.이 클래스는 문자 배열의 내용을 처음부터 끝까지 전체로 읽거나, 특정 오프셋(offset)부터 일부만 읽는 것도 가능합니다. 따라서 메모리에 있는 문자 데이터를 파일이나 네트워크 스트림과 동일한 방식으로 처리해야 할 때 매우 유용합니다.
큐(Queue)는 Collection 인터페이스를 확장하는 클래스로, 선입선출(FIFO, First-In-First-Out) 방식으로 삽입과 삭제 연산을 지원합니다. 반면 스택(Stack)은 Vector 클래스의 하위 클래스로, 후입선출(LIFO, Last-In-First-Out) 구조의 객체 집합을 나타냅니다. 즉, 스택의 맨 위에 가장 마지막에 추가된 요소가 가장 먼저 제거되는 구조입니다.이처럼 서로 다른 두 자료구조지만, 스택 두 개를 활용하면 큐의 동작 방식을 그대로 구현할 수 있습니다. 아래 예제에서는 두 개의 스택을 사용
자바의 열거형(Enum)은 타입 세이프(type-safe)하다는 특징을 가지고 있습니다. 이는 열거형이 자체적인 네임스페이스(namespace)를 갖기 때문에, 열거형 상수로 미리 정의된 값 이외의 다른 값을 할당할 수 없다는 의미입니다.타입 세이프 열거형은 Java 1.5 버전부터 공식적으로 도입되었습니다. 또한 열거형은 참조 타입(reference type)에 해당하기 때문에 클래스나 인터페이스와 유사하게 동작하며, 개발자가 열거형 선언 내부에 메서드와 변수를 직접 정의하는 것도 가능합니다.예제 1: 기본적인 열거형 사용법아래
결론: import 문 뒤에는 패키지를 선언할 수 없습니다아니요, 자바(Java)에서는 import 문 뒤에 패키지를 정의할 수 없습니다. import 문 다음에 패키지 선언문을 작성하면 컴파일러가 컴파일 오류를 발생시킵니다.패키지(package)란 서로 관련된 클래스, 인터페이스, 그리고 하위 패키지들을 하나의 그룹으로 묶어 놓은 것을 의미합니다. 패키지를 사용하면 클래스 이름의 충돌을 방지하고 코드를 체계적으로 관리할 수 있습니다.특정 패키지 안에 클래스를 생성하려면 반드시 프로그램의 가장 첫 번째 문장에서 패키지 이름을 선언해
데몬 스레드(daemon thread)는 자바에서 낮은 우선순위로 백그라운드에서 실행되는 스레드입니다. 주로 JVM이 가비지 컬렉션(Garbage Collection, GC)과 같은 백그라운드 작업을 수행하기 위해 생성합니다. 사용자 스레드(user thread)가 하나도 남아 있지 않다면, 데몬 스레드가 아직 실행 중이더라도 JVM은 프로그램을 종료할 수 있습니다. 즉, 데몬 스레드의 유일한 존재 목적은 사용자 스레드를 보조하는 것입니다.isDaemon() 메소드를 사용하면 현재 스레드가 데몬 스레드인지 아닌지 손쉽게 확인할 수
Character 클래스는 Object 클래스의 하위 클래스로, 기본 타입(primitive)인 char 값을 하나의 객체로 감싸는 래퍼(Wrapper) 클래스입니다. Character 타입의 객체는 char 타입의 단일 필드(single field)를 포함하고 있습니다. 문자열에서 주어진 문자가 숫자인지 확인하려면 Character 클래스의 isDigit() 메서드를 사용하면 됩니다. isDigit() 메서드는 정적(static) 메서드로, 지정된 문자가 숫자(digit)인지 여부를 판별하여 true 또는 false를 반환합니다
Java에서 String은 final 클래스이며 불변(immutable) 객체입니다. 즉, 객체 자체는 변경할 수 없고 객체에 대한 참조만 변경할 수 있습니다. 주어진 문자열에서 HTML 태그를 제거하려면 String 클래스의 replaceAll() 메서드를 활용할 수 있습니다.HTML 태그를 제거하는 핵심은 정규 표현식(Regular Expression)을 사용하는 것입니다. 정규 표현식으로 사이의 모든 내용을 매칭한 뒤 빈 문자열로 치환하면, 순수한 일반 텍스트만 남게 됩니다.replaceAll() 메서드 문법public St
스레드(Thread)는 프로그램의 다른 부분과 동시에 실행될 수 있는 기능 단위입니다. 모든 자바 프로그램에는 최소 한 개의 스레드가 존재하며, 이를 메인 스레드(main thread)라고 합니다. 메인 스레드는 JVM(Java Virtual Machine)이 프로그램 시작 시점에 main() 메서드를 호출할 때 함께 생성됩니다. 자바에서는 일반적으로 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현하는 방식으로 스레드를 생성합니다. 그런데 별도의 클래스를 정의하지 않고 익명 클래스(anonymous class)를
배열(Array)은 동일한 타입의 값들을 연속된 메모리 공간에 고정된 개수만큼 저장하는 객체입니다. Java에서 배열을 다룰 때 자주 사용되는 deepToString()과 asList() 메서드는 모두 java.util.Arrays 클래스의 static 메서드입니다. 두 메서드는 각각 다음과 같은 특징을 가집니다. deepToString(): 다차원 배열을 문자열로 변환합니다. 배열의 요소가 또 다른 배열인 경우 이를 재귀적으로 탐색하여 문자열 형태로 변환해 줍니다. asList(): 배열을 리스트(List)로 변환하지만, 고정
GregorianCalendar는 Calendar 클래스의 구체적인(concrete) 하위 클래스로, 전 세계 대부분의 국가에서 사용하는 표준 달력 시스템을 제공합니다. Java에서 GregorianCalendar는 그레고리력(Gregorian calendar)과 율리우스력(Julian calendar)을 모두 처리할 수 있습니다. 특정 연도의 특정 월이 며칠까지 있는지 확인하려면 GregorianCalendar 클래스의 getActualMaximum() 메서드를 사용하면 됩니다. 이 메서드는 지정한 달력 필드가 실제로 가질 수 있
Java에서 printf() 메서드를 사용하면 java.io.PrintStream 또는 java.io.PrintWriter에 서식이 지정된(formatting) 출력을 손쉽게 작성할 수 있습니다. 특히 이 두 클래스에는 동일한 기능을 수행하는 format() 메서드도 함께 제공되므로, 여기서 소개하는 printf()의 사용법은 그대로 format() 메서드에도 적용할 수 있습니다. 기본 문법 System.out.printf(형식 문자열 [, 인수1, 인수2, ... ]); 형식 문자열 안에는 %로 시작하는 형식 지정자(format
Character 클래스는 Object 클래스의 하위 클래스로, 기본 타입인 char 값을 하나의 객체로 감싸는 래퍼(wrapper) 클래스입니다. Character 타입의 객체는 char 타입의 단일 필드를 포함하고 있습니다. 특정 문자가 속한 유니코드 일반 범주(General Category)는 getType() 메서드를 사용하여 확인할 수 있습니다. 이 메서드는 Character 클래스의 정적(static) 메서드로, 매개변수로 전달된 문자 ch가 속한 유니코드 일반 범주를 나타내는 int 값을 반환합니다. 구문 public
ByteArrayInputStream은 InputStream 클래스의 하위 클래스로, 스트림을 통해 읽어 들일 수 있는 바이트 데이터를 내부 버퍼에 저장합니다. Java에서는 이 클래스를 활용해 String을 InputStream 객체로 간단하게 변환할 수 있습니다. 변환 방법은 매우 직관적입니다. 먼저 String 클래스의 getBytes() 메서드를 호출하여 문자열을 바이트 배열로 변환한 후, 해당 배열을 ByteArrayInputStream의 생성자에 전달하면 됩니다. 이때 문자 인코딩(예: UTF-8)을 함께 지정하면 실행
Java의 입출력(I/O) API를 다룰 때 OutputStream과 Writer는 서로 다른 목적을 가진 클래스입니다. OutputStream은 바이트(byte) 기반 스트림인 반면, Writer는 문자(character) 기반 스트림입니다.이 두 클래스를 연결하려면 OutputStreamWriter 클래스를 사용하면 됩니다. ByteArrayOutputStream 객체를 OutputStreamWriter 생성자의 인자로 전달하는 방식으로 변환이 가능합니다.OutputStreamWriter란?OutputStreamWriter는 문
비트 단위 XOR(배타적 논리합, Exclusive OR)은 자바에서 ^ 기호로 표현되는 연산자입니다. 두 피연산자의 비트가 서로 다를 때는 1을, 두 비트가 같을 때는 0을 반환합니다. XOR는 두 개의 피연산자를 취하는 이항 연산자이며, 표현식을 왼쪽에서 오른쪽으로 평가합니다. 한 가지 유의할 점은 ^ 연산자는 String 타입의 피연산자에는 정의되어 있지 않아 직접 사용할 수 없다는 것입니다. XOR 연산 규칙(진리표) false XOR false → false false XOR true → true true XOR fals
네, Java에서는 메소드 내에 return 문이 있더라도 finally 블록은 반드시 실행됩니다. finally 블록은 try-catch 구문에서 예외가 발생하든 발생하지 않든 항상 실행됩니다. 심지어 try 블록이나 catch 블록에서 return 문을 만나 메소드가 종료되려는 시점에도, 실제로 값을 반환하기 전에 finally 블록이 먼저 실행됩니다. 다만 finally 블록이 실행되지 않는 몇 가지 예외적인 상황이 존재합니다. finally 블록 안에서 명시적으로 System.exit() 메소드를 호출하는 경우 JVM