
고수준 모듈(High-level Module)은 저수준 모듈(Low-level Module)에 의존해서는 안 된다. 둘 다 추상화(인터페이스 또는 추상 클래스)에 의존해야 한다. DIP를 위반한 코드 (Bad Code)class EmailNotification { void sendEmail(String message) { System.out.println("이메일 전송: " + message); }}class NotificationService { private EmailNotification emailNotification = new EmailNotification(); void notifyUser(String message) { emailNotificat..
Bounded Wildcard (? extends T, ? super T)제네릭의 타입 파라미터를 특정 범위로 제한하는 기능와일드카드(?)를 사용하면 다양한 타입을 허용할 수 있지만, 어떤 타입까지 허용할지를 제어하기 위해 extends 또는 super를 사용? extends T (상한 제한, Upper Bounded Wildcard)import java.util.List;import java.util.ArrayList;class Animal { void sound() { System.out.println("동물이 소리를 냅니다."); }}class Dog extends Animal { void sound() { System.out.println("멍멍!"); ..
Java에서 데이터 타입을 일반화하여 다양한 타입을 하나의 코드로 처리할 수 있도록 해주는 기능컴파일 시 타입을 체크하면서도, 다양한 데이터 타입을 유연하게 사용할 수 있도록도와줍니다.제네릭 사용 방법import java.util.ArrayList;public class WithGeneric { public static void main(String[] args) { ArrayList list = new ArrayList(); // 타입 지정 list.add("Hello"); // list.add(123); // 컴파일 오류 발생 (잘못된 타입) String str = list.get(0); // 형 변환 필요 없음 System.out...
try-with-resourcesJava 7에서 도입된 기능으로, AutoCloseable 인터페이스를 구현한 리소스를 사용한 후 자동으로 닫아주는 기능을 제공합니다. 주로 파일, 소켓, 데이터베이스 연결 등과 같은 외부 리소스를 사용할 때 유용합니다.import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class MultiResourceExample { public static void main(String[] args) { try ( BufferedReader br = new BufferedReader(new F..
@JsonPropertyJSON 데이터의 필드 이름과 Java 객체의 필드 이름이 다를 때 매핑을 도와줍니다.주로 직렬화(Serialization, Java 객체 → JSON) 및 역직렬화(Deserialization, JSON → Java 객체) 시 사용됩니다.import com.fasterxml.jackson.annotation.JsonProperty;public class User { @JsonProperty("user_name") // JSON에서 "user_name"을 Java 객체에서 name 필드에 매핑 private String name; @JsonProperty("user_age") // JSON에서 "user_age"를 Java 객체에서 age 필드에 매핑 ..
Java 14에서 처음 도입되었으며, 간결하고 불변(immutable)한 데이터 객체를 정의하는 데 사용됩니다.데이터 클래스를 작성할 때 반복적으로 작성해야 하는 보일러플레이트 코드를 줄이기 위해 설계되었습니다. 1. 간단한 선언record 키워드를 사용하여 클래스를 선언하며, 기본적으로 불변 객체를 생성합니다.예를 들어, 아래의 record는 equals(), hashCode(), toString(), 그리고 불변 필드에 대한 getter 메서드를 자동으로 생성합니다.public record Point(int x, int y) {} 2. 자동 생성된 메서드Constructor: 모든 필드를 초기화하는 생성자가 자동으로 생성됩니다.Getter 메서드: 각 필드에 대해 자동으로 getter 메서드가 생성되..
유틸리티 클래스(Static 메서드만 포함하는 클래스)를 작성할 때 유용하게 사용할 수 있는 애노테이션1. Private 생성자 자동 생성@UtilityClass를 붙이면 Lombok이 자동으로 private 생성자를 생성합니다.이를 통해 해당 클래스의 인스턴스화가 불가능해집니다.@UtilityClasspublic class MathUtils { public int add(int a, int b) { return a + b; }}2. 모든 멤버가 자동으로 static 처리클래스 내부의 모든 필드와 메서드가 자동으로 static으로 변환됩니다.개발자가 static 키워드를 명시하지 않아도 됩니다.@UtilityClasspublic class StringUtils { public..
@Parameterized JUnit의 @ParameterizedTest 어노테이션은 동일한 테스트를 다양한 매개변수로 여러 번 실행할 수 있게 해줍니다. 이를 통해 같은 테스트 케이스에 대해 다양한 입력 값을 테스트할 수 있어 테스트의 포괄성과 효율성을 높일 수 있습니다.https://www.baeldung.com/parameterized-tests-junit-5 public class ParameterizedTestExample { @ParameterizedTest @ValueSource(strings = {"racecar", "radar", "able was I ere I saw elba"}) void testPalindrome(String candidate) { ..
2진수 문자열 -> int 변환입력 문자열이 2진수 형식이어야 하며, 0과 1 이외의 값이 포함된 문자열을 입력하면 NumberFormatException이 발생public class Main { public static void main(String[] args) { String binaryString = "1101"; // 2진수 문자열 // 2진수 문자열을 int로 변환 int decimalValue = Integer.parseInt(binaryString, 2); System.out.println(decimalValue); // 출력: 13 }}int -> 2진수 문자열 변환public class Main..