Java15 [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. Thread (1) - 운영체제 관점에서의 멀티 스레드 운영체제 관점에서의 스레드는 프로세스 위에서 동작하는 task(일)라고 생각할 수 있습니다. 즉 자바 애플리케이션(프로세스)에서 실행되는 코드, 동작하는 일을 스레드라고 할 수 있습니다. public class Main { public void main(String[] args) { System.out.println("Hello World!"); } } 위의 메인 메인 메서드를 실행 시키면 우리는 Hello Wrold라는 출력문을 볼 수 있습니다. 이것은 메인 쓰레드가 위의 코드를 실행시키면서 출력된 것입니다. 이렇게 단일 스레드로도 충분히 애플리케이션을 실행시킬 수 있는데 멀티 스레드는 왜 사용할까요? 멀티 스레드의 사용 이유 멀티스레드의 사용이유에는 크게 두 가지를 생각할 수 있습니다. 병행성 성능 .. 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. [ThreadLocal] 쓰레드 로컬 사용해보기 동시성이란? 동시성 문제는 여러 쓰레드가 같은 인스턴스의 필드에 접근해야 하기 때문에 트래픽이 적은 상황에서는 확률상 잘 나타나지 않고 트래픽이 점점 만나질 수록 자주 발생합니다. 특히 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때 이러한 동시성 문제를 조심해야 합니다. 이런 동시성 문제는 지역 변수에서는 발생하지 않습니다. 지역 변수는 쓰레드마다 각각 다른 메모리 영역이 할당되기 때문입니다. 동시성 문제가 발생하는 곳은 같은 인스턴스의 필드(주로 싱글톤에서 자주 발생), 또는 static 같은 공용 필드에 접근할 때 발생합니다. 동시성 문제는 값을 읽기만 하면 발생하지 않고 어디선가 값을 변경하기 때문에 발생합니다. 이러한 문제를 해결하기 위한 것이 스레드 로컬입니다. ThreadLocal 쓰.. Java 2023. 4. 22. [Java] Mac에서 여러개의 Java 버전 확인하기 1. 설치된 Java 버전 확인하기 터미널에 접속해줍니다. 다음과 같은 명령어를 입력합니다. /usr/libexec/java_home -V 그러면 다음과 같이 2개의 버전이 나옵니다. 저의 경우는 Oracle의 Java 11 버전과 Aws의 자바 11버전 두개가 나옵니다. 이 중 기본 JDK로 설정된 버전을 확인하기 위해선 아래와 같은 명령어를 사용하면 됩니다. java -version 그러면 현재 openJDK 11이 기본 버전으로 설정되어 있는 것을 확인할 수 있습니다. Java 2022. 12. 13. [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. 이전 1 2 다음