728x90
반응형

JAVA 17

[algorithm] 그리디(greedy, 탐욕) 알고리즘

🤔 그리디 알고리즘 탐욕, 욕심쟁이 알고리즘이라고도 불림. 미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫒아 최종적인 해답에 도달하는 방법 일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다 현재의 최적 해 != 전체의 최적 해 🧦 사용해야 하는 조건 서울에서 대전을 거쳐 부산까지 가는 최적의 경로를 선택해라. 1. 현재의 선택이 미래의 선택에 영향을 주지 않는다. 2. 부분의 최적 해가 모이면 전체의 최적 해가 된다. 그리디 문제를 푸는 방법의 핵심은 정렬이다. 어떻게 정렬해야 이 두가지 조건을 만족할 수 있을지 생각해야한다. 🤖 그리디는 왜 사용할까? 빠른 속도 : 항상 최적의 선택을 하기 때문에 dp보다도..

JAVA/Algorithm 2023.06.11

[Algorithm] 정렬 알고리즘(버블정렬, 선택정렬, 삽입 정렬)

버블정렬(Bubble Sort)버블정렬(Bubble Sort)은 인접한 두 개의 요소를 비교하면서 크기가 작은 요소를 앞으로 이동시키고 큰 요소를 뒤로 이동시키면서 정렬하는 알고리즘이다. 버블정렬의 동작 방식 1. 배열의 첫번째 요소부터 마지막 요소까지 반복하여 인접한 두 요소를 비교한다. 2. 왼 쪽 요소가 오른쪽 요소보다 크면, 두 요소의 위치를 교환한다. 3. 배열의 마지막 요소까지 이동한 후, 가장 큰 요소가 배열의 마지막에 위치하게 된다. 4. 다음 반복에서는 배열의 첫번째 요소부터 마지막에서 두번째 요소까지 인접한 두 요소를 비교하면서 정렬한다. 마지막 요소는 이미 정렬이 완료되었기 때문에 제외한다. 5. 이러한 과정을 배열의 모든 요소가 정렬될 때까지 반복한다. 1~4번 과정을 배열이 정렬될..

JAVA/Algorithm 2023.03.12

[Effactive Java] 불필요한 객체 생성을 피하라 - 6

