소프트웨어 개발 165

조합(Combination) 알고리즘

조합은 의외로 재미있는 구조이다. 예를들어 지구멸망의 날 수많은 사람들 중 대충 네명만 뽑아서 데려가야 한다고 하자. 순서는 상관없고 그냥 대충 성별상관없이 뽑으면 된다. 그렇다면 조합은 이렇게 된다. 6,000,000,000C4 60억 지구 인구 중, 4명을 뽑는 조합이다. 이를 구하기위해서 고딩때는 60억인 n! 을 팩토리얼 한 숫자를 (r! * (n-r)!) 으로 나눠서 계산하고는 했다. 하지만, 팩토리얼도 상당한 계산의 부하가 걸리는 작업이다. 컴퓨터로 코딩을 하려면 매력이 떨어진다. 다만 실질적으로 고딩때 잘 안써먹던 조합을 구하는 공식이 있다. nCr = n-1Cr-1 + n-1Cr 어차피 손으로 풀려면 팩토리얼 분자 분모 작대기 긋고 해야한다. 다만 컴퓨터로 구하게 될때는 간단한 재귀식을 이..

순열(Permutation) 알고리즘

1,2,3 와 같은 숫자들이이 있다. 이것을 중복하지 않고 순서를 끌어내는 방법을 생각해보자 1-2-3 1-3-2 2-1-3 2-3-1 3-1-2 3-2-1 여섯가지 방법이 존재한다. 이제 숫자 네개인 1,2,3,4를 한번 섞어본다. 1-2-3-4 1-2-4-3 1-3-2-4 1-3-4-2 .... 4-3-2-1 이렇게 숫자를 뒤에서부터 섞으면, 훌륭한 순열의 모든 경우를 구할수 있다. 그렇다면 이를 알고리즘으로 어떻게 구현할 것인가? 은근히 골이 땡겨온다. 출처 : http://www.eandbsoftware.org/print-all-permutations-of-a-given-string/ 이럴때는 위의 그림을 한번 보다. ABC의 알파벳을 재귀적으로 푸는 방법이다. ABC 중 첫번째 알파벳을 뭘로 할..

⑬ 디자인 패턴(Design Pattern) - Visitor

방문자 패턴은, Composite 패턴과 크게 다르지 않다. 내부적으로 예를들어 정말 쉬운 예로, 파일 탐색기를 구현해볼수 있는데 파일 탐색기는 자꾸 여기저기 돌아댕기면서 필요한 파일을 찾아서 자기 호주머니에 그 파일들이 있는지 잘 적어놨다가 방문이 모두 끝나면 사용자에게 결과를 보여줄수 있다. 이 탐색기는 방문자(Visitor)이다. 그리고 이를 받아들이는 놈들은 어떻게 부르는지는 크게 중요하지는 않지만 여기서는 Host로 칭하자. 이 Host들은 방문자의 방문을 받아들이며 accept(Visitor v) 필요한 처리를 해준다. 일단 추상 클래스로 만들어진 Host를 한번 만들어보자. public abstract class Host{ public abstract String getName(); publ..

⑫ 디자인 패턴(Design Pattern) - Chain of responsibility

Chain of responsibility라는 이름에 답이 있다. 각자의 클래스는 어떤 일을 처리할수 있는데, 가끔씩은 내가 처리할수 없는 일도 있다. 이러한 경우 내 선에서 굳이 처리하지 않아도 되고 판단하에 다음 클래스를 태워서 판단하게 할수 있다. 만약, 은행대기열에서 짝수 대기열만 처리하는 은행원도 있으며 홀수만 처리하는 은행원도 있다고 치자. 대기열을 받기는 받는데, 내가 처리하여야 할 상황이 아니면 다른놈으로 넘겨버려야 한다. 이는 마치 회사 상황과도 같는데, 일단 특정 프로세스에 문의사항이 생긴 직원운 지가 찾아볼 생각은 안하고 대충 담당자일것 같은 사람에게 메일을 보내고 바로 처리해주거나 은근히 다른 담당자를 찾아서 포워딩해주기를 바란다. 이제 토스가 일어나는 순간이다. 문의를 받은 직원은..

⑪ 디자인 패턴(Design Pattern) - command

왜 굳이 메서드를 이용해서 쉽게 쉽게 가지않고, Command라는 인터페이스를 받아서 복잡하게 구성하는가? 클래스로 기능을 설정하면 이력등을 관리하기가 좋고, 나중에 필요한 기능 (ConcreteCommand)를 추가 하기가 쉽다. 단지 Command 만 상속받아서 구현을 하면 되니까. 커맨드 패턴은 기능을 실행하라고 하는 Sender와 요청을 받아들이는 Receiver가 완벽하게 분리되며 요청을 받아들이는 Receiver입장에서는 Sender의 인터페이스 따위는 알 필요가 없는 패턴이다. 위의 UML을 따라서 한번 구현한다. 코드는 시간이 없어서 위키피디아에 있는걸 그대로 따온다. Command 인터페이스는 모든 ConcreteCommand에서 상속을 받아 구현하기때문에 굉장히 간단하게 execute(..

⑨ 디자인 패턴(Design Pattern) - proxy

프록시란 참 여러군데서 많이 쓰인다. 인터넷에서는 우회하는데 쓰이기도 하고, 빠르게 내용을 가져올때 쓰기도 한다. 일단 디자인패턴에서 쓰이는 프록시는 빠르게 내용을 가져오고 정말 중요한게 있으면 본 서버에서 데이터를 가져오는 인터넷에서의 프록시와 개념이 같다. 일단, 어떠한 작업이 있다고 하자. 가벼운일과 무거운일. 가벼운일을 처리하는데는 프록시를 쓰고 무거운일을 처리하는데는 본 기능을 부른다. 이렇게 해서 괜히 헤비한 객체의 생성을 피할수 있다. 마치 회사에서의 사원의 모습같다. 온갖 짬처리를 하다가 제대로 큰건이 있으면 보고를 통해서 과장이 처리하게 되는것이다. 위에서 프록시는 지가 처리할수 있으면 처리하며(짬처리) 진짜 본체는 중요한 일만 골라서 하는 놈이다. 이 포스트에서는 단 세개의 직관적인 p..

① 디자인 패턴(Design Pattern) - facede

façade패턴. 정말 별게 아니다 위와같이, 복잡하나 연관성있는 메서드들을 다시 하나로 묶어서 제공하는 지극히 평범한 패턴이다. 이것은 특별한 패턴도 아니며, 그저 기능을 모아놓은 역할만 할 뿐이다. 이 포스팅에서 설명조차 하지 않겠다. 그냥 니가 쓰는 잡다한거 다 모아놓은 클래스로써, 나중에 최종으로 보이는 코드는 꽤나 깔끔하다.

쓰레드(Thread) 관련 메서드가 죄다 Deprecated 된이유.

쓰레드를 잠시 멈추거나 재개하고 싶을때, 정말 쉽사리 많이쓰던 메서드는 stop(), suspend(), resume()이다. 다만 이 메서드들은 현재 deprecated되어서 사용이 권장되지 않는다. 쓰레드를 이용한 복잡한 동시성 프로그램을 파악가능하고 완벽하게 만들기에는 거의 불가능에 가깝다는게 여러사람의 말이다. 스칼라에서도 마찬가지 개념이 전반적으로 깔려있지만, 쓰레드의 메서드가 deprecated된 이유는 자명하다. 안전하지 않기 때문이다. 그 전에 쓰레드의 개념에 대해 알 필요가 있다. 쓰레드는 쉬운개념이다. 우리가 동시에 두개의 일을 프로그램에게 시키고 싶을때 쓰레드를 사용한다.웹 프로그램 같은 경우 동시에 여러 사용자가 서버에 접속해서 일을 하게 되는데, 이를 효과적으로 동시에 처리를 해주..

② 디자인 패턴(Design Pattern) - Strategy

http://hyeonstorage.tistory.com/146 솔직히 위의 글보다 잘 쓰기는 쉽지않다. 아주 잘써놨다. Strategy패턴은 굳이 프로그램적으로 구현할 필요도 없다. 그냥 간단하다. 그냥 공통의 메서드가 있는 인터페이스를 상속받아서 그 클래스에서 구현하는 것이다. 굳이, 메서드를 하나의 클래스에 속하게 하지말고 위처럼 사용하면 된다. 다만, 스칼라에서는 다르다. 구현가능한 trait가 존재하고 있기 때문에 귀찮게 인터페이스를 상속받아 사용하지 말고, trait를 이용해서 여러개를 끼워버리면(mix-in) 된다.