Java16 [Java] OCP - 개방 폐쇄 원칙을 잘지키는 코드 객체 지향의 5대 원칙(SOLID)에는 다음과 같이 있습니다. SRP(단일 책임의 원칙: Single Responsibilty Principle) - 하나의 클래스는 하나의 책임을 가져야 한다. OCP(개방 폐쇄 원칙: Open-Closed Principle) - 확장에 대해 열려있고 수정에 대해서는 닫혀 있어야 한다. LSP(리스코프 치환의 원칙: Liskov Substitution Principle) - 하위 타입은 상위 타입을 대체할 수 있어야 한다. ISP(인터페이스 분리 원칙: Interface segregation principle) - 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다. DIP(의존 역전의 원칙: Dependency Inversion Principle) - .. Java 2023. 12. 13. Thread (4) - 락킹 기법과 데드락 DeadLock 교착상태라고 불리며 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리는 상태를 말합니다. 예제 코드로 살펴보겠습니다. public void Thread1() { lock(A) lock(B) task unlock(B) unlock(A) } public void Thread2() { lock(B) lock(A) task unlock(A) unlock(B) } 스레드 1이 lock(A)를 겁니다. 스레드 2이 lock(B)를 겁니다. 스레드 1이 B에 접근하려고 하자 락이 걸려있어 대기를 합니다. 스레드 2이 A에 접근하려고 하지만 락이 걸려있어 대기를 합니다. 위와 같이 스레드1과 스레드2가 서로 대기 상태에 빠지는것을 데드락, 교착상태라고합니다. 데드락이 일어나는 이유 상호배제 .. Java/Thread 2023. 11. 9. Thread (3) - 스레드 간 데이터 공유의 문제점 및 해결 방법 멀티 스레드 환경의 애플리케이션에서 스레드 간 데이터 공유를 하면 어떤 문제점이 생기고 해결하는 방법에 대해 소개해보겠습니다. 예제 코드 예를 들어 메서드를 호출할 때마다 게임 아이템을 하나씩 늘리고 줄이는 로직 있다고 가정합니다. public class Main { public static void main(String[] args) throws InterruptedException { InventoryCounter inventoryCounter = new InventoryCounter(); IncrementingThread incrementingThread = new IncrementingThread(inventoryCounter); DecrementingThread decrementingThread.. Java/Thread 2023. 11. 7. Thread (2) - 스레드 사용법 및 스레드 간 데이터 공유 스레드의 다양한 생성 방법과 스레드를 연결하는 멀티 스레드를 사용하는 법 및 스레드 간 데이터 공유에 대해 글을 작성해 보겠습니다. 스레드 생성 스레드는 메인 스레드가 종료되어도 실행되고 있는 스레드와 메인 스레드 배경에서 실행되는 데몬 스레드가 있습니다. 즉 일반 스레드는 메인 스레드의 종료를 막고, 데몬 스레드는 막지 않습니다. 익명 클래스사용 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Hello thread : " + Thread.currentThread().getName()); } }); thread.start(); 람다식 사용 Thread thread = new Threa.. Java/Thread 2023. 11. 7. @AllArgsConstructor를 지양해야 하는 이유 현재 넥스트 스텝에서 ATDD, 클린 코드 with Spring 강의를 수강하고 있습니다. 1주 차 미션 구현중 예외 코드를 정의한 부분에 대해서 리뷰어님께서 @AllArgsConstructor를 지양하신다고 코멘트를 주셨습니다. 그래서 이번 글은 @AllArgsConstructor 에 대해서 알아보고 사용법, 장점, 단점을 설명하고자 글을 작성합니다. @AllArgsConstructor @AllArgsConstructor는 롬복에 포함되어 있는 어노테이션으로 모든 멤버 변수에 대한 생성자를 자동으로 생성해 주는 어노테이션입니다. 사용법 build.gradle // lomnok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.project.. Java 2023. 8. 2. [Spring] Spring에서 사용되는 템플릿 메소드 패턴 템플릿 메소드 패턴 GOF의 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의하고 있다. 템플릿 메서드 디자인 패턴의 목적은 다음과 같습니다. 작업에서 알고리즘의 골격을 정하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재 정의할 수 있습니다. 쉽게 말해 부모 클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 패턴을 템플릿 메서드 패턴이라고 합니다. 템플릿 메소드 패턴 예제 붕어빵을 만드는 과정이 다음과 같다고 가정해보겠습니다. 슈크림 붕어빵 팥 붕어빵 1. 반죽을 넣는다. 2. 슈크림을 넣는다. 3. 반죽을 넣는다. 4. 3분 기다린다. 1. 반죽을 넣는다. 2. 팥을.. Spring Boot/디자인패턴 2023. 4. 29. [Java] Stream API 활용 및 사용법 총 정리 (3) 1. FlatMap을 통한 중첩 구조 제거 [ FlatMap이란? ] 만약 우리가 처리해야 하는 데이터가 2중 배열 또는 2중 리스트로 되어 있고, 이를 1차원으로 처리해야 한다면 어떻게 해야 할까? 이러한 경우에 map을 이용해도 결과는 2중 Stream의 형태일 것이다. 이처럼 중첩 구조를 한 단계 제거하기 위한 중간 연산이 필요한데, 이것이 바로 flatMap이다. flatMap은 Function 함수형 인터페이스를 매개 변수로 받고 있다. 예를 들어 다음과 같이 2중 리스트가 존재한다고 할 때, 이를 1중 리스트로 변환하기 위해서 flatMap을 이용할 수 있다. // flatMap 함수 Stream flatMap(Function Java/stram-api 2022. 12. 11. [Java] Stream API 활용 및 사용법 총 정리 (2) 1. Stream 생성하기 앞서 설명한대로 Stream API를 사용하기 위해서는 먼저 Stream을 생성해주어야 한다. 타입에 따라 Stream을 생성하는 방법이 다른데, 여기서는 Collection과 Array에 대해서 Stream을 생성하는 방법에 대해 알아보도록 하겠습니다. [ Collection의 Stream 생성 ] Collection 인터페이스에는 stream()이 정의되어 있기 때문에, Collection 인터페이스를 구현한 객체들(List, Set 등)은 모두 이 메소드를 이용해 Stream을 생성할 수 있다. stream()을 사용하면 해당 Collection의 객체를 소스로 하는 Stream을 반환한다. // List로부터 스트림을 생성 List list = Arrays.asList(.. Java/stram-api 2022. 12. 10. [Java] Stream API 활용 및 사용법 총 정리 (1) - 람다식과 함수형 인터페이스 1. 람다식(Lamda Expression) 이란? Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문에 우리는 Stream API를 정확히 이해하기 위해 람다식과 함수형 인터페이스에 대해 알고 있어야 한다. [ 람다식(Lamda Expression) 이란?] 람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다. 익명함수(Anonymous Function)란 함수의 이름이 없는 함.. Java/stram-api 2022. 12. 10. [java] stream 스트림이란? 자료가 묘여 있는 배열이나 컬렉션 또는 특정 범위 안에 있는 일련의 숫자를 처리하는 기능이 미리 구현되어 있다면 프로그램의 코드가 훨씬 간결해지고 일관성 있게 다룰 수 있습니다. 예를 들어 배열 요소를 특정 기준에 따라 정렬(sorting)하거나, 요소중 특정 값은 제외하고 출력하는(filter) 기능처럼 말입니다. 이렇게 여러 자료의 처리에 대한 기능을 구현해 놓은 클래스가 스트림(stream)입니다. 스트림을 활용하면 배열, 컬렉션 등의 자료를 일관성 있게 처리할 수 있습니다. 자료에 따라 기능을 각각 새로 구현하는 것이 아니라 처리해야 하는 자료가 무엇인지와 상관없이 같은 방식으로 메서드를 호출할 수 있기 때문에 다른 말로는 자료를 추상화했다고 표현할 수 있습니다. 배열을 예로 들어 보.. Java 2022. 7. 27. [Java] equals()와 hascode() 메서드 equals() 및 hashCode() 메서드는 Java 객체의 부모 객체인 Object 클래스에 정의되어 있습니다. 그렇기 때문에 모든 Java의 객체는 Object 클래스에 정의된 equlas() 와 hashCode 메서드를 상속받고 있습니다. equals() 란? boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용된다. equals() 가 구현된 방법은 2개의 객체가 참조한느 것이 동일한지를 확인하는 것이다. 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. public boolean equals(Object o) { if (this == o) return true; } hashCode() 란? in.. Java 2022. 7. 9. [Java] RuntimeException Exception은 try-catch를 이용해 프로그램의 비정상적인 종료를 막을 수 있습니다. Exception은 Checked Exception, Unchecked Exception으로 나뉩니다. Checked Exception Checked는 컴파일 시점에서 체크되는 예외로 컴파일 시에 예측이 됩니다. Checked Exception은 발생 시킬 수 있는 메서드를 사용할 경우 반드시 throws를 통한 예외를 던지거나 try-catch를 이용해 예외처리를 해줘야 하는 강제성이 있습니다. Unchecked Exception Unchecked는 컴파일 시 체크되지 않으며 프로그램 실행 도중 발생하는 예외로 예측이 불가능합니다. Unchecked Exception은 발생시 킬 수 있는 메서드를 사용할 경우.. Java 2022. 7. 6. 이전 1 2 다음