본문 바로가기

프로그래밍

Object Pool Pattern (오브젝트 풀 패턴) 의 이해 Object Pool Pattern 패턴? - 객체를 필요로 할때 풀에 요청을 하고, 반환하고 일련의 작업을 수행하는 패턴. 많은 수의 인스턴스를 생성할때 혹은 무거운 오브젝트를 매번 인스턴스화 할때 성능 향상을 가져오기도 합니다. 예를들어, 데이터베이스에 접속하는 여러 객체를 만들때 매번 새로 생성하는 것보단, 미리 생성된 풀에서 객체를 반환받아오는 것이 더 이득 입니다. 이런 문제로 JDBC 에서는 JDBC Connection Pool 을 제공하고 있으며 Thread Pool 역시 오브젝트 풀이 기본 원리 입니다. 이번 포스팅의 목적은 실제 오브젝트풀이 무엇인지, 어떤방식으로 작동하는지 원리에 대해 알아 보고자 합니다. 실제 아래 코드는 사용하는데 제한이 있습니다. (실제 오브젝트 풀은 고려해야할 사.. 더보기
자바 IO&NIO 파일복사 (FileCopy) 방법 우선 자바IO는 NIO에 비해 상당히 느립니다. 자바IO 는 네이티브 언어 (C, C++) 처럼 시스템콜을 직접적으로 사용할수가 없습니다. 대표적으로 두가지 문제점이 있습니다. IO 흐름 첫째. 자바IO는 커널 영역의 버퍼를 직접 건들지를 못합니다. 두번째. 스트림 데이터가 처리되기 전까지 스트림을 사용하는 자바 스레드는 Blocking 됩니다. 예를들어, 파일읽기 작업시 커널에 명령을 전달하고, 커널은 시스템콜 (System Call) 을 사용해서 디스크 컨트롤러가 물리적 디스크로 부터 읽어온 파일 데이터를 커널 영역안의 버퍼로 저장합니다. 커널안의 버퍼로 데이터가 저장되면 JVM(프로세스)안의 버퍼로 복사를 시작하게 됩니다. 이때 만약 프로세스로 버퍼를 복사하지 않고 직접적으로 커널영역의 버퍼를 사용.. 더보기
자바로 구현하는 퀵정렬 (Quick Sort) 알고리즘 퀵 정렬(QuickSort) 이란? 분할 작업을 순환적으로 반복하면서 피봇의 왼쪽 왼쪽 부분 집합과 오른쪽 부분집합을 정렬 하는 방법 1. 전체원소 가운데 하나의 원소를 중심(Pivot)으로 2개의 부분 집합으로 분할 한다. 2. 기준값(Pivot) 보다 작은 원소는 왼쪽 부분집합으로, 기준값(Pivot) 보다 큰 원소들은 오른쪽 부분 집합으로 정렬한다. 3. 분할된 부분집합의 크기가 0이나 1이 될 때 까지 순환 호출을 이용하여 다시 분할 한다. 위 과정을 반복하는 것이 퀵정렬 입니다. 출처 - http://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC C로 배우는 쉬운 자료구조 (한빛미디어) 서적의 수도코드 (pseudo code) 를 참고 하였으며, 서적.. 더보기
자바로 구현하는 선택정렬 (Selection Sort) 알고리즘 선택정렬이란? 제자리 정렬 알고리즘의 하나로, 전체 원소들 중에서 기준 위치에 맞는 원소를 선택하여 자리를 교환하는 방식 1. 주어진 원소중 최소값을 찾는다. 2. 그 값을 첫 번째 원소와 교환 한다. 3. 그 다음 작은 원소를 찾아 다음 위치의 원소와 비교하여 교환한다. 위 과정을 반복하는 것이 선택정렬 입니다. 출처 - http://ko.wikipedia.org/wiki/%EC%84%A0%ED%83%9D_%EC%A0%95%EB%A0%AC 수도코드 예를들어, {80, 6, 2, 3, 1} 원소를 정렬하고자 하는 경우, (기준위치 를 빨간색, 최소값 위치 파란색으로 표시) 1단계 80 6 2 3 1 정렬후 : 1 6 2 3 80 2단계 1 6 2 3 80 정렬후 : 1 2 6 3 80 3단계 1 2 6 .. 더보기
자바로 구현하는 버블소트 (Bubble sort) 알고리즘 거품 정렬(Bubble sort)이란 ? - 두 인접한 원소를 검사하여 정렬하는 방법 시간 복합도가 로 상당히 느리지만, 코드가 단순하기 때문에 자주 사용된다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다. 출처: http://ko.wikipedia.org/wiki/%EA%B1%B0%ED%92%88_%EC%A0%95%EB%A0%AC 여기서 잠깐! 자바에선 편리하게도 배열, 리스트 형태의 데이터를 정렬해주는 클래스가 존재한다. Arrays 클래스의 Sort 메서드를 통해 byte, int, short 배열 등 각 타입배열에 따른 정렬을 제공해주고, Collections 클래스의 sort, reverse 메서드를 통해 List 타입의 자료를 정렬해준다. 두 방식 모두 순.. 더보기
자바로 구현하는 링크드 리스트 (Singley LinkedList) 안녕하세요? 이번 강좌에서는 자바로 제네릭을 통한 단일 연결리스트 (SingleyLinkedList) 를 구현하도록 하겠습니다. (자바에 대한 기초 사전 지식이 필요합니다. 자료구조는 반드시 기초를 먼저 공부후에 공부하세요!) 우선 자바에서는 java.uitl 패키지안에 다양한 자료구조를 제공하고 있습니다. 그중에서도 LinkedList 클래스 (이중연결리스트) 를 사용하면 아주 편리한 자료구조를 사용 할 수 있습니다. 이렇게 편리하게 이미 링크드리스트를 제공해주지만, 링크드리스트 자료구조가 내부적으로 어떻게 구현되어있고 어떤식으로 작동하는지 살펴보겠습니다. 우선, 제가 제작한 소스코드는 C로 배우는 쉬운 자료구조 (한빛미디어) 서적의 수도코드 (pseudo code) 를 참고 하였으며, java.uit.. 더보기
PHP DB트랜잭션(DB Transaction) 처리방법 PHP에서 데이터베이스 프로그래밍을 할때, DB트랜잭션을 사용해야될 사항이 많이 생깁니다. DB트랜잭션이 필요한 대표적 사례는 ATM기기 입니다. A사용자가 은행에서 돈을 인출하다가 돈은 인출되었는데, 시스템 전상에 문제가 생겨 뻑이나서 시스템을 키니 인출한 금액을 DB에 반영하여 삭감하지 못했거나, 인출금액을 받지 못하는 등 상황에서 필요한것이 데이터베이스 트랜잭션 입니다. (자세한 사항 : http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98) PHP 에서는 기본적으로 AUTO_COMMIT 이 활성화 되어있습니다. mysqli_query 함수를 사용하여 SQL 쿼리를 바로 데이터베이스에 반영하게 됩니다. DB트랜잭션을 사용하기 위해서는 .. 더보기
연결 커넥션에서 INSERT 한 마지막 ID값 구하기 PHP 에서 데이터베이스 프로그래밍시, 1개의 테이블에 데이터를 삽입하고, 바로 삽입한 데이터의 ID 필드 값을 구해와야 하는 경우가 생길때가 있습니다. 예를들어, 1번 테이블은 사용자와 관련된 정보 테이블 A, 사용자와 관련된 여러개 이미지가 존재하는 테이블 B (B테이블 존재하는 이유는 사용자와 관련된 이미지 패스를 무제한으로 저장한다는 가정하 정규화에 의거 설계된 테이블) A사용자 데이터를 INSERT 하여 데이터를 삽입후, 바로 B테이블에 이미지 패스를 삽입해야하는 두번의 INSERT 가 필요하게 됩니다. 이때, SELECT MAX(`id`) FROM `A` 를 통해 마지막 삽입된 ID 를 가져오게 해서, 해당 ID를 가지고 B테이블에 데이터를 삽입하겠죠. 하지만 1가지 문제가 있습니다. 다중 사.. 더보기
Apache HttpClient 라이브러리를 통한 HTTP 통신 JSON 파싱 (1/3) 네트워크 통신에는 크게 2가지 방법이 존재 합니다. - 소켓 통신 (Socket) - URL통신 (HTTP) 두 통신에 대한 자세한 사항은 인터넷에서도 많이 있으니 따로 설명하지 않겠습니다. 다만, 이번 강의에서 다룰 내용인 HTTP통신을 간단하게 살펴보자면 클라이언트와 서버간 비연결 지향 통신 방법 입니다. 또한, HTTP통신을 할때 클라이언트에서 서버로 데이터를 요청 방법에는 크게 GET, POST 두가지 방식이 존재합니다. GET, POST 두가지 방식 모두, 클라이언트에서 서버로 데이터를 요청(Request) 하고 서버로 부터 응답 (Responce) 를 받게되면 해당 연결을 종료 합니다. 자바 SDK 에서는 java.net 패키지 안에 URLConnection 및 자식 클래스인 HttpURLCo.. 더보기
롤API 라이브러리 (리그오브레전드 라이브러리) 공개 예정 롤 API 라이브러리 란? (League Of Legends Library) - 리그오브레전드 관련 앱(어플리케이션) 을 쉽게 제작할수 있도록 API 를 만들어둔 라이브러리 기능 - 전적 데이터, 소환사 관련 데이터(정보, 특성, 룬) 등 제공 사용방법 - 아래와 같은 직관적이고 쉽게 제공 됩니다. Summoner summoner = new Summoner(); summoner.getSummonerInfo("노깝데스", new SimpleSummonerListener() { @Override public void onSuccess(SummonerDto data) { Log.d("소환사 이름 : ", "" + data.name); } @Override public void onFail(int errorCo.. 더보기