Java 9

퀵 정렬

Java의 Arrays.sort는 듀얼피봇 퀵정렬(Dual-Pivot QuickSort)을 사용한다. 듀얼 피봇 퀵정렬은 피봇을 2개를 두고 3개의 구간을 만들어 퀵정렬을 진행한다는 것이다. 이 방식은 하나의 피봇으로 진행하는 퀵 정렬에 비해 좋은 성능을 낸다고 알려진다. 그 이유는 퀵 정렬의 경우 최악의 경우의 피봇을 잡았을 때 (오름차순에서 가장 작은 수 or 내림차순에서 가장 높은 수) 버블정렬과 같은 시간 복잡도가 나온다. 때문에 평균은 O(nlog₂n)로 준수한 시간 복잡도를 갖지만 최악의 경우 O(n²)가 나온다. 때문에 두개의 피봇을 두고 퀵 정렬을 한다. 그렇기에 그 기본이 되는 퀵 정렬에 대해 공부해 보았다. 퀵정렬의 정렬 방식 피벗을 기준으로 피벗보다 작은 요소들은 피벗의 왼쪽에 위치시..

리플렉션과 동적 프록시

이전 프록시 패턴과 데코레이션 패턴을 통해 부가 기능과 메인 로직을 분리하는 패턴에 대해서 알아보았다. AOP의 정의와 프록시/데코레이션 패턴 AOP의 정의 AOP는 관점지향프로그래밍이라 불리며 어떤 로직을 기준으로 핵심적인 로직과 부가적인 기능의 관점을 나누어 보고 그 관점을 기준으로 모듈화 한다. 흩어진 관심사를 묶고 비즈니스 programmingjun.tistory.com 프록시 패턴으로 분리는 가능하였지만 같은 부가기능을 각 로직별로 적용하고 싶다면 프록시 클래스를 하나하나 만들어 주어야 하는 불편함이 있었다. (재사용이 불가능함) 이 부분을 Java가 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스는 자바의 Reflection 기술을 통하여 프록시 객체를 동적으로 생성..

Java 2024.01.06

객체지향의 5가지 원칙 (SOLID)

SOLID 원칙을 지키며 설계를 한다면 좋은 객체 지향 설계를 할 수 있다. 그렇다면 SOLID 원칙이 무엇인지 아래와 같이 예시와 함께 정리 해보았다. SOLID • SRP: 단일 책임 원칙(single responsibility principle) • OCP: 개방-폐쇄 원칙 (Open/closed principle) • LSP: 리스코프 치환 원칙 (Liskov substitution principle) • ISP: 인터페이스 분리 원칙 (Interface segregation principle) • DIP: 의존관계 역전 원칙 (Dependency inversion principle) • SRP: 단일 책임 원칙(single responsibility principle) - 한 클래스는 하나의 책..

Java 2023.12.22

switch case문 (Java 14~)

기존 switch 문 경우에 따라 if문과 else-if문을 많이 사용하기 보다 가독성 좋게 작성 할 수 있어 사용 되는 switch문. 하지만 case 마다 break를 적지 않으면 의도와 다르게 코드가 작동하여 대부분의 case 문에서 break을 걸어줘야 했으며 타이핑이 많아지고 코드가 길어진다는 단점이 있었다. int num = 3; String str; /* num 에 들어오는 값에 따라 str 초기화 하는 코드 */ switch (num) { case 1: case 2: case 3: str = "num은 1~3 사이 정수"; break; case 4: str = "num는 4"; break; default: str = "1에서 4 사이의 숫자가 아님"; } Java 14 이후 개선된 swit..

Java 2023.12.06

쓰레드

프로세스와 쓰레드 프로세스 : 실행중인 프로그램, 자원(resources)과 쓰레드로 구성 쓰레드 : 프로세스 내에서 실제 작업을 수행, 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다 - 프로세스 : 쓰레드 = 공장 : 일꾼 싱글 쓰레드 = 자원+단일 쓰레드 멀티 쓰레드 = 자원+복수 쓰레드 - 하나의 새로운 프로세스를 생성하는 것 보다 하나의 새로운 쓰레드를 생성하는것이 더 적은 비용이 든다 멀티쓰레드의 장단점 장점 시스템 자원을 보다 효율적으로 사용할 수 있다 사용자에 대한 응답성 (responseness)이 향상된다 작업이 분리되어 코드가 간결해 진다. 단점 (프로그래밍할 때 고려해야 할 사항들이 많다.) 동기화(synhoronization)에 주의해야한다. 교착상태(dead-lock)가 발생..

Java 2022.12.30

메서드 정리

java.lang ================================================================ String toLowerCase() String인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환한다 String trim() 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이 때 문자열 중간에 있는 공백은 제거되지 않는다. String substring(int begin) String substring(int begin, int end) 주어진 시작 위치 (begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻는다. 이 때, 시작 위치와 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않는다. (begin

스텍, 큐

예제 Stack st = new Stack(); //스택 객체생성 st.push(1); //스택에 1 추가 st.pop(); //스택 하나 꺼내기 st.isEmpty() //스택이 비었는가 ture false import java.util.Stack; class Solution { boolean solution(String s) { boolean answer = true; String res = "YES"; Stack st = new Stack(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') { st.push(1); } else if (s.charAt(i) == ')') { if (st.isEmpty()) { answer = false..

완주하지 못한 선수

문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 풀이 (단순소팅) 참가자(participant)와 완주자 (completion)을 소팅..

평균 구하기

문제 설명 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요. 제한사항 arr은 길이 1 이상, 100 이하인 배열입니다. arr의 원소는 -10,000 이상 10,000 이하인 정수입니다. 풀이 1) 하드 코딩 arr가 null일 경우 0을 리턴 arr의 값을 모두 더한 총합을 구함 arr.length를 나누어 평균을 구함 import java.util.Arrays; import java.util.Spliterator; class Solution { public double solution(int[] arr) { double answer = 0; if(arr!=null){ //(1) for(int i : arr){ answer+=i; i++; } return..