본문 바로가기

Java

(15)
커스텀 예외 처리 방법 개발을 하다보면 서비스 로직에서 많은 예외 처리를 해야할 때도 있고, 커스텀 예외를 사용하여서 분류별로 계층구조를 활용해 처리하는 등의 전략으로 예외를 책임분리시켜 개발하고 할 때도 있습니다. 하지만 커스텀 예외를 할 때 진짜 예외 상황을 구분할 줄 알고, 어느 순간에는 커스텀 예외를 하지말아야 하는지를 알게 되면 개발 환경에 있어서 복잡성이 눈에 띄게 낮게 될 것입니다. 우선 오류와 예외의 구분과 자주 쓰이는 예외를 통해 커스텀 예외 처리 방법을 접해서 설명을 해보겠습니다. 오류와 예외 오류와 예외는 발생 원인과 처리 방법에서 큰 차이가 있습니다. 오류는 외부 요인에 의해 발생하는 문제로, 예를 들어 OutOfMemoryError, StackOverflowError와 같은 것이 있습니다.  이는 개발자..
[동시성 문제] - HashMap / ConcurrentHashMap HashMap은 자바 컬렉션 프레임워크의 자료구조로 많이 사용이 됩니다. 하지만 코드를 작성함에 따라 동시성 문제에 따라 자연스럽게 ConcurrentHashMap를 사용해야 된다고 알게되는데, 해당 포스팅에서는 도대체 해당 Concurrent가 붙게 됨으로 무엇이 달라지고 어떠한 장점을 알아보려 합니다. 우선적으로 기본적인 개념을 알아야 하기에 HashMap을 간단하게 알아보자면 데이터를 키-값 쌍으로 저장하는 데 사용이 되는데 HashMap은 내부적으로 해시 테이블을 사용하여 데이터를 저장하며, 키를 이용해 값을 매우 빠르게 검색할 수 있는 특징을 지닙니다.  import java.util.HashMap;public class HashMapExample { public static void ma..
Java (람다와 함수 인터페이스) 람다란: 함수형 프로그래밍을 지원하는 개념 중 하나로 이를 사용하면 메서드를 하나의 식으로 표현할 수 있으며, 코드를 간결하게 만들어주고 불필요한 코드를 제거할 수 있습니다. 람다 표현식의 기본 형식 (매개변수) -> { 실행 코드 블록 } 매개변수는 메서드의 매개변수와 유사하게 작성하고, 실행 코드 블록 내부에는 메서드의 내용을 작성합니다. 이때 중괄호 {}는 코드 블록을 나타내며, 람다식의 실행 코드가 포함됩니다. // 기존의 방식 (익명 내부 클래스 사용) Runnable runnable1 = new Runnable() { @Override public void run() { System.out.println("Hello, World!"); } }; // 람다 표현식 사용 Runnable runna..
Java (익명 클래스) 익명 클래스: 클래스를 명시적으로 정의하지 않고, 필요한 클래스를 인터페이스나 추상 클래스를 구현하거나 확장하여 생성하는 방법으로 일회성으로 사용되는 클래스를 간단하게 작성할 때 유용하다. 먼저 추상 클래스를 사용하여 익명 클래스를 생성하고, cook() 메소드를 구현하는 예제를 보자. abstract class HomeMadeBurger { public abstract void cook(); } public class AnonymousClassExample { public static void main(String[] args) { // 엄마가 만든 버거 객체를 가져와서 cook 메소드 호출 HomeMadeBurger momMadeBurger = getMomMadeBurger(); momMadeBurg..
Java (컬렉션 프레임워크) 컬렉션 프레임워크란 int [ ] array = new int [3]; 와 같이 배열의 크기를 정해두고, 각 인덱스 값에 모두 값을 넣게 된다면, 또 값을 넣기 위해서는 새로운 배열을 생성하였어야 한다. 하지만 컬렉션 프레임워크는 배열과는 다르게 원하는 만큼 데이터를 넣거나 삭제하는 것이 가능하며 컬렉션 내에 데이터가 있는지 탐색을 한다거나 정렬을 하는 등, 다양하게 이용이 된다. 컬렉션 프레임워크는 대표적으로 List, Set, Map이 있다. List는 순서가 있는 데이터 집합으로 중복된 요소를 허용한다. Set은 순서가 없는 데이터 집합으로 중복된 요소를 허용하지 않는다. Map은 키와 값으로 데이터를 저장하며 데이터의 순서를 보장하지 않으며, Key는 중복을 허용하지 않는다. ArrayList, ..
Java (제네릭스) 제네릭스 : 컴파일 단계에서 자료형을 체크해주는 도구 제네릭스라는 개념은 처음 들을 때, 많이 낯설고 어렵게만 들리는 개념이기도 하며, 위의 말처럼 듣기만 했을 때는 잘 이해가 가질 않게 된다. 지금부터 천천히 알아보자. int [] iArray = {1, 2, 3, 4, 5}; double[] dArray = {1.0, 2.0, 3.0, 4.0, 5.0}; String[] sArray = {"A", "B", "C", "D", "E"}; 3개의 배열을 임의로 생성하였고 각 자료형 타입이 다 다르다. 만약 위 배열들을 출력하고 싶을 때는 다음의 코드를 한다. private static void printStringArray(String[] sArray) { for (String s : sArray) { S..
Java (추상 클래스와 인터페이스, 의존성 주입) 추상 클래스 추상 클래스는 완전하지 않은 '추상 메서드'를 포함할 수 있는 클래스입니다. 추상 메서드는 메서드의 선언만 있고 구현부는 없는 메서드로, 추상 클래스를 상속받는 자식 클래스가 반드시 구현해야 하는 메서드입니다. 추상 메소드는 추상 클래스 또는 인터페이스에서 사용 가능한, 껍데기만 있는 메소드라고 생각하면 됩니다. public abstract class Camera { public abstract void showMainFeature(); } 위 예시에서 Camera 추상 클래스는 showMainFeature라는 추상 메서드를 갖고 있습니다. 이 메서드는 추상 클래스인 Camera 클래스를 상속받는 자식 클래스가 상속 받을 시, 자식 클래스에서 완성을 해야만 합니다. 추상 클래스의 또 다른 특..
Java (클래스) 클래스의 설명에 앞서 객체지향 프로그래밍의 개념을 알아보는 것이 클래스를 더불어 자바를 이해하는 데 도움이 될 것이기에 객체지향 프로그래밍을 설명하겠습니다. 이 이미지는 객체 지향 프로그래밍(OOP)의 개념을 설명하는 것으로 객체 지향 프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나로, 프로그램을 객체라는 기본 단위로 구성하고, 이 객체들이 서로 상호작용하는 방식으로 프로그램의 동작을 설계하는 방법입니다. '자동차' 객체는 '운전자'가 사용할 수 있는 여러 자동차 타입(예: K3, 아반떼, 테슬라 모델3)으로 이루어져 있으며, 각 자동차 타입은 '자동차'라는 일반적인 개념을 상속받아 특정 속성과 기능을 가지고 있는 것으로 표현되어 있습니다. 객체 지향 프로그래밍에서는 이러한 객체들이 각각의 속성(데이터..