카테고리 : 코드,그냥 재미로
2007/12/14 shuffle을 이용한 로또생성기
2007/12/12 로또생성기 java로 만들어보기 [2]
네이버 Open API Cafe에서 검색 API의 Java Client 모듈을 보게 되었습니다.
http://insford.tistory.com/116
위의 모듈을 참고해서 같은 역할을 하는 모듈을 다르게 구현해봤습니다.
특징은 아래와 같습니다.
(RSSDigester , Channel , Item)
open API key값은 필수값이므로 OpenApiClient클래스의 생성자의 파라미터로 받았습니다. 대신 키 값이 없이 이 객체가 생성될 수 없도록 default 생성자는 private으로 돌려놨습니다.
첨부한 파일은 이클립스에서 Dynamic Web Project로 생성한 폴더를 압축한 것입니다. 테스트 실행 서버는 Tomcat 5.5를 사용했습니다. Eclipse WTP가 설치되어 있는 환경이면 실행이 가능합니다. 그리고 enum을 썼기에 Java5이상이어야 합니다.
Open API에 대한 자세한 사용법은 http://openapi.naver.com/index.nhn 를 참조하시면 됩니다.
전체 소스와 라이브러리 다운받기 : openApiTest.zip
package openapiclient;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;import org.apache.commons.digester.rss.Channel;
import org.apache.commons.digester.rss.RSSDigester;public class NaverSearchClient {
private static final String OPEN_API_URL = "http://openapi.naver.com/search";
private String key;
@SuppressWarnings("unused")
private NaverSearchClient(){};
public NaverSearchClient(String key){
this.key = key;
}
public Channel search(RequestParameter param) throws Exception{
RSSDigester digester = new RSSDigester();
URL requestUrl = getRequestUrl(param);
InputStream is = requestUrl.openConnection().getInputStream();
return (Channel) digester.parse(is);
}private URL getRequestUrl(RequestParameter param) throws UnsupportedEncodingException, MalformedURLException {
StringBuffer serverUrl = new StringBuffer(OPEN_API_URL);
serverUrl.append("?target=" + param.getTarget());
serverUrl.append("&key=" + key);
serverUrl.append("&start=" + param.getStart());
serverUrl.append("&display=" + param.getDisplay());
serverUrl.append("&query=" + URLEncoder.encode(param.getQuery(), "UTF-8"));
if(param.getSort()!=null) serverUrl.append("&sort=" + param.getSort());
return new URL(serverUrl.toString());
}
}
package openapiclient;
public class RequestParameter {
public enum Category{
KIN,BLOG,CAFE,DOC,WEBKR,BOOK, SHOP, ENCYC,
KRDIC, JPDIC, ENDIC, NEWS, LOCAL, VIDEO,IMAGE;
public String toString(){
return super.toString().toLowerCase();
}
}private Category target;
private String sort;
private int start;
private int display;
private String query;// getter and setters 생략
}
JSTL을 함께 사용해서 찍어본 예제입니다. http://openapi.naver.com/index.nhn 에 가셔서 API key를 발급 받으시고 소스 중간에 밑줄로 표시된 부분에 그 값을 넣으시고 돌려주시면 됩니다.
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="openapiclient.RequestParameter" %>
<%@ page import="openapiclient.NaverSearchClient" %>
<%@ page import="org.apache.commons.digester.rss.Channel" %>
<%
String KEY = "????"; // Open API key값을 넣으세요
NaverSearchClient client = new NaverSearchClient(KEY);
RequestParameter param = new RequestParameter();
param.setDisplay(10);
param.setStart(1);
param.setQuery("미역국");
param.setTarget(RequestParameter.Category.NEWS);
Channel result = client.search(param);
result.render(System.out); // 콘솔에 받아온 내용을 확인삼아 찍어봄
request.setAttribute("result", result);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Naver Open API를 이용한 검색</title>
</head>
<body>
<c:forEach var='item' items='${result.items}'>
<p>
<a href="${item.link}"> ${item.title} </a> <br/>
${item.description}
</p>
</c:forEach>
</body>
</html>
# by | 2008/05/16 17:22 | 코드,그냥 재미로 | 트랙백 | 덧글(0)
바로 아래 포스팅에서 간단한 로또생성기 코드를 만들어봤었죠. (http://benelog.egloos.com/1642193).
같은 문제에 대한 dak99님의 풀이(http://dak99.egloos.com/3529054)를 보고 다시 다른 버전을 만들어봤어요.
shuffle을 이용해도 Collections의 메소드들을 불러서 쓰니 코드가 별로 안 복잡해 지는군요.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class LottoMachine {
public static void main(String[] args) {
List<Integer> numberCards = new ArrayList<Integer>();
for(int i=1;i<=45;i++) numberCards.add(i);
Collections.shuffle(numberCards);
List<Integer> picked = numberCards.subList(0,5);
Collections.sort(picked);
System.out.println(picked);
}
}
변수이름은 아직 마음에 안 드는데 더 고민할 시간이 없어서 그냥 올려요. n이 클수록 속도차이가 클겁니다.
# by | 2007/12/14 19:02 | 코드,그냥 재미로 | 트랙백 | 덧글(0)
javaservice.net에서 보고 저도 한번 짜봤어요.
간단하게 짠다면 일단 저는 아래와 같이 해보고 싶어요. (generics와 auto-boxing을 활용했으니 java5)
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;
public class LottoMachine1 {
public static void main(String[] args) {
SortedSet<Integer> pickedNumbers = new TreeSet<Integer>();
Random random = new Random();
while(pickedNumbers.size()< 6) pickedNumbers.add(random.nextInt(45)+1);
System.out.println(pickedNumbers);
}
}
그리고 아마 프로젝트에서 짠다면, 알아보기 쉽게 하기 위해서 아래와 같이 바꾸었을 것 같아요.
import java.util.Random;
import java.util.SortedSet;
import java.util.TreeSet;public class LottoMachine {
private int maxNumber;
private int pickedNumbersCount;
private Random random = new Random();
public LottoMachine(int maxNumber, int pickedNumbersCount){
this.maxNumber = maxNumber;
this.pickedNumbersCount = pickedNumbersCount;
}public void pick() {
SortedSet<Integer> pickedNumbers = new TreeSet<Integer>();
while(pickedNumbers.size() < pickedNumbersCount ){
int pickedNumber = random.nextInt(maxNumber)+1;
pickedNumbers.add(pickedNumber);
}
System.out.println(pickedNumbers);
}
public static void main(String[] args) {
LottoMachine machine = new LottoMachine(45,6);
machine.pick();
machine.pick();
}
}
짧은 코드보다는 알아보기 좋은 코드를 짜고 싶다는 말을 할려고 고쳐봤는데..글쎄요; 바뀐 코드가 더 눈에 잘 들어온다는 확신이 들지는 않네요 ^^;
◀ 이전 페이지 다음 페이지 ▶