전체 글
[Baekjoon] 2176: 합리적인 이동경로
[Baekjoon] 2176: 합리적인 이동경로
2023.05.10문제 문제를 읽자마자 머리를 붙잡았다. 설명이 참,,, 심오하다,, ,,,? 풀이나 알아보자. 풀이 내 풀이 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Q2176 { private static final List graph = new ArrayList(); private static long[] weights; private static int[] counts; public static void main(String[] args) throws IOException { BufferedReader br = new Buffered..
[Baekjoon] 1943: 동전 분배
[Baekjoon] 1943: 동전 분배
2023.05.10문제 돈이 주어지면 반으로 정확히 나눌 수 있는지 묻는 배낭 문제이다. 풀이 내 풀이 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException { for (int i = 0; i < 3; i++) { System.out.println(distribute() ? 1 : 0); } } privat..
[JPA] OSIV(Open Session In View)
[JPA] OSIV(Open Session In View)
2023.05.09OSIV(Open Session In View)? OSIV는 영속성 컨텍스트를 뷰까지 열어두는 기능이다. 영속성 컨텍스트가 뷰까지 유지된다면 엔티티가 영속 상태로 유지되어 있어, 뷰에서도 지연 로딩을 사용할 수 있다. 즉 OSIV가 활성화 된 상태에서는 다음과 같이 영속성 컨텍스트 생존 범위가 요청이 끝나는 시점까지 유지된다. OSIV가 활성화 상태일 때 동작은 다음과 같다. 클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다. 트랜잭션을 시작할 때 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작한다. 서비스 계층이 끝나면 트랜잭션을 commit하고 영속성 컨텍스트를 flush한다. 이 시점에 트랜잭션은 끝나지만 영속성 컨텍스트는 종료되지 않는다. 컨트롤러..
[Network] 루핑(Looping)
[Network] 루핑(Looping)
2023.04.20루핑(Looping)? 루핑은 그 단어에서도 유추할 수 있듯이, 프레임이 목적지에 도달하지 못하고 계속 순환하는 현상을 의미한다. 원인 그럼 루핑 현상은 왜 발생하는 것일까? 먼저 위에 있던 그림을 다시 한 번 간단히 살펴보자. 위 그림에서 Host A와 Host B가 통신하는 상황이라고 생각해보자. 두 Host 사이에는 2개의 경로가 구성되어 있어 하나의 경로에 장애가 생겨도 다른 하나의 경로로 통신할 수 있도록 설계를 했다. 단순히 이렇게 보면 잘 구성된 네트워크 같이 보인다. 그런데 여기서 바로 위에서 말한 루핑 문제가 생긴다. 루핑 현상이 발생하는 시나리오를 한 번 살펴보자. 먼저 Host A가 다음과 같이 브로드캐스트를 보내면 스위치는 이를 받아 들어온 포트를 제외한 다른 모든 곳에 Floodi..
[Design Pattern] 싱글톤 패턴
[Design Pattern] 싱글톤 패턴
2023.04.16싱글톤 패턴? 싱글톤 패턴은 애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴이다. 즉, 생성자가 여러 번 호출되어도, 실제로 생성되는 객체는 하나이고, 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키도록 만드는 것이다. 시스템 런타임, 환경 세팅에 대한 정보 등, 인스턴스가 여러 개일 때 문제가 생길 수 있는 경우가 있다. 따라서 인스턴스를 오직 한 개만 만들어 제공하는 클래스가 필요하다. 구현 먼저 다음은 싱글톤 패턴을 구현한 코드이다. 한 번 살펴보자. class Settings { private static Settings instance; private Settings() { } public s..
[Java] Java 버전 별 특징
[Java] Java 버전 별 특징
2023.04.14JDK 1.0 1996년 1월에 공개되었으며 발표 이전에 불린 이름은 Oak였다. 안정화 작업을 거친 1.0.2 버전에서 Java로 이름이 바뀌었다. JDK 1.1 1997년 2월에 공개했으며 JDBC, Inner Class, Java Beans, RMI, Reflection, Unicode 지원, Internationalization 등이 추가되었다. JavaBeans JavaBeans는 자바로 작성된 소프트웨어 컴포넌트를 말한다. 뷰와 로직을 분리하여 일관된 방식으로 자바 클래스를 사용할 수 있도록 도와준다. Beans 규약 기본 생성자가 반드시 존재해야 한다. 모든 속성은 비공개이다. 속성에 접근하고 꺼내올 수 있는 getter, setter 메서드를 구성한다. Serializable을 구현한다. ..
[Java] Java 11 특징
[Java] Java 11 특징
2023.04.13Java SE 11 (LTS) 2018년 9월에 공개했으며 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고, JavaFX도 JDK에서 분리되어 별도의 모듈로 제공된다. 대표적인 변경 사항은 다음과 같다. String 클래스에 새로운 메서드 추가 String s = ""; s.strip(); // 문자열 앞, 뒤 공백 제거 s.stripLeading(); // 문자열 앞 공백 제거 s.stripTrailing(); // 문자열 뒤 공백 제거 s.isBlank(); // 문자열이 비어있거나 공백만 포함되어 있을 경우 true 반환 s.trim().isEmpty()와 결과가 동일 s.repeat(10); // 입력한 수만큼 문자열을 반복 컬렉션 인터페이스에 toArray() 메서드 추가 Colle..
[Java] Java 9 특징
[Java] Java 9 특징
2023.04.13Java SE 9 2017년 9월에 공개했으며 Project Jigsaw 기반으로 런타임이 모듈화된 것이 가장 큰 특징이다. 이에 따라 대부분의 콘솔 프로그램 개발에는 더 이상 AWT나 Swing 같은 불필요한 라이브러리를 끌어쓸 필요 없이, 최상위 모듈인 Base만 사용해도 되게 되었다. 더불어 특정 프로그램에 최적화된 최소 런타임을 제작할 수 있게 되면서 패키징도 간편해졌다. Jigsaw 모듈 시스템 module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; } jigsaw 프로젝트의 목표는 다음과 같다. 라이..
[Java] Java 8 특징
[Java] Java 8 특징
2023.04.13Java SE 8 (LTS) 2014년 3월에 공개했으며 대표적인 변경 사항은 다음과 같다. 람다 표현식(Lambda Expression) 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. Predicate p = (Apple a) -> a.getWeight(); 자세한 내용은 [람다 표현식 소개], [람다 타입/검사/추론] 이 글들을 참고하자 메서드 참조(Method Reference) 메서드 참조는 람다 표현식을 축약한 형태이다. 메서드 참조를 사용하면 람다 표현식을 더 줄일 수 있는데, 상황에 따라 가독성이 더 좋아보일 수 있다. Predicate p = Apple..
[Java] 숫자형 스트림
[Java] 숫자형 스트림
2023.04.11이전에 reduce를 활용한 코드를 살펴보았다. Optional max = numbers.stream().reduce(Integer::max); 하지만 위 코드는 박싱 비용이 있다. 즉, 내부적으로 계산하기 전에 Integer를 기본형으로 언박싱해야 한다. 그렇지만 걱정할 필요없다. 스트림은 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특화 스트림을 제공한다. 기본형 특화 스트림 Java 8에서는 IntStream, DoubleStream, LongStream 이렇게 세 가지 기본형 특화 스트림을 제공하며 합계, 최대, 최소 등을 계산하는 sum, max, min 등의 리듀싱 연산 수행 메서드도 제공한다. 또 기본형 스트림에서 다시 객체 스트림으로 복원하는 기능도 제공한다. 다만, 특화 스트림은 오..
[Algorithm] 펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)
[Algorithm] 펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)
2023.04.07펜윅 트리(Fenwick Tree, Binary Indexed Tree, BIT)? 펜윅 트리는 세그먼트 트리의 변형으로 세그먼트 트리보다 메모리를 더 절약할 수 있다. 또, 갱신을 O(log n)의 시간에 수행할 수 있으며, 세그먼트 트리보다 구현이 쉽다는 장점이 있다. 구성 펜윅트리는 일반적인 세그먼트 트리와 다르게 기존 배열과 같은 크기로 구성할 수 있다. 펜윅 트리는 다음과 같이 구성한다. 여기서 노란 블럭은 기존 배열, 초록 블럭은 트리 배열이다. 0이 아닌 최하위 비트 펜윅 트리를 초기화하고 업데이트하기 위해선 값을 어떻게 인덱싱하는지 알아야한다. 이때, 0이 아닌 최하위 비트 값을 더해주는 방식을 취한다. 먼저 각 비트의 0이 아닌 최하위 비트를 구하는 방법을 알아보자. 예를 들어 3, 6,..
[Java] 스트림 연산
[Java] 스트림 연산
2023.04.07스트림에는 여러가지 중간 연산, 최종 연산이 있다. 한 번 살펴보자. 필터링 Predicate로 필터링 스트림 인터페이스는 filter 메서드를 지원한다. filter 메서드는 Predicate를 인수로 받아서 Predicate와 일치하는 모든 요소를 포함하는 스트림을 반환한다. 예를 들어, 다음과 같이 액션 영화만 필터링하여 모을 수 있다. List actionMovies = movies.stream() .filter(Movie::isActionGenre) .collect(Collectors.toList()); 고유 요소로 필터링 스트림은 고유 요소로 이루어진 스트림을 반환하는 distinct 메서드도 지원한다. 예를 들어, 다음은 모든 짝수를 선택하고 중복을 필터링하는 코드이다. List number..