큐(Queue)는 데이터를 실제로 처리하기 전에 일시적으로 보관해 두기 위한 자료구조입니다. 큐는 FIFO(First-In-First-Out, 선입선출) 방식으로 동작하며, 가장 먼저 삽입된 요소가 가장 먼저 꺼내집니다. Java의 Queue 인터페이스는 큐의 맨 앞(head)에 있는 요소를 다루는 peek(), poll(), remove() 세 가지 메소드를 제공합니다. 이들은 이름이 비슷하지만 요소를 제거하는지 여부와 큐가 비어 있을 때의 동작에서 중요한 차이가 있으므로, 상황에 맞게 올바르게 선택해야 합니다. peek() 메소
Java ArrayList에서 중복 요소 제거하기 자바의 Set 인터페이스는 중복 요소를 허용하지 않습니다. 이 인터페이스의 add() 메서드는 전달받은 요소를 Set 객체에 추가하며, 추가가 성공하면 true를 반환합니다. 반면 이미 존재하는 요소를 추가하려고 하면 작업이 실패하고 false를 반환합니다. 이러한 Set의 특성을 활용하면 ArrayList 객체의 중복 요소를 손쉽게 제거할 수 있습니다. 중복 제거 절차 필요한 ArrayList를 생성하거나 기존 객체를 가져옵니다. 빈 Set 객체를 생성합니다. ArrayList
자바(Java)는 컬렉션 객체에 저장된 요소들을 순회하며 가져올 수 있도록 Iterator와 ListIterator 클래스를 제공합니다. 이 두 인터페이스가 제공하는 핵심 메서드 중 하나가 바로 hasNext()와 next()인데, 많은 초보 개발자들이 이 둘의 역할을 혼동하곤 합니다. 지금부터 각 메서드의 차이점을 예제와 함께 자세히 살펴보겠습니다. hasNext() 메서드란? hasNext()는 커서가 가리키는 위치 다음에 요소가 더 존재하는지 여부를 확인하는 메서드입니다. 다음 요소가 존재하면 true를, 더 이상 요소가 없으
Java의 ArrayList 클래스는 List 인터페이스를 구현한 크기 조절 가능한 배열(resizable-array) 기반 자료구조입니다. null 값을 허용하며, 요소를 동적으로 추가하고 삭제할 수 있어 실무에서 가장 널리 사용되는 컬렉션 중 하나입니다. ArrayList에는 리스트의 요소를 제거하는 두 가지 대표적인 메서드가 있습니다. 바로 clear()와 removeAll()입니다. 두 메서드 모두 요소를 삭제한다는 공통점이 있지만, 동작 방식과 용도는 명확히 다릅니다. clear() 메서드란? clear() 메서드는 현
contains() 메서드란?Java의 String 클래스가 제공하는 contains() 메서드는 문자열을 매개변수로 받아, 현재 String 객체 안에 해당 문자열이 포함되어 있는지 확인합니다. 문자열이 포함되어 있으면 true, 그렇지 않으면 false를 반환합니다.이 메서드를 활용하면 ArrayList에 저장된 여러 문자열 중에서 원하는 키워드를 손쉽게 찾을 수 있습니다.ArrayList에서 문자열 검색하는 절차검색 대상이 되는 ArrayList 객체를 준비합니다.for-each 루프를 사용하여 ArrayList의 각 요소를
Java에서 ArrayList 클래스의 add() 메서드를 사용하면 리스트에 새로운 요소를 손쉽게 추가할 수 있습니다. 이 메서드는 용도에 따라 두 가지 형태로 오버로딩되어 제공됩니다.add(E e) − 객체(요소)를 매개변수로 받아 리스트의 맨 끝에 추가합니다.public void add(int index, E element) − 추가할 요소와 함께 삽입할 위치를 나타내는 정수 값(인덱스)을 받아, 리스트의 지정된 위치에 요소를 삽입합니다. 이때 해당 위치에 이미 존재하던 요소와 그 이후의 요소들은 자동으로
HashMap은 Map 인터페이스를 구현한 대표적인 컬렉션 클래스로, 내부적으로 해시 테이블(Hash Table) 구조를 기반으로 동작합니다. HashMap은 null 키 하나와 여러 개의 null 값을 허용한다는 특징이 있습니다. HashMap에는 키(Key)와 값(Value)으로 이루어진 데이터 쌍을 저장할 수 있으며, 저장된 키를 통해 해당 값을 빠르게 조회할 수 있습니다. 다만 키는 반드시 고유(unique)해야 하며, 같은 키가 두 번 존재할 수 없습니다. 중복 키를 추가하면 어떻게 되나? put() 메서드는 지정된 키에
컬렉션(Collection) 객체를 다룰 때 한 스레드가 특정 컬렉션을 순회(iteration)하는 도중에 해당 컬렉션에 요소를 추가하거나 삭제하면 ConcurrentModificationException이 발생합니다.뿐만 아니라, 컬렉션을 순회하는 도중에 요소를 추가·삭제한 뒤 기존 Iterator 객체로 다시 내용을 읽으려고 시도하면, 여러 스레드가 동시에 컬렉션에 접근하려는 것으로 간주되어 역시 같은 예외가 발생합니다. 이는 Java 컬렉션이 fail-fast(즉시 실패) 방식으로 동작하기 때문인데, 내부적으로 구조 변경 횟수
배열(Array)이란? 배열은 동일한 타입의 요소들을 고정된 크기로 순차적으로 저장하는 데이터 구조(컨테이너/객체)입니다. 배열의 크기(길이)는 생성 시점에 결정되며, 이후에는 변경할 수 없습니다. 인덱스(Index)의 개념 배열 내에서 요소의 위치를 인덱스(index) 또는 첨자(subscript)라고 부릅니다. 자바에서 배열의 첫 번째 요소는 인덱스 0에 저장되고, 두 번째 요소는 인덱스 1에 저장되는 식으로 순차적으로 배치됩니다. 배열 요소에 접근하는 방법 배열의 각 요소는 배열 이름 뒤에 대괄호([]) 안에 원하는 요소
Java에서 문자열(String)은 일련의 문자들을 저장하는 데 사용되며, 객체로 취급됩니다. java.lang 패키지의 String 클래스가 문자열을 대표하며, new 키워드를 사용해 다른 객체처럼 생성하거나, 기본 자료형처럼 리터럴에 값을 할당하는 방식으로 만들 수 있습니다.String stringObject = new String(Hello how are you); String stringLiteral = Welcome to Tutorialspoint;문자열은 내부적으로 문자 배열을 저장하기 때문에, 배열과 마찬가지로 각 문자
예외 재던지기(Rethrow)란 무엇인가?Java에서 catch 블록으로 예외를 잡은 후, throw 키워드를 사용해 해당 예외를 다시 던질 수 있습니다. 이를 예외 재던지기(rethrow)라고 하며, 예외를 호출자에게 전달하거나 더 상위 수준의 추상화된 예외로 변환해야 할 때 유용하게 활용됩니다.재던지기에는 크게 두 가지 방식이 있습니다.1. 잡은 예외를 그대로 다시 던지기가장 단순한 방법은 catch 블록에서 잡은 예외 객체를 수정 없이 그대로 throw하는 것입니다.try { int result = (arr[a])/(a
Java에서는 개발자가 직접 예외 클래스를 정의할 수 있으며, 이렇게 만든 예외를 사용자 정의 예외(User-defined Exception) 또는 커스텀 예외(Custom Exception)라고 부릅니다.사용자 정의 예외를 생성하려면 예외 관련 클래스 중 하나를 상속(extends)해야 합니다. 예외 발생 시 원하는 메시지를 표시하고 싶다면 toString() 메서드를 오버라이드하거나, 슈퍼클래스의 매개변수가 있는 생성자에 String 형태의 메시지를 전달하는 방식을 사용할 수 있습니다.MyException(String msg){
JSON(JavaScript Object Notation)은 가장 널리 사용되는 데이터 교환 형식 중 하나로, 가볍고(lightweight) 특정 프로그래밍 언어에 종속되지 않는 언어 독립적(language independent)이라는 장점이 있습니다. Java에서는 org.json.Cookie 클래스가 제공하는 메서드를 활용하여 JSONObject를 쿠키(cookie) 문자열로 변환하거나, 반대로 쿠키를 JSONObject로 변환할 수 있습니다. 변환에는 다음 두 가지 핵심 메서드가 사용됩니다. toString(): JSON
JSONObject란 무엇인가?JSONObject는 이름(name)과 값(value) 쌍으로 이루어진 순서 없는 컬렉션으로, 문자열(String)의 텍스트를 파싱하여 map과 유사한 객체를 생성하는 클래스입니다.JSONObject 클래스에서 제공하는 increment() 메서드를 사용하면 특정 속성의 값을 간편하게 자동 증가(auto-increment)시킬 수 있습니다. 동작 방식은 다음과 같습니다.해당 키(key)로 된 속성이 존재하지 않으면, 값이 1인 새로운 속성을 생성합니다.속성이 이미 존재하고, 그 값의 타입이 Intege
유리수란 무엇인가?유리수(Rational Number)란 p/q 형태로 표현할 수 있는 수를 말합니다. 이때 p와 q는 모두 정수여야 하며, 분모 q는 0이 아니어야 한다는 조건이 있습니다.양의 유리수는 최종 값이 양수가 되는 유리수를 의미합니다. 이를 위해서는 분자 p와 분모 q가 둘 다 양수이거나, 둘 다 음수여야 합니다.이 문제에서는 주어진 수 n까지의 양의 유리수를 생성해야 합니다. 즉, 1부터 n 사이에 존재하는 유한 개수의 양의 유리수를 찾아야 하며, 이를 위해 1 ≤ p ≤ n, 1 ≤ q ≤ n을 만족하는 모든 조합을
Jackson 라이브러리의 @JsonProperty 어노테이션은 JSON 데이터의 속성 이름(property name)을 지정하는 데 사용됩니다. 이 어노테이션은 생성자(constructor) 또는 팩토리 메서드(factory method)의 매개변수에 적용할 수 있으며, @JsonCreator 어노테이션과 함께 사용하면 JSON 문자열을 원하는 방식으로 역직렬화(deserialization)할 수 있습니다.@JsonCreator는 @JsonSetter를 사용할 수 없는 상황에서 특히 유용합니다. 대표적인 예가 불변(immutabl
Java 개발을 하다 보면 객체의 특정 필드를 JSON 직렬화나 역직렬화 과정에서 제외해야 하는 경우가 자주 발생합니다. 이럴 때 Jackson 라이브러리가 제공하는 @JsonIgnore 어노테이션을 사용하면 간단하게 해결할 수 있습니다.@JsonIgnore는 Java 객체의 특정 프로퍼티(property) 또는 필드(field)를 무시하도록 지정하는 어노테이션입니다. 이 어노테이션이 적용된 필드는 두 방향 모두에서 제외됩니다. 즉, JSON을 Java 객체로 읽어올 때(역직렬화)와 Java 객체를 JSON으로 변환할 때(직렬화)
Flexjson은 Java 객체를 JSON 형식으로 직렬화(Serialize)하거나 역직렬화(Deserialize)할 수 있도록 지원하는 경량 라이브러리입니다. 이 라이브러리에서 직렬화 작업의 핵심 역할을 하는 클래스가 바로 JSONSerializer입니다.Flexjson에서는 WriterOutputHandler 클래스를 사용하여 JSON 문자열을 출력 핸들러(Output Handler)로 직렬화할 수 있습니다. WriterOutputHandler는 OutputHandler 인터페이스를 구현한 클래스로, 직렬화된 JSON 데이터를
Jackson 라이브러리의 @JsonIgnoreProperties 어노테이션은 클래스의 여러 속성(property) 또는 필드(field)를 목록으로 지정하여 한꺼번에 무시할 수 있게 해주는 기능입니다. 각 필드 위에 일일이 어노테이션을 붙이는 대신, 클래스 선언부 바로 위에 이 어노테이션을 배치하면 해당 클래스 전체에 일괄 적용됩니다.이 어노테이션은 직렬화(Serialization) 시에는 지정된 속성을 JSON 출력에서 제외하고, 역직렬화(Deserialization) 시에는 JSON에 포함된 해당 속성 값을 무시하므로 민감한
Java에서 JSON 직렬화를 다룰 때, Java 객체의 필드 이름과 실제 JSON 키 이름이 일치하지 않아야 하는 경우가 자주 발생합니다. 예를 들어 Java에서는 카멜 케이스(camelCase)를 사용하지만, 외부 API에서는 스네이크 케이스(snake_case)를 요구하는 경우가 대표적입니다.이럴 때 Gson 라이브러리가 제공하는 @SerializedName 어노테이션을 사용하면 됩니다. 이 어노테이션을 필드에 지정하면, 직렬화 시 해당 값이 JSON의 필드 이름으로 사용됩니다.@SerializedName 어노테이션의 특징@S