
In this blog, there are many things that I did and got or get to know, while I am developing applications. I write the articles to remember in mind and I hope they will be helpful for the visitors who read them.
2013년 9월 3일 화요일
2013년 6월 8일 토요일
C++ Programming Language 4th Edition
드디어 왔다!! The C++ Programming Language 4th Edition.
한달 전쯤 Amazon에서 사전 구매신청했는데 7월달에 온다던 책이 몇 일전에 왔다. 아이 좋아라. The C++ Programming Language Special Edition을 너무 재미있게 봤는데 이 책도 너무 기대된다.
Special Edition은 단순히 언어에 대한 설명에만 치우치지 않고 설계와 개발 방법을 실무적 관점에서 제시해 주었다. 조금 과장되게 말하면 C++와 관련된 다른 서적은 읽을 필요가 없을 정도로 내용이 훌륭했다.
오랜 시간을 들여 만들어진 새로운 C++ 표준(C++11)에 대한 내용을 Creator의 시각으로 담고 있다는 것만으로도 빨리 보고 싶게 만드는 책인 것 같다.

2013년 5월 26일 일요일
HttpURLConnection에서 301, 302 오류 발생 시
Redirection Exception
java.net 패키지 내 HttpURLConnection 클래스를 이용하여 HTTP로 데이터를 받을 때 HTTP_OK (200)가 아닌 HTTP_MOVED_TEMP (302), HTTP_MOVED_PERM (301) 예외가 발생할 때가 있다. 두 가지 형태로 처리할 수 있을 거 같은데 하나는 Exception을 던져 더 이상 진행하지 못하게 하는 것이고 다른 하나는 Redirect된 URL을 새로 받아 처리하는 방식이다.
Redirected URL 수용하기
Redirect된 URL을 새로 받아 처리하려면 HttpURLConnection의 헤더에서 "Location" 정보를 받아 다시 Connect 한다.
public InputStream GetHTTPInputStream(URL url) throws Exception
{
int redirectedCount = 0;
while( redirectedCount <= 1 ) // Redirection 1번 허용
{
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setConnectTimeout(10000); //< 연결 제한시간(단위 : msec, 0은 무한)
httpConn.setReadTimeout(0); //< 읽기 제한시간(단위 : msec, 0은 무한)
httpConn.setUseCaches(false); //< 캐시 사용 여부 설정(기본 설정: true)
// URL을 요청하는 방법 설정 (GET|POST|HEAD|OPTIONS|PUT|DELETE|TRACE, 기본 설정: GET)
httpConn.setRequestMethod("GET");
int resCode = httpConn.getResponseCode();
if( resCode == HttpsURLConnection.HTTP_OK )
{
return httpConn.getInputStream();
}
// Redirection 발생하는 경우
else if( resCode == HttpsURLConnection.HTTP_MOVED_TEMP
|| resCode == HttpsURLConnection.HTTP_MOVED_PERM )
{
// Redirected URL 받아오기
String redirectedUrl = httpConn.getHeaderField("Location");
url = new URL(redirectedUrl);
}
// 이외의 오류는 Exception 처리
else
throw new MalformedURLException("can not connect to the url [" + url.toString() + "] Code: " + resCode);
++redirectedCount;
}
}

2013년 4월 29일 월요일
Java Swing Example
Java Swing Component를 이용하여 GUI를 만들려면 다음 사이트 참고!
Component 별로 Example이 잘 정리되어 있음.
Using Swing Components: Examples
Component 별로 Example이 잘 정리되어 있음.

2013년 4월 3일 수요일
Java enum의 실체
들어가기
enum! 키워드가 같기에 C++에서와 같이 생각했었다. 지난번 글에서도 이 생각이 깔려 있기에 Java의 enum type도 단순한 줄만 알았다. 기능이 조금 더 붙어서 설명과 같은 부가적인 정보를 추가로 정의해 쓸 수 있는 줄 알았다. 그런데 샘플 코드들을 보면 여기서 끝이 아닌 것 같다는 생각이 뽀록뽀록 든다...
Effective C++ 시리즈 정말 좋은 책이다. 다른 많은 사람들도 그렇게 생각하는지 Effective 시리즈는 언어별로 있는 듯 하다. 물론 저자는 다 틀리다. 예전에 Effective C# 이란 책도 있었는데 Java에도 Effective Java란 책이 있어 구입했다. Joshua Bloch가 지었으니 내용은 뭐 말할 필요 없겠지.
아직 다 보진 못했지만, 이 책 세 번째 항목에 enum으로 구현한 싱글톤 패턴에 대한 내용이 나온다. "enum으로 싱글톤을 구현하다니 말이되나?" 라고 생각했었는데 이 부분을 보고 Java의 enum에 대한 실체를 다시 생각하게 됐다.
Java의 enum
다음과 같이 정의된 enum이 있다고 하자.
public enum ValueType
{
Unknown
, Text
, Number
, DateTime
;
}
switch문에서 사용할 때는 차이가 있지만, 위 정의는 다음과 같이 동작하지 않나 싶다.
public class ValueType
{
public final static Unknown = new ValueType();
public final static Text = new ValueType();
public final static Number = new ValueType();
public final static DateTime = new ValueType();
}
컴파일러가 위와 같이 유일한 객체를 만드는 것이다. 위 예에서는 별도의 생성자가 없으므로 기본 생성자를 이용하고 있다(정의된 생성자가 없으면 Java 컴파일러가 기본 생성자는 만듬). 만약, 생성자가 다른 형태로 구현되어 있다면 그 형태를 맞춰야 한다. 다음의 예를 보자.
public enum ValueType2
{
Unknown("unknown")
, Text("string")
, Real("real")
, DateTime("datetime")
;
private final String _description;
private ValueType(String description)
{
this._description = description;
}
public String getDescription()
{
return this._description;
}
}
문자열 하나를 인수로 받는 생성자가 정의되어 있다. 이런 경우 다음과 같이 정의하면 컴파일러가 불만을 토로한다.
public enum ValueType2
{
Unknown
, Text
, Number
, DateTime
;
... (후략) ...
}
이런 현상을 종합해 보면, Java의 enum은 컴파일러가 만드는 유일 객체의 집합이란 것이다.
enum을 이용한 싱글톤 클래스
enum만 보면 굉장히 어색해 보이지만 Java 컴파일러가 enum을 처리하는 것을 생각해 보면 enum을 이용하여 싱글톤 클래스를 만드는 것이 전혀 어색하지 않다. 오히려 언어적으로 객체가 유일하도록 보장하는 것이니 가장 확실한 싱글톤 클래스를 만드는 것이 아닌가 싶다.
다음은 enum을 이용하여 만든 싱글톤 클래스의 예이다.
public enum ProgramSetting
{
Instance; //< 유일 객체
/// 속성 저장 멤버
private final HashMap<String, String> _properties;
private ProgramSetting()
{
_properties = new private HashMap<String, String>();
}
public String getProperty(String key) { ... }
public void setProperty(String key, String value) { ... }
...
}
사용법은
...
ProgramSetting.Instance.getProperty(...);
ProgramSetting.Instance.setProperty(...);
...
Java, 참~ 재밌다.

피드 구독하기:
글 (Atom)