다음과 같은 세 가지 경우에서 불필요한 객체 생성을 피하자 문자열 정규식, Pattern 오토박싱(auto boxing) 문자열 JVM은 내부적으로 문자열을 해시맵 풀에 담아두고 어디선가 동일한 문자열을 참조하면 만들어 놓은 풀에서 참조하는 방법으로 재사용하고 있다. 그렇기에 문자열 생성에 new String("hello")를 사용한다면 불필요한 객체를 생성하게 된다. 사실상 동일한 객체라서 매번 새로 만들 필요가 없다. new String("자바")을 사용하지 않고 문자 리터럴 ("자바")을 사용해 기존에 동일한 문자열을 재사용하는 것이 좋다. public class Strings { public static void main(String[] args) { String hello1 = "hello"; ..

JAVA/Effective 2023.01.08

JUnitParamsRunner 매개변수를 이용하여 Junit 테스트

매개변수를 이용하여 Junit 테스트하기, 여러 경우의 수를 간단하게 테스트 가능하게 해준다. 1. build.gradle dependency 추가 implementation 'pl.pragmatists:JUnitParams:1.1.1' maven의 경우 https://github.com/Pragmatists/JUnitParams 참고 2. 테스트 클래스에 @RunWith 어노테이션 추가 @RunWith(JUnitParamsRunner.class) 3. @Parameters 어노테이션에 파라미터 넣어주기 @Parameters({ "0, 0, true", "100, 0, false", "0, 100, false" }) JUnitParamsRunner 적용 전 테스트 @Test public void test..

JAVA 2022.12.29

[JAVA 8] 날짜/시간 표현 (Instant, ZonedDateTime, LocalDateTime, Period)

자바 8이전의 날짜와 시간 정보는 Date, Calendar, SimpleDateFormatter 클래스를 이용왔지만, 이러한 기존 날짜를 표현하는 라이브러리들은 다양한 문제를 가져왔다. 기존 Date, Calendar 등 날짜/시간 표현식의 문제점 - 변경이 가능하다. : 날짜/시간 유형은 변경 불가능한 유형으로 유용하게 모델링 되는 자연 값이다. Date와 같은 기존 클래스는 mutable 하기 때문에 thread safe 하지 않아 멀티 쓰레드 환경에서 안전하게 사용하기 어렵다. - 클래스의 이름이 명확하지 않다. : Date인데 시간까지 설정이 가능하다는 것이 프로그램을 모호하게 만든다. - 월을 표현할 때 +1을 해주어야한다. : type safe 하지 않으며, 버그 발생의 여지가 있다. 그 외..

JAVA/Modern JAVA 2022.11.16

[JPA ERROR] entity 클래스에 @Data 사용 시 java.lang.StackOverflowError 발생 오류

원인 - @Data 어노테이션 안에 있는 @EqualsAndHashCode 어노테이션이 연관관계 매핑 과정에서 무한 루프로 인해 스택오버플로우를 발생시켰다. - @EqualsAndHashCode 어노테이션에서 모든 필드를 기반으로 두 객체와 내용을 비교하는데, OneToMany와 같이 양방향 의존관계를 설정하면 hashCode가 중복되어 무한으로 hashCode 함수가 호출되어 상호 참조로 인한 스택오버플로우가 발생한다. 해결 - 엔티티 클래스에 @Data 사용을 자제하고 필요 어노테이션을 따로 설정하면 된다. - @EqualsAndHashCode(of = "id")로 아이디 정도만 걸어주는 게 좋을 거 같다.. Reference https://projectlombok.org/features/Data h..

JAVA/JPA 2022.11.05

[디자인 패턴] 자바의 싱글톤 패턴 (static)

싱글톤 패턴(Singleton Pattern) 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴으로, 보통 데이터베이스 연결 모듈(DBCP, DataBase Connection Pool)에 많이 사용된다. 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 공유하며 사용하기 때문에 인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 있고, 반대로 의존성이 높아진다는 단점이 있다. 자바에서 static 키워드를 사용하면 오직 하나의 인스턴스를 사용하는 싱글톤 패턴이 된다. class Singleton{ private static class singleInstanceHolder{ private static final Singleton INSTANCE = new Singleton(); } public..

JAVA/Design Pattern 2022.11.04

[JAVA 8] 분할 가능한 Iterator인 Spliterator 인터페이스

자바8에서 추가된 쪼갤 수 있는 기능을 가지고 있는 iterator란 뜻으로, Split + Iterator 인 Spliterator 인터페이스는 병렬 작업에 특화되어있다. 즉 Iterator가 반복이라면, Spliterator는 분할 가능한 반복이다. Iterator import java.util.*; public class Solution3 { public static void main(String[] args) { List list = new ArrayList(); list.add("콜팝"); list.add("치킨"); list.add("곱창"); list.add("팝콘"); list.add("피자"); Iterator listIterator = list.iterator(); while(listI..

JAVA/Modern JAVA 2022.11.01

[JAVA] ConcurrentHashMap

흔히 사용되는 HashMap 클래스는 synchronized 키워드가 존재하지 않는다. 이는 성능은 좋지만, 멀티스레드 환경에서 thread-safe 하지 않음을 의미하며 멀티스레드 환경에서 사용하기는 부적합하다. thread-safe(스레드 안전) : 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻함. synchronized : 여러개의 스레드가 한개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 해당 스레드를 제외하고 나머지 스레드들은 데이터에 접근 할 수 없도록 막는 것을 뜻함. 이러한 문제로 인해 멀티스레드 환경에서 사용할 수 있도록 나온 클래스가 바로 ConcurrentHashMap 이..

JAVA/Data Structure 2022.10.23

[디자인패턴] PRG (Post -> Redirect -> Get) pattern 이란?

PRG 패턴은 POST > Redirect > Get 패턴으로 개발되는 것을 의미하며 웹 개발 시 사용되도록 권장하고 있는 디자인 패턴이다. PRG 패턴을 사용함으로써 사용자의 뒤로 가기, 새로고침으로 인한 중복 입력을 방지할 수 있다. 사용자가 상품 주문을 수행한 후 주문 완료 페이지에서 새로고침을 수행할 경우 마지막 요청인 POST 주문입력 요청이 수행되어, 사용자가 새로고침을 수행할 때마다 DB에 저장되는 문제가 발생하게 된다. 상품 주문 후 서버에서 주문 조회 페이지에 대한 Redirect를 수행하게 되어, 사용자가 주문 완료 페이지에서 새로고침을 하더라도 마지막 요청이 상품 조회 GET 요청이기 때문에 주문이 아닌 주문 조회 화면(GET)만 보여지게 된다. PRG 패턴 전용 전 @GetMappi..

JAVA/Design Pattern 2022.10.23
728x90
반응형