▸JAVA97 Comparator를 사용한 문자열 정렬 및 여러 개의 배열 객체 정렬 하나의 배열이 아닌 여러 개의 배열을 일정 기준으로 정렬하는 방법입니다. 혹시 sort() 메소드의 매개변수가 배열의 보이는 순서와 반대로 들어오는 것과, 음수가 리턴될 때 자리를 바꿔준다는 것을 모르시는 분은 아래 글을 먼저 읽고 오시는게 좋을 것 같습니다. [JAVA/- 라이브러리(API)] - java.lang.Comparable / java.util.Comparator 사용법 사실 반대로 이해하고 있어도 정렬하는데 보통 지장이 없긴 하지만 해당 개념을 모르면 디버깅을 하거나 문제를 파악할 때 헷갈릴 수 있을 것 같습니다. 그리고 조금 더 응용을 하게 되면 매개변수의 위치와 리턴값의 설정이 중요해질 수 있습니다. 아래와 같은 두 배열이 있다고 가정하겠습니다. 두 배열을 내림차순으로 정렬하기 위해서는.. ▸JAVA/라이브러리(API) 2020. 4. 19. 부분집합_재귀함수_조합 구하기 (JAVA) [ 조합 (Combination) ] n개의 원소 중 r개의 원소를 꺼내는 경우의 수 순서가 유효하지 않기 때문에 중복을 허용하지 않음 (순열은 순서가 유효하므로 중복 허용) 경우의 수 : nPr / r! = n! / r! * (n-r)! 표기법 : nCr 순열과 달리 순서가 필요없어서 중복을 허용하지 않는 것을 조합이라고 합니다. {1,2,3}과 {3,2,1}은 같은 것으로 간주합니다. 예를 들어 {1,2,3} 중 2개를 곱해서 나올 수 있는 숫자를 구하라고 한다면 "{1,2} = 2", "{2,1} =2" 이기 때문에 순서에 상관 없이 원소의 종류만 맞으면 됩니다. 이전 글의 순열 코드를 약간 수정해 조합이 되었기 때문에 순열의 원리를 이해하면 금방 이해를 할 수 있습니다. 순열 코드는 백준 알고리즘.. ▸JAVA/알고리즘 및 자료구조 2020. 4. 17. 부분집합_재귀함수_순열 구하기 (JAVA) [ 순열 (Permutation) ] n개의 원소 중 r개의 원소를 꺼내는 경우의 수 순서가 유효하기 때문에 원소의 중복을 허용함 (조합은 순서가 유효하지 않아 중복 불허) 경우의 수 : n! / (n-r)! 의 갯수를 가짐 표기법 : nPr 순서가 있도록 모든 경우의 수를 뽑아내는 것을 순열이라고 합니다. 부분집합 중 {1, 2, 3}과 {3,2,1}은 엄연히 다른 것으로 인식합니다. 예를 들어 {1,2,3} 중 2개를 조합해 만들 수 있는 모든 숫자를 구하라고 한다면 순열을 이용해야 합니다. 두 숫자를 붙이는 것은 순서에 따라 다르니까요. 일단 최대한 직관적으로 작성 후 백준 알고리즘 문제를 통해 검증을 완료한 코드입니다. * 전체 코드 package pojoPrj; import java.util.A.. ▸JAVA/알고리즘 및 자료구조 2020. 4. 17. 부분집합_재귀함수_멱집합 구하기 (JAVA) [ 멱집합(powerset) ] 공집합을 포함해 모든 부분집합을 가진 집합 (중복 없음) 어떠한 집합의 부분집합을 산출하는 로직은 여러 가지가 있습니다. 그 중 모든 부분집합(멱집합)을 가장 쉽게 구할 수 있는 재귀함수 사용법입니다. 원소 순서에 상관없이 중복을 허용하지 않기 때문에 rCr의 조합과 동일한 결과입니다. 아래 3개짜리 배열이 하나 있다고 해보겠습니다. * 집합 : { a, b, c } 먼저 가장 앞에 있는 "a"의 기준에서 생각해봅니다. "a"는 부분집합에 있을 수도 있고 없을 수도 있습니다. 따라서 "a"가 있건 없건 부분집합을 구하기 위해서는 { b, c }의 부분집합 정보가 필요합니다. 피보나치 수열과 같이 큰 문제를 해결하기 위해 작은 정보가 필요한 경우입니다. 그럼 이번엔 { b,.. ▸JAVA/알고리즘 및 자료구조 2020. 4. 14. java.lang.Comparable / java.util.Comparator 사용법 [ java.lang.Comparable ] 객체 자신이 가지고 있는 자신의 정렬 기준을 정의하는 인터페이스 Arrays.sort() 및 Collection.sort() 메소드의 기준으로 적용 [ java.util.Comparator ] Arrays.sort() 및 Collection.sort() 메소드의 기준으로 삽입해주는 정렬 기준을 가진 인터페이스 Comparable은 직접 클래스를 만들 때 해당 클래스 객체의 정렬 기준을 미리 설정해 두기 위해 구현하는 인터페이스입니다. 래퍼 클래스나 String과 같이 자바에서 정렬이 가능한 타입들은 모두 Comparable을 구현하고 있습니다. 내부적인 정렬 기준을 이미 가지고 있다는 의미입니다. * 내부적인 Comparable 구현 정렬 기준 - 숫자 : 오.. ▸JAVA/라이브러리(API) 2020. 4. 13. 메소드 내 예외처리(try-catch-finally)에서의 리턴 처리 1. try 구문 내에서 리턴에 도달했을 경우 try 내에서 리턴에 정상적으로 도달하였으므로, 리턴시킬 값을 임시 저장한 뒤 바로 finally 문을 최종 실행시키고 메소드를 종료합니다. 실제 리턴은 finally문이 종료된 이후에 실행됩니다. 이경우에는 try-catch-finally 이후에 지정된 리턴문이 있어도 무시됩니다. 2. try 구문 내에서 return에 도달하지 못하고 예외 발생했을 경우 이경우에는 catch-finally문이 작동한 뒤, 이후 코드를 계속 실행해 나가다가 리턴값을 만나면 리턴해줍니다. 따라서 예외 발생 시에 리턴시킬 값을 지정할 때는 try-catch-finally문 바깥에 리턴문을 작성해주면 됩니다. finally안에서 리턴시키는 것은 경고가 뜨는데, 이는 만약 try문.. ▸JAVA/기본 문법 2020. 2. 23. 콜백(Callback) 패턴을 사용한 비동기 방식의 원리와 사용법 [ 콜백 (Callback) ] 피호출자(Callee)가 호출자(Caller)를 다시 호출하는 것 비동기적(Asynchronous) 처리를 하기 위한 디자인 패턴의 종류 자바에서 콜백 패턴을 다루는 방법에 대해 정리해 보았습니다. 간단해 보이는데 개념이 정확히 잡혀있지 않으면 꽤나 헷갈리는 패턴인 것 같습니다. 먼저 아래의 예시 상황을 한번 만들어보겠습니다. 클래스A는 채팅(하는척) 기능 담당하는 클래스이다. 채팅내용으로 "채팅을 하고 있습니다." 라는 문자열을 0.5초에 한번씩 화면에 출력한다. 채팅 문자열이 10개가 쌓이면 네트워크로 대용량 파일을 전송(하는척)한다. 클래스B는 파일 전송(하는척) 기능을 담당하는 클래스이다. 1~10까지의 숫자를 0.5초에 한번씩 전송(하는척)한다. 전송률이 40%,.. ▸JAVA/기본 문법 2020. 2. 7. 네트워크_NIO_논블로킹 채팅 서버/클라이언트 [3/3] 이전글에서 논블로킹 채팅 서버 및 클라이언트를 간단하게 만들어봤습니다. 글이 너무 길어져서 따로 코드만 첨부합니다. 코드 설명은 아래 링크를 참조하시면 됩니다. 2020/02/04 - [JAVA/기본 문법] - 네트워크_소켓(Socket) 통신_NIO 입출력(논블로킹) [2/3] 로직을 쉽게 보기 위해 객체화를 최대한 지양했습니다. [ 스레드를 사용하지 않는 논블로킹(non-blocking) 서버 코드 ] package hs; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.Select.. ▸JAVA/기본 문법 2020. 2. 6. 네트워크_소켓(Socket) 통신_NIO 입출력(논블로킹) [2/3] [ NIO를 이용한 네트워크 입출력 - 논블로킹(non-blocking) 방식 ] 파일 입출력편에서 다룬 것 처럼 네트워크도 NIO를 통해 입출력을 수행할 수 있습니다. 스트림 계열의 경우 인풋과 아웃풋을 따로 만들어 관리해줘야 하지만 NIO의 채널을 이용하면 양방향 입출력 통로를 생성해서 사용할 수 있습니다. 또한 스트림 계열이 블로킹(blocking) 방식만 지원하는데 반해 NIO는 블로킹 방식에 더해 논블로킹(non-blocking) 방식을 추가로 지원하기 때문에 데이터 송수신양이 많을 경우 기존 스트림 계열보다 병렬처리를 더욱 효과적으로 할 수 있습니다. 블로킹(blocking) 방식이란 데이터 송수신을 기다리는 동안 해당 스레드가 대기 상태로 멈추는 것을 말합니다. 스레드편에서 다룬 블로킹과 동.. ▸JAVA/기본 문법 2020. 2. 4. 네트워크_소켓(Socket) 통신_IO 입출력 [1/3] [ 서버 소켓(ServerSocket) ] 서버에서 클라이언트의 연결 요청을 받기 위해 만들어두는 일종의 문(Door) 포트를 지정해 해당 서비스의 호수를 지정함 (여러 개 문이 있을 때 어느 문으로 들어가야할 지) [ 소켓(Socket) ] 네트워크를 통해 TCP/IP 통신을 연결시켜주는 객체 클라이언트와 서버가 연결된 상태를 만들어줌 (Session을 맺음) 자바에서 파일을 다룰 때 일단 파일을 열어서 파일 객체를 생성한 뒤 스트림이나 채널을 열어 input, output 작업을 수행하고 파일을 닫아줍니다. 네트워크 통신도 파일과 같다고 생각하면 됩니다. 소켓을 통해 서버-클라이언트 간 통신을 열어주는 것, 즉 세션을 맺어준 뒤 역시 스트림이나 채널을 열어 input, output 작업을 수행하면 됩.. ▸JAVA/기본 문법 2020. 2. 4. Thread (스레드)_스레드풀 [3/3] [ 스레드 풀 (Thread Pool) ] 미리 스레드를 생성해두고 재활용해가며 작업을 할당 미리 생성해둔 스레드를 모아둔 묶음을 스레드 풀이라고 함 이전 글들에서 다른 스레드는 각 스레드 당 하나의 run() 메소드를 가지고 있었습니다. 즉, 스레드를 하나 만들어서 실행하면 하나의 스레드는 한개의 로직(run)을 실행하게 됩니다. 그리고 이 로직이 끝나면 스레드는 종료되고 사라집니다. 스레드를 만든다는 것은 JVM이 운영체제(OS)에게 스레드 실행에 필요한 연산 자원(메모리 등)을 할당 받는다는 의미입니다. NIO의 바이트버퍼에서 일반 allocate()에 비해 allocateDirect()가 메모리 버퍼 생성과 해제에 더 시간이 많이 들었던 것처럼, 대부분 JVM 내에서 실행되는 것이 아니라 OS에 .. ▸JAVA/기본 문법 2020. 2. 1. Thread (스레드)_스레드 제어 [2/3] [ wait(), notify(), notifyAll() ] 스레드를 조금 더 세밀하게 제어할 수 있도록 해주는 메소드 동기화(Synchronized) 처리가 된 블록 안에만 사용이 가능 wait() : 스레드 상태를 RUNNABLE → WAITING 상태로 변경 notify() : WAITING 상태의 특정 스레드를 RUNNABLE 상태로 변경 notifyAll() : WAITING 상태의 모든 스레드를 RUNNABLE 상태로 변경 먼저 스레드의 상태 변경을 통해 원하는 조건에 스레드가 중지됐다 다시 가동하도록 하는 방법입니다. 아래 코드에서는 배열에 값이 하나도 없으면 Thread-1을 WAITING 상태로 만들었다가, 다른 스레드에서 배열에 값을 넣으면 notify() 메소드를 통해 Thread-1.. ▸JAVA/기본 문법 2020. 1. 30. Thread (스레드)_기본 스레드 사용 [1/3] [ Thread(스레드) ] 한 프로세스(프로그램 단위)에서 동시에 실행되는 작업 단위 동시에 여러 기능을 사용할 수 있도록 하거나 같은 기능을 여러 명이 동시에 사용할 수 있도록 해줌 프로그램은 항상 절차지향적인 순서대로 실행이 되는데 동시에 여러 절차를 수행할 수 있도록 하는 개념이 스레드의 개념입니다. 연산을 담당하는 CPU의 Core가 한 개라면 여러 스레드의 절차를 돌아가면서 조금씩 수행해 우리가 볼 때는 동시에 여러 로직이 실행되는 것처럼 보이게 됩니다. 4Core CPU라면 4개의 스레드를 동시에 사용해서 연산을 처리하는 것이 가장 좋은 방법이 될 수 있습니다. 만약 8개의 스레드를 사용하게 되면 8개 로직을 동시에 실행할 수 있지만 실질적인 성능이 증가하진 않습니다. 다만 모든 CPU와 스.. ▸JAVA/기본 문법 2020. 1. 30. 람다식(Lamdba Expressions) [ 람다식 문법 ] 익명 클래스를 구현하는 것과 유사한 방식 이전 방식에 비해 구현 코드를 간소화할 수 있음 람다식은 익명 클래스를 다루는 방식과 비슷합니다. 다만 문법을 조금 더 보기 편하게 간소화 시켜둔 것이라 볼 수 있습니다. 하지만 너무 남용할 경우 오히려 코드의 가시성이 떨어질 수 있으니 주의해야 합니다. 굳이 꼭 써야하는 문법은 아니며 사용에 대한 호불호도 많이 갈리는 문법입니다. 특히 객체지향적인 특성에서 많이 벗어나게되는 문법이라 싫어하는 사람들도 많은 것 같습니다. 다만 스트림 등의 특정 API에서는 람다식으로 작성해야 할 경우도 있습니다. 먼저 일반적인 익명 클래스 사용 예시입니다. 이전글에서 다룬 제네릭을 사용해서 내용이 없는 일종의 추상 메소드를 하나 만들고 사용 시에 바로 오버라이.. ▸JAVA/기본 문법 2019. 12. 23. 제네릭(generic) [ 제네릭(generic) ] 데이터 타입이 런타임 시점에 동적으로 결정되는 방식 가상의 데이터 타입을 사용하여 코드 작성 후 사용 시 타입 지정 컬렉션 프레임워크 글에서 간략이 언급했던 제네릭입니다. 리스트를 다룰 때 뿐만 아니라 매우 많은 부분에서 유용하게 쓸 수 있는 문법입니다. 매개변수 등의 전달 타입을 Object로 하는 것과 비슷하지만 더 활용성을 높이고 오류 가능성을 줄이는 방향으로 발전된 기능입니다. [ 제네릭 클래스 생성 ] class 클래스명 { } 꺽쇠기호 안에 가상 타입의 매개변수 이름(보통 T, V 등) 삽입 클래스 생성 시 가상의 타입을 사용해서 필드와 메소드를 만들어 둔 뒤, 실제 클래스를 이용할 때 타입을 지정해줍니다. 대표적인 예로 리스트를 생성할 때 어떤 데이터 타입의 리.. ▸JAVA/기본 문법 2019. 12. 23. 이전 1 2 3 4 ··· 7 다음 💲 추천 글 반응형