'나만의 작업'에 해당되는 글 164건

  1. CouchDB 관련 링크 2010/02/09
  2. 테스트 코드 작성 관련 링크 2010/02/08
  3. 구글 첫 페이지.... (11) 2009/12/04
  4. 한국 구글 검색 결과 페이지의 'HOT 토픽' (4) 2009/11/27
  5. throw new UnsupportedOperationException() (4) 2009/10/30
  6. [Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. 2009/10/30
  7. [Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. (2) 2009/10/27
  8. [Effective Java] 15. 가변성을 최소화하자. (2) 2009/10/19
  9. [Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. (2) 2009/10/15
  10. [CouchDB] Apache CouchDB 0.10.0 이 나왔답니다. (2) 2009/10/14
  11. [CouchDB] HTTP view API 2009/09/29
  12. [Effective Java] 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. 2009/09/28
  13. [Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. (3) 2009/09/24
  14. [Effective Java] 5. 불필요한 객체 생성을 피하자 (4) 2009/09/23
  15. [Windows] Vista에서 명령프롬프트창의 글꼴 바꾸기 (3) 2009/09/17
  16. [Effective Java] 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자 2009/09/17
  17. Eclipse Galileo에 어떤 프로젝트가 있을까? (2) 2009/08/26
  18. [Effective Java] 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. (2) 2009/08/26
  19. [Mac] Mac 에서 화면 캡쳐 단축키 (4) 2009/08/06
  20. [Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. (2) 2009/07/31

CouchDB 관련 링크

Posted at 2010/02/09 09:25// Posted in 나만의 작업

공식 Apache CouchDB homepage

CouchDB: The Definitive Guide
http://books.couchdb.org/relax/

Damien Katz Relaxing on CouchDB
CouchDB에 대해 Damien Katz(CouchDB를 만든)와 인터뷰한 내용.


웹 문서들

얼랭으로 구현된 문서 기반 분산 데이터베이스, CouchDB
http://www.dbguide.net/know/know102001.jsp?mode=view&pg=1&idx=3468

문서기반 분산 데이터베이스 CouchDB
http://xeraph.egloos.com/4617633

CouchDB implementation
http://horicky.blogspot.com/2008/10/couchdb-implementation.html

Programming CouchDB with Javascript (TODO application)
http://jan.prima.de/~jan/plok/archives/108-Programming-CouchDB-with-Javascript.html

Interactive CouchDB
This is a CouchDB emulator/visualizer written in 100% JavaScript, which implements key concepts like collation, map/reduce and incremental reduce. 
It also acts as a 2-minute CouchDB tutorial. No documents were harmed in this process. 
http://labs.mudynamics.com/wp-content/uploads/2009/04/icouch.html

CouchIn15Minutes
15분만에 CouchDB 시작하기(DB 생성, Document 생성, View 생성등 맛보기)
http://wiki.apache.org/couchdb/CouchIn15Minutes

Markov Chains using CouchDB's Group Reduce
http://jchrisa.net/drl/_design/sofa/_show/post/markov_chains_using_couchdb_s_g

CouchDB MapReduce example: word count
http://jchrisa.net/drl/_design/sofa/_show/post/couchdb_mapreduce_example

Couchdb Vs MySQL insert performance test data of the speed test
http://www.codeweblog.com/couchdb-vs-mysql-insert-performance-test-data-of-the-speed-test/


Jchris's toast at master - GitHub
http://github.com/jchris/toast/tree/master

CouchDB & CouchApp Managing Design Documents
http://www.blog.dannygagne.com/?p=43

database-queries-the-couchdb-way
http://sitr.us/2009/06/30/database-queries-the-couchdb-way.html


Slide
Tag CouchDB

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

테스트 코드 작성 관련 링크

Posted at 2010/02/08 14:46// Posted in 나만의 작업

JUnit Test Case
JUnit 을 이용하여 Unit Test Case 를 작성하고 실행하는 방법을 안내한다.

http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:test_case

DB support
데이터베이스 관련 단위 테스트를 수행하기 위한 Test Case 를 작성하고 실행하는 방법을 안내한다.

http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:dev:tst:db_support


How to test spring session or request scope beans
http://thomaswabner.wordpress.com/2009/04/27/how-to-test-spring-session-or-request-scope-beans/


기타
Spring DAO 프레임워크 초보자를 위한 글

이올린에 북마크하기(0) 이올린에 추천하기(0)

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

구글 첫 페이지....

Posted at 2009/12/04 10:20// Posted in 나만의 작업/Web

검색하려고 구글에 들어간 순간 깜짝놀랐다.
여기 구글페이지...맞나? 

한국 구글페이지에선 심플한 매력을 잃은 것 같다. 
씁~쓸~~하다..




이올린에 북마크하기(0) 이올린에 추천하기(0)

'나만의 작업 > Web' 카테고리의 다른 글

구글 첫 페이지....  (11) 2009/12/04
Tag 구글, 토픽
  1. 2009/12/04 13:01 [Edit/Del] [Reply]
    희안하네... 난 예전 그대로인데...-,.-;;;
  2. 2009/12/04 13:49 [Edit/Del] [Reply]
    나의 구글은 언제나 브라우져의 검색창이 시작페이지..
    • 2009/12/04 15:52 [Edit/Del]
      그럼 못보셨겠군요.
      전 손에 익어서 브라우저 창에 있어도 주소창에 굳이 goo 이렇게
      치고 있다는..ㅎㅎ
  3. 2009/12/05 17:49 [Edit/Del] [Reply]
    저도 이렇게 나오네요. 심플함이 날아가니 구글같다는 생각이 안들어요.
  4. 2009/12/06 23:18 [Edit/Del] [Reply]
    미국 google 다음 버젼 페이지는... 오히려 더 없어지고 있던데...ㅎㅎ 그것도 어색하더라는... 역시 모든건 절충~~ 해야...
    • 2009/12/07 10:52 [Edit/Del]
      구글.com은 정말 심플해지고 있군요..
      검색창과 버튼 두개....
      전 추가도 좋고 제거도 좋지만, 이전글에도 썼었는데 환경설정에서 커스텀하게 바꿀 수 있었으면 좋겠어요..
      그런 복잡한 페이지를 싫어하는 사람에겐
      갈 곳이...없거든요...^^;;;; 물론 검색때문에 구글을 쓰는것도 있지만...
  5. [NC]...YellOw
    2009/12/09 17:30 [Edit/Del] [Reply]
    아.. 나도 모르게 中 초미니 스커트 발톱녀 클릭했네요 ㅡㅡ
    • 2009/12/10 11:34 [Edit/Del]
      ㅋㅋㅋ [NC]...YellOw님의 이름으로.. 그러시면 안되죠..
      얼마전에 올만에 베냇들어갔다가 요환님 팬 만나서
      스타는 안하고 계속~~ 임진록 얘기만 했다는..ㅋㅋ
      [NC]...YellOw님 화이팅!
    • 2009/12/14 17:21 [Edit/Del]
      예전에 한참 NC 채널가서 toya님이랑 게임 많이 했었는데... 반갑네요...

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


최근에 추가된 한국 구글 검색 결과 페이지에 나타나는 오른쪽 관련검색 밑의 HOT토픽!



스폰서 링크는 눈에 거의 들어오지 않아서 별 문제 없는데 가십거리 위주로 올라오는 HOT 토픽이 정말 맘에 안든다.

난 누가 성형했는지 관심없고, 품절녀의 블로그도 관심없고, 천정명이 전역해서 뭐라고 했는지도 관심없다.

매번 낚을려고 하는 기사들과 광고들을 극도로 싫어해서 그러는지 모르겠지만,
검색 결과를 보다보면 짧게 함축된 단어에 궁금하기도 하여 누르고 싶지만
누르고 나면 낚시성에 별일 아닌일을 크게 와전하는 일도 많아서 괜히 시간만 정말 아깝다.
거기에 집중력을 흐트린다.

안보이면 정말 궁금하지 않을것을,  

이 서비스 자체가 나쁘다고는 생각하지 않는다.
나와 반대로 현재 이슈가 되는 일에 관심이 많은 사람들에겐 참 유용한 서비스일 것이다.

다만, 검색 환경설정에서 HOT토픽을 보이지 않게 설정할 수 있었으면..
내가 못찾아서 그런것일수도 있지만, 내눈엔 안보인다. 보이지 않게 설정하는 방법이..





스샷에는 없지만 밑의 추천검색어, SearchWiki까진 있는데..검색환경설정 페이지를 보면 없다~~~~~~ㅠㅠ



나에게 HOT토픽 서비스는 전에 블로깅한 따라다니는 광고와 같은 효과까진 아니지만,
빼고싶다~정말~

요즘 내가 찾은 방법은 한국 구글 페이지가 아닌 영문 구글 페이지를 이용한다.
영문 구글페이지는 전과 같이~ 깨끗히 검색결과만 나오니깐~

구글토론에 건의사항으로 올렸긴 하지만 
언제 답변이 달릴지... 내가 말한다고 되는것도 아니고.. 휴.. 그냥 여기서라도 한탄을 해본다...

이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/11/30 18:02 [Edit/Del] [Reply]
    특히나 품절녀.. 정말 맘에 안들더군요 -_-;;;
  2. 다짜
    2009/12/14 14:18 [Edit/Del] [Reply]
    네 저도 그래서 검색해봤는데, 여기가 검색되더군요 --;;

    쌩뚱맞게 거지같은 기사거리가 나와있어서 기분이 안좋아요

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

throw new UnsupportedOperationException()

Posted at 2009/10/30 10:23// Posted in 나만의 작업/Java

자동생성되는 메소드에 throw new UnsupportedOperationException()넣기

 
이클립스에서 제공해주는 코드 템플릿을 이용하여, 인터페이스를 만들고 그 구현체를 퀵픽스를 통해 메소드를
자동생성했을 때 리턴값이 있을 경우 컴파일에러가 일시적으로 나지 않게 해주기 위해서 return null; 이나 
return 0; 이나 임시땜빵으로 이런작업을 해주는데 이게 귀찮을 때

throw new UnsupportedOperationException()을 코드 템플릿을 이용하여 넣어주는 방법

이클립스라면 Preference – Java – Code Style – Code Templates 안에 Code/Method Body에 이를 추가해주면 된다.


자꾸 까먹어서, 링크 해 둡니다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. 2009/10/31 00:25 [Edit/Del] [Reply]
    음.. 내 경우도 자꾸 까먹어서 링크하거나 글로 남겨두곤 하니.. ㅎㅎㅎ

    이클립스.. 오랫만에 본다+_+

    잘 지내고 있지? 환절기 감기 조심하구~ (신종플루보다 독감이 더 무서워...^^)

    행복한 11월 맞이하렴~
  2. [NC]...YellOw
    2009/11/01 22:00 [Edit/Del] [Reply]
    행복한 11월 맞이하세요~

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자.
 
제네릭을 사용하면 각 컬렉션에 어떤 타입의 객체를 허용할 것인지 컴파일러에게 알려주게 되며, 캐스트 코드를 컴파일러가 자동으로 만들어준다. 또한 잘못된 타입의 객체를 추가하려고 하면 컴파일 시에 알려준다.
 
하나 이상의 타입 매개변수(type parameter)를 선언하고 있는 클래스나 인터페이스를 제네릭 클래스, 또는 제네릭 인터페이스라고 한다.
자바 1.5를 기준으로 List 인터페이스에는 하나의 타입 매개변수로 E가 있는데, 여기서 E는 List에 저장되는 요소의 타입을 나타낸다.
 

각 제네릭 타입에서는 원천(raw) 타입을 정의하는데 원천 타입이란 실 타입 매개변수가 없이 사용되는 제네릭 타입의 이름을 말한다.
예를 들어, List<E>에 대한 원천 타입은 List로써, 마치 타입 선언에서 제네릭 타입 정보가 지워진 것처럼 동작하는데, 실제로는 제네릭이 추가되기 전에 인터페이스 타입 List가 했던 것과 같은 방법으로 동작한다.
 
앞으로 작성하는 새 코드에 List와 같은 원천 타입을 사용하면 안 되지만, List<Object>처럼 어떤 객체도 List에 추가 할 수 있는 매개변수화 타입은 사용해도 좋다. 그렇다면, 원천 타입인 List와 매개변수화 타입인 List<Object>의 차이는 무엇일까? 전자는 제네릭 타입의 검사가 생략되는 반면, 후자는 어떤 타입의 객체도 저장할 수 있다는 것을 컴파일러에게 명시적으로 알려주려는 것이다. 따라서 List<String> 타입은 List의 매개변수로 전달할 수 있지만,  List<Object>의 매개변수로는 전달할 수 없다. 제네릭에는 서브 타입 규칙이 있어서 List<String>은 원천 타입인 List의 서브타입이지만 매개변수 타입인 List<Object>의 서브타입은 아니다.
그런이유로, List와 같은 원천 타입을 사용하면 타입의 안전성을 상실하게 되지만, List<Object>과 같은 매개변수 타입을 사용하면 그렇지 않다.
 
타입 안전의 대안으로 언바운드 와일드 카드(unbound wildcard type)을 제공하고 있다. 제네릭 타입은 사용하고 싶지만 실 타입 매개변수를 모르거나, 어떤 타입이든 관계없다면 타입 대신 물음표(?)를 사용하면 된다. 예를 들어 제네릭 타입 Set<E>의 언바운드 와일드 카드 타입은 Set<?>.
이것은 어떤 타입의 객체(Set포함)도 저장할 수 있는 가장 보편화된 매개변수화 Set 타입이다.
 
언바운드 와일드 카드 타입인 Set<?>과 원천 타입인 Set의 차이는 무엇일까? 와일드 카드 타입은 안전하고 원천 타입은 그렇지 않다.
원천 타입의 컬렉션에는 어떤 타입의 요소도 추가할 수 있지만, 해당 컬렉션의 타입불변성을 쉽게 무너뜨릴 수 있다.
 
향후에 작성하는 새 코드에는 원천 타입을 사용하지 않는다는 규칙에도 두 가지 예외가 있는데, 런타임 시에는 제네릭 타입의 정보가 없어진다는 것 때문에 가능하다.
첫번째로, 원천 타입은 클래스 리터럴(class literal)의 형태로 사용해야 한다. List.class, String[].class, int.class는 모두 적법하지만, List<String>.class, List<?>.class는 허용되지 않는다.
두번째로, instanceof 연산자와 관련. 제네리 타입의 정보는 런타임시에 없어지므로 언바운드 와일드 카드 타입이 아닌 다른 매개변수화 타입에 대해 instanceof 연산자를 사용할 수 없다. 원천 타입 대신 언바운드 와일드 카드 타입을 사용할 때는 instanceof 연산자의 동작에 영향을 주지 않으며, 이 경우 <>와 물음표(?)는 아무 의미가 없다. 제네릭 타입과 함께 instanceof 연산자를 사용할 때는 다음과 같이..
 
// Legitimate use of raw type - instanceof operator
if (o instanceof Set) { // Raw type
Set<?> m = (Set<?>) o; // Wildcard type
...
}
 
o가 Set타입이라는 것이 결정되면, o의 타입을 원천타입(Set)이 아닌 언바운드 와일드 카드 타입(Set<?>)으로 캐스팅해야 한다. 그리고 이런 캐스팅은 타입을 확인하고 하는 것이므로 컴파일 시 경고 메시지가 나오지 않을 것이다.


이올린에 북마크하기(0) 이올린에 추천하기(0)

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자.
 

 // Constant interface antipattern - do not use!
public interface PhysicalConstants {
// Avogadro's number (1/mol)
static final double AVOGADROS_NUMBER = 6.02214199e23;
// Boltzmann constant (J/K)
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// Mass of the electron (kg)
static final double ELECTRON_MASS = 9.10938188e-31;
}
 
상수 인터페이스 패턴은 인터페이스를 형편없이 사용한다. 향후 배포판에서 그 상수를 더 이상 사용할 필요가 없어서 클래스를 변경하더라도 바이너리 호환성을 유지하기 위해 여전히 그 상수 인터펭스를 구현해야 한다.
 
상수를 외부에 제공하고 싶을 때 적절한 방법

만일 어떤 상수가 기존 클래스나 인터페이스와 밀접하게 연관된다면, 그 상수를 해당 클래스나 인터페이스에 추가해야 한다.
예. Integer나 Double과 같은 모든 박스화 기본형 클래스에서는 MIN_VALUE와 MAX_VALUE 상수를 외부에 제공한다.
만일 상수가 열거타입(enumerated type)의 멤버가 되는 것이 가장 좋다면 enum타입으로 한다.
그렇지 않으면, 인스턴스를 생성할 수 없는 유틸리티 클래스에 상수를 두어야 한다.
 
//상수 유틸리티 클래스
package com.effectivejava.science;
public class PhysicalConstants {
private PhysicalConstants() { } // Prevents instantiation
public static final double AVOGADROS_NUMBER = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS = 9.10938188e-31;
}
 
유틸리티 클래스의 경우, 클라이언트가 상수를 사용할 때 상수 명 앞에 그 유틸리티 클래스 명을 붙여야 한다. PhysicalConstants.BOLTZMANN_CONSTANT 와 같이.
만일 유틸리티 클래스의 상수를 무척 많이 사용한다면, static import문을 사용해서 상수 명 앞에 클래스 명을 붙이지 않게 하면 된다.
이렇게..
 
import static com.effectivejava.science.PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
...
// Many more uses of PhysicalConstants justify static import
}
 
결론, 인터페이스는 타입을 정의할 때만 사용해야 한다. 상수를 외부에 제공하기 위해 사용하면 안된다.


이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/10/28 21:34 [Edit/Del] [Reply]
    오늘도 열공하시는군여.. 화이팅~
    근데 언제 쏘는건가요? ㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


[Effective Java] 15. 가변성을 최소화하자.

불변(immutable) 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스이다. 각 인스턴스가 갖는 모든 정보는 그것이 생성될 때 제공되며 객체로 살아있는동안 변경되지 않는다. 자바의 불변 클래스는 String, 박스화 기본형(boxed primitive) 클래스, BigInteger, BigDecimal 등등이 있다.
불변 클래스는 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 또한 에러 발생이 적으며 보안이나 사용 측변에서 더 안전하다.
 
불변 클래스 만들때 다섯 가지 규칙

1) 객체의 상태를 변경하는 그 어떤 메소드(변경자라고 하는)도 제공하지 않는다.

2) 상속을 할 수 없도록 하자. 일반적으로는 클래스를 final로 지정하면 상속을 막을 수 있다.

3) 모든 필드를 final로 지정한다. 새로 생성된 불변 클래스 인스턴스의 참조가 스레드간의 동기화를 하지 않고 하나의 스레드에서
다른 스레드로 확실하게 전달되도록 하는데도 필요하다.

4) 모든 필드를 private으로 지정한다. 필드로 참조되는 가변 객체를 클라이언트가 직접 접근하여 객체의 내용을 변경하는 것을 막기위함이다. 불변 클래스의 public final필드에서 기본형 데이터 값이나 불변 객체의 참조를 갖는 것이 기술적으로는 가능하다. 그러나 향후에 그 클래스의 내부 구조를 변경하기 어렵기 때문에 바람직하지 않다.

5) 가변 컴포넌트의 직접적인 외부 접근을 막자. 만일 가변 객체를 참조하는 필드가 클래스에 있다면, 그 클래스의 클라이언트가 해당 가변 객체의 참조를 획득할 수 없게 하자. 즉, 클라이언트가 주는 객체 참조로 그런 필드를 초기화해서는 절대 안되며, 접근자 메소드에서 객체 참조를 반환해도 안된다. 그대신 생성자와 접근자 메소드 및 readObject메소드에서 해당 객체의 방어 복사본(defensive copy)을 만들어 사용하도록 하자.


이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/10/20 14:15 [Edit/Del] [Reply]
    구구절절 옳은 말인거 같네요. ^.~

    곧 겨울이 오려나봐요. 날씨가 점점.. 흑..

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자.


Cloneable 인터페이스는 복제를 허용하는 객체라는 것을 알리는 목적으로 사용하는 믹스인 인터페이스(mixin interface)

아무런 method도 없는 Cloneable 인터페이스는 어디에 쓰이는 것일까?

이 인터페이스는 Object 클래스의 protected 메소드인 clone의 행동 방식을 규정한다. 만약, clone 메소드가 호출된 객체가 Cloneable 타입이라면, Object.clone 메소드는 이 객체의 모든 필드를 그대로 복사한 복제본을 리턴한다. 하지만 Cloneable 타입이 아니라면 CloneNotSupportedException을 던진다.

java.lang.Object.clone의 명세(Specification)

this 객체의 복제본을 생성하여 리턴한다. "복제본"의 정확한 의미는 this 객체의 클래스마다 달라질 수 있다. 

보통 모든 객체 x에 대하여, 다음 식
x.clone() != x
는 true 이고, 또 다음 식
x.clone().getClass() == x.getClass()

도 true이지만 반드시 지켜야 할 사항은 아니다. 또 다음 식

x.clone().equals(x)

도 true이지만 반드시 지켜야 할 사항은 아니다. 어떤 객체를 복제할 때 보통 이 객체 클래스의 새로운 인스턴스는 반드시 생성해야 하지만, 내부 데이터 구조도 역시 복제해야 할지도 모른다. 이 메소드는 어떤 생성자도 호출하면 안 된다.


만일 어떤 클래스로부터 상속받는 서브 클래스를 만들고 그 서브 클래스에서 super.clone을 호출하면, 서브 클래스의 인스턴트가 복제되어 반환될거라고 생각할 것이다.
이 경우 슈퍼 클래스에서 그렇게 할 수 있는 유일한 방법은, 자신의 clone 메소드에서 super.clone을 호출하여 얻은 객체를 반환하는 것이다.

만일, 슈퍼 클래스의 clone 메소드에서 또 다시 super.clone을 호출하지 않고 생성자를 호출하여 생성된 객체를 반환한다면 잘못된 클래스(타입)의 객체가 될 것이다.

그러므로 final이 아닌 수퍼 클래스의 clone 메소드를 오버라이드 할 경우, 서브 클래스의 clone에서 반드시 super.clone을 호출하여 얻은 객체를 반환해야 한다.



일반적인 Class의 clone() method
- field가 모두 기본형 타입일 경우

public Object clone() {
        try {
                return super.clone();
        } catch(CloneNotSupportedException e) {
                throw new Error("Assertion failuer");
        }
}



어떤 객체가 가변 객체를 참조하는 필드를 갖고 있는 Stack클래스를 생각해 보자.

Stack 클래스의 clone 메소드가 올바르게 동작하려면, 원본 객체가 내부적으로 포함하고 있는 객체까지도 복제해주어야 한다.

그리고 그렇게 하는 가장 쉬운 방법은, elements 배열에 대해 재귀적으로 clone 메소드를 호출하는 것이다.

Cloneable을 implements 하는 클래스의 서브 클래스에서는 clone 메소드를 잘 구현해야한다.

객체를 복제하는 다른 방법을 제공하거나, 또는 복제할 수 없도록 하는 것이 좋다.

예를 들어, 불변 클래스의 객체 복제를 지원하는 것은 바람직하지 않다. 사실상 복제본이 원본과 같기 때문이다.


객체를 복제하는 좋은 방법은 복제 생성자나 복제 팩토리 메소드를 제공하는 것이다. 복제 생성자는 그냥 생성자로써, 그 생성자를 포함하는 클래스를 타입으로 하는

인자를 하나만 갖는다. 


public Yum(Yum yum);


복제 팩토리는 복제 생성자와 유사한 static 팩토리 메소드로 다음과 같다.


public static Yum newInstance(Yum yum);


복제 생성자와 복제 팩토리 메소드를 사용하는 방법은 Cloneable 과 Clone을 사용하는 것에 대해 많은 장점을 갖고 있다.


이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/10/16 16:20 [Edit/Del] [Reply]
    오버라이드에 맛들이셨군요.

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


Apache CouchDB가 0.9.1버젼에서 0.10.0 버젼으로 뛰었다.

11시간전에 DAMIEN KATZ 블로그에 올라왔다. 


이번 버젼 개선사항은  
  • Added modular configuration file directories.
  • Miscellaneous improvements to build, system integration, and portability.

이렇다고 한다. 

조금 더 편리하게 만들기 위해 노력한 것 같다.  

그 외에도 Show와 List API에 변화가 생겼다. 자세한 건 좀 더 살펴봐야겠다.



 
이올린에 북마크하기(0) 이올린에 추천하기(0)

'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28
  1. [NC]...YellOw
    2009/10/14 22:32 [Edit/Del] [Reply]
    오~~ 뭔지 모르겠지만 버리님 내공이 팍팍 쌓인다는건 느낄 수 있네요.
    싸늘한 날씨에 감기 조심하세요~
    • 버리야
      2009/10/15 00:55 [Edit/Del]
      내공은 저~너머에..ㅠㅠ
      저 오늘 예방접종 주사 맞았어요
      이제 끄떡없다는..
      [NC]...YellOw님두 감기 조심하세요~

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[CouchDB] HTTP view API

Posted at 2009/09/29 09:50// Posted in 나만의 작업/DataBase
CouchDB wiki에 있는 내용을 보고 정리한 내용입니다. 
제가 하고싶은걸 실습한 것이기 때문에 삭제된 내용도 있습니다.


view(뷰)는 Couch document를 쿼리하거나 리포팅할때 사용되는 주요툴이다.
뷰는 자바스크립트 function으로 정의된다.
function(doc) {
  emit(null, doc);
}

Creating Views
permanent view를 만들기 위해 function은 특별한 design document에 먼저 저장되어 있어야 한다.
design document의 id는 _design으로 시작하고 view attribute는 map과 optional하게 reduce를 갖는다.
design document의 모든 view는 index되어 있다.

design document
{
  "_id":"_design/company",
  "_rev":"12345",
  "language": "javascript",
  "views":
  {
    "all": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(null, doc) }"
    },
    "by_lastname": {
      "map": "function(doc) { if (doc.Type == 'customer')  emit(doc.LastName, doc) }"
    },
    "total_purchases": {
      "map": "function(doc) { if (doc.Type == 'purchase')  emit(doc.Customer, doc.Amount) }",
      "reduce": "function(keys, values) { return sum(values) }"
    }
  }
}


Altering/Changing Views

하나의 뷰나 여러개의 뷰들을 바구기 위해선 document바꿀때랑 똑같다.

Access/Query
database에 document가 한번 저장되어있으면 모든 view는 이 URL로 반환받을 수 있다.
http://localhost:5984/database/_design/company/_view/all

요청은 이렇게..
GET /some_database/_design/company/_view/all HTTP/1.0
Date: Thu, 17 Aug 2006 05:39:28 +0000GMT

응답은 다음과 같다.
HTTP/1.1 200 OK
 Date: Thu, 17 Aug 2006 05:39:28 +0000GMT
 Content-Length: 318
 Connection: close

 {
    "total_rows": 3,
    "offset": 0,
    "rows": [{
        "id":"64ACF01B05F53ACFEC48C062A5D01D89",
        "key": null,
        "value": {
          "LastName":"Katz",
          "FirstName":"Damien",
          "Address":"2407 Sawyer drive, Charlotte NC",
          "Phone":012555754211
        }
      }, {
        "id":"5D01D8964ACF01B05F53ACFEC48C062A",
        "key": null,
        "value": {
          "LastName":"Kerr",
          "FirstName":"Wayne",
          "Address":"123 Fake st., such and such",
          "Phone":88721320939
        }
      }, {
        "id":"EC48C062A5D01D8964ACF01B05F53ACF",
        "key": null,
        "value":
        {
          "LastName":"McCracken",
          "FirstName":"Phil",
          "Address":"1234 Fake st., such and such",
          "Phone":7766552342
        }
      }
    ]
 }


Temporary Views
한번 쿼리 날리고 말것(CouchDB database에 view를 저장하고 싶지않으면) _temp_view라는 특별한 view를 통해 할 수 있다.
Temporary View는 개발중에만 사용하는 것이 좋다.

요청
POST /some_database/_temp_view  HTTP/1.0
Content-Length: 48
Date: Mon, 10 Sep 2007 17:11:10 +0200
Content-Type: application/json

{
  "map" : "function(doc) { if (doc.foo=='bar') { emit(null, doc.foo); } }"
}

응답
{
  "total_rows": 1,
  "offset": 0,
  "rows": [{
      "id": "AE1AD84316B903AD46EF396CAFE8E50F",
      "key": null,
      "foo": "bar"
    }
  ]
}

NOTE : CouchDB 0.9.0에선 _temp_view에 POST 요청시 Content-Type: application/json를 써줘야한다.

Querying Options

아래와 같은 URL query arguments가 허용된다.

    * GET
            key=keyvalue

            startkey=keyvalue

            startkey_docid=docid

            endkey=keyvalue

            endkey_docid=docid

            limit=max rows to return This used to be called "count" previous to Trunk SVN r731159

            stale=ok

            descending=true

            skip=number of rows to skip

            group=true Version 0.8.0 and forward

            group_level=int

            reduce=false Trunk only (0.9)

            include_docs=true Trunk only (0.9)
           
    *  POST

            {"keys": ["key1", "key2", ...]} Trunk only (0.9)
           

이올린에 북마크하기(0) 이올린에 추천하기(0)

'나만의 작업 > DataBase' 카테고리의 다른 글

[CouchDB] Apache CouchDB 0.10.0 이 나왔답니다.  (2) 2009/10/14
[CouchDB] HTTP view API  (0) 2009/09/29
[CouchDB] HTTP Document API  (0) 2009/07/14
[CouchDB] Compaction  (0) 2009/07/13
[CouchDB] HTTP database API  (2) 2009/07/09
[CouchDB] API Cheatsheet  (0) 2009/07/09
[CouchDB] 초간단 Mac에서 CouchDB 실행하기  (0) 2009/07/07
[CouchDB] 1. CouchDB가 뭐지?  (2) 2009/07/07
[오라클] 초성검색  (2) 2009/04/28

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. 

Java API Object.hashCode 메소드 spec에 명시

- 애플리케이션 실행 중에 같은 객체에 대해 한 번 이상 호출되더라도 hashCode 메소드는 같은 정수를 일관성있게 반환해야 한다.

- equals(Object) 메소드 호출 결과 두 객체가 동일하다면, 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 같은 정수 값이 나와야 한다.

- equals(Object) 메소드 호출 결과 두 객체가 다르다고 해서 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 반드시 다른 정수 값이 나올 필요는 없다.
그러나 같지 않은 객체들에 대해 hashCode 메소드에서 서로 다른 정수 값을 반환하면, 이 메소드를 사용하는 해시 컬렉션(HashMap, HashSet, Hashtable)의
성능을 향상시킬 수 있음을 알아야 한다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자.


equals메소드를 오버라이드 하지 않고 써야할때
- 클래스의 각 인스턴스가 본래부터 유일한 경우
- 두 인스턴스가 논리적으로 같은지 검사하지 않아도 되는 클래스의 경우
- 수퍼 클래스에서 equals를 이미 오버라이딩 했고, 그 메소드를 그대로 사용해도 좋은 경우
- private나 패키지 전용 클래스라서 이 클래스의 equals 메소드가 절대 호출되지 않아야 할 경우

그럼 언제 해야하나?

객체 참조만으로 인스턴스의 동일 여부를 판단하는 것이 아니라, 인스턴스가 갖는 값을 비교하여 논리적으로 같은지 판단할 필요가 있는 클래스로써,
자신의 수퍼클래스에서 equals 메소드를 오버라이드하지 않았을 때다. 일반적으로 값(value) 클래스가 해당된다.
객체의 참조 여부보다 객체가 갖는 값이 논리적으로 같은지가 관심사일때, 또한 Map의 키나 Set의 요소로 객체를 저장하고 사용할 수 있게 하려면 equals 메소드의
오버라이딩이 꼭 필요하다. 같은 객체가 이미 있는지 비교하는 수단을 제공해야 하기 때문이다.

equals 메소드를 오버라이드 할 필요 없는 값 클래스는 각 값 당 최대 하나의 객체만 존재하도록 인스턴스 제어를 사용하는 클래스
열거형이 그런 부류에 속하는데 그런 클래스들의 경우는 논리적인 일치와 객체 참조 일치가 동일한 의미가 된다.

equals 메소드를 만드는 방법

1) 객체의 값을 비교할 필요 없고 참조만으로 같은 객체인지 비교 가능하다면 == 연산자를 사용하자. 

2) instanceof 연산자를 사용해서 전달된 인자가 올바른 타입인지 확인하자.

대개의 경우 올바른 타입이란 호출된 equals 메소드가 정의된 클래스를 말하지만, 그 클래스가 구현하는 인터페이스도 올바른 타입이 될 수 있다. 
따라서 어떤 인터페이스를 구현하는 클래스들이 여러 개 있고, 각 클래스들은 equals 계약에 맞게 equals 메소드를 오버라이딩 하고 있다면, 
그 인터페이스 타입으로 각 클래스들의 객체를 비교할 수 있다. 예를 들어 Set, List, Map, Map.Entry 같은 컬렉션 인터페이스가 그런 형태이다.

3) 인자 타입을 올바른 타입으로 변환한다. 이러한 타입 변환은 instanceof 검사 후에 행하게 되므로 예외가 생기지 않고 안전하게 처리된다.

4) 클래스의 "중요한(꼭 비교해야 하는)" 필드 각각에 대해서는 인자로 전달된 객체의 필드와 현재 객체(equals 메소드가 호출된)의 필드가 모두 같은지 빠뜨리지 말고 비교한다.

5) equals 메소드가 대칭적이며 이행적이며 일관성이 있는지 확인한다.
대칭적(Symmetric) : y.equals(x) 가 true이면, x.equals(y)도 true 여야한다.
이행적(Transitive) : x.equals(y) 가 true이면, y.equals(z)가 true이면 x.equals(z)도 true
일관성(Consistent) : x.equals(y)를 여러번 호출해도 일관성있게 값을 리턴해야한다.


유의점.
equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 한다.
너무 지나치게 동일 여부를 비교하려는건 좀... 동일 파일을 참조하는  심볼릭 링크 객체들이 같은지 File 클래스의 equals 에서 비교하려고 하면 안 된다.
equals 메소드의 인자 타입을 Object 대신 다른 타입으로 바꾸지 말자.



이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. 2009/09/24 11:46 [Edit/Del] [Reply]
    오.. 나도 이책 있는데 책 안읽고 요기 정리올라오는거 읽어야겠다 ㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

5. 불필요한 객체 생성을 피하자

불변(immutable) 객체는 항상 재사용가능하다.

String s = new String("buri"); 

이렇게 쓰지 말고

String s = "buri"; 

이렇게 쓰자는거

실행될 때마다 새로운 인스턴스를 생성하지 않고 하나의 String 인스턴스를 사용하며 같은 JVM에서 실행되는 어떤 코드에서도 동일한 문자열 리터럴(literal)을 갖도록 재사용될 것이다.

불변 클래스의 불필요한 객체 생성을 막으려면 생성자보다는 static 팩토리 메소드를 사용하는 것이 좋다.
생성자인 Boolean(String)보다는 static 팩토리 메소드인 Boolean.valueOf(String)을 사용하는 것이 더 좋다.
생성자는 호출될 때마다 새 객체를 만드는 반면, static 팩토리 메소드는 결코 그럴 필요가 없고 실제로 그렇게 하지도 않는다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. 2009/09/24 11:18 [Edit/Del] [Reply]
    흠... String s = "abc" 해도
    결국 new String('a', 'b', 'c') 하는 거니까...
    객체 생성 한다는 측면에선 별 차이가 없는...

    문제가 되는 건 new String(antoherString)하는 과정에서 불필요한 메모리 복사가 발생한다는... 정도...^^
    • 2009/09/28 13:28 [Edit/Del]
      ^^ 자주 등장하는 String 객체생성.
      말씀해주셨다시피 String s = "abc"도 결국 내부적으론 new String 을 하는거니 성능상의 문제는 비슷하죠.
      불필요한 작업을 피하자는 것~ ^^
  2. [NC]...YellOw
    2009/09/28 09:17 [Edit/Del] [Reply]
    호~ 역시 멋지군요. 언제 한번 스타 한판 떠요~

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret


Vista에서 기본으로 제공해주는 글꼴이 영~ 맘에 들지않아, 구글링을 해보니,
역시나 맘에 안드는 사람이 많나보군요.  

간략하게 정리해보자면, 

한글 Vista인 경우!!!를 전제로, 

실행(Run) -> regedit 명령어를 치면 레지스트리 편집가능하게 되고


HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont


경로로 가서 키가 949인 변수의 값을 바꿔준다. (원하는 글꼴로, 글꼴은 이미 설치되어있어야겠죠~)
 
그리고 재부팅하면 끝~

저는 한글 Vista인데 영문 Vista인 경우의 글을 따라해서 자꾸 실패했는데,  그거에 따라 키가 다릅니다.(아마도~)

자세한 건 여기를 참고하세요. 정리가 잘 되어있는듯 해요~




이올린에 북마크하기(0) 이올린에 추천하기(0)

'나만의 작업 > Tip' 카테고리의 다른 글

[Windows] Vista에서 명령프롬프트창의 글꼴 바꾸기  (3) 2009/09/17
  1. [NC]...YellOw
    2009/09/18 13:40 [Edit/Del] [Reply]
    와.. 저두 해봐야겠네요..

    아.. 비스타군여.. ㅋㅋ
  2. 2009/11/18 15:31 [Edit/Del] [Reply]
    아마도 영문과 한글의 코드 페이지가 달라서 그럴겁니다. 한글은 코드페이지 949 (CP949) 이거든요.

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자
static 메소드나 static 필드만을 모아 놓은 클래스를 만들필요가 있는 유틸리티성 클래스는 인스턴스 생성이 무의미하다. 
그러나 그런 클래스라도 명시적으로 지정한 생성자가 없을때 컴파일러가 디폴트 생성자 (public 이며 매개변수가 없는)를 만들어주기 때문에 javadoc 프로그램으로 생성하는 API 문서에도 나타나기 때문에 인스턴스 생성이 가능한 클래스로 오인될 수 있다.

생성자 호출을 통한 인스턴스 생성을 방지하고 API 문서에도 나타나지 않도록 하려면?

private 생성자를 정의하면 인스턴스 생성이 불가능한 클래스를 만들 수 있다.

public class UtilityClass {
//이 클래스는 인스턴스 생성이 불가능하다라는 주석을 다는게 좋겠다.
private UtilityClass(){
throw new AssertionError(
}
}

명시적으로 정의한 생성자가 private 이므로 클래스 외부에서는 생성자 호출이 불가능하고 AssertionError는 이 생성자가 클래스 내부에서 우연히 호출될 경우를 대비.
이올린에 북마크하기(0) 이올린에 추천하기(0)

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Eclipse Galileo가 릴리즈 된지 좀 되었다.
릴리즈가 되어 업데이트 할 때마다 어떤 프로젝트가 들어있는지 관심있게 살펴보지 않았는데, 
이렇게  다양한 프로젝트들이 있구나.. 
dW에 있는 아티클을 보고 한번 알고 가는게 좋을 듯 하다. 

Eclipse Galileo 살펴보기

최신 버전의 오픈 소스 다목적 IDE 및 애플리케이션 플랫폼의 새로운 기능


표 1. Galileo 릴리스 트레인 프로젝트

프로젝트 개요 웹 사이트
ACTF(Accessibility Tools Framework) 장애가 있는 사용자를 위한 애플리케이션 및 컨텐츠 개발 http://www.eclipse.org/actf/
BIRT(Business Intelligence and Reporting Tools) 보고서 생성 http://www.eclipse.org/birt
CDT(C/C++ Development Tooling) C/C++ 코드 작성 http://www.eclipse.org/cdt
DTP(Data Tools Platform) 확장 가능한 프레임워크 및 도구 http://www.eclipse.org/datatools/
EMF(Eclipse Modeling Framework) 모델링 프레임워크 및 코드 생성 기능 http://www.eclipse.org/modeling/emf/
Eclipse Packaging Project 패키지 작성, 다운로드 및 설치 http://www.eclipse.org/epp/
Eclipse Platform 핵심 프레임워크 및 서비스 http://www.eclipse.org/platform/
Equinox OSGi R4 핵심 프레임워크 스펙의 구현 http://www.eclipse.org/equinox/
GEF(Graphical Editor Framework) 그래픽 애플리케이션 개발 http://www.eclipse.org/gef/
GMF(Graphical Modeling Framework) 그래픽 편집기 개발 http://www.eclipse.org/gmf/
JWT(Java™ Workflow Tooling) 설계부터 모니터링까지의 워크플로우 및 프로세스를 위한 도구 세트 http://www.eclipse.org/jwt/
JDT(Java Development Tools) Java 애플리케이션 개발 http://www.eclipse.org/jdt/
M2T JET(Java Emitter Templates) 모델을 기반으로 텍스트 아티팩트 생성 http://www.eclipse.org/modeling/m2t/
Memory Analyzer 메모리 누수 진단 및 메모리 사용량 절감 http://www.eclipse.org/mat/
MTJ(Mobile Tools for Java) 모바일 장치용 Java 애플리케이션 개발을 위한 Eclipse 프레임워크 확장 http://www.eclipse.org/dsdp/mtj/
Mylyn 수행 중인 작업을 모니터링하여 작업에 적합한 GUI 만들기 http://www.eclipse.org/mylyn/
PDT(PHP Development Tools) PHP 코드 작성 http://www.eclipse.org/pdt/
RAP(Rich Ajax Platform) Ajax 코드 작성 http://www.eclipse.org/rap/
SCA Tools SCA(Service Component Architecture) 표준을 위한 도구 http://www.eclipse.org/stp/sca/
SOA Tools SOA(Service-Oriented Architecture) 애플리케이션 코드 작성 http://www.eclipse.org/stp/
Swordfish 확장 가능한 SOA 프레임워크 http://www.eclipse.org/swordfish/
Target Management 원격 시스템 구성 및 관리 http://www.eclipse.org/dsdp/tm/
TPTP(Test and Performance Tools Platform Project) 프로파일링 및 테스트 애플리케이션을 위한 도구 http://www.eclipse.org/tptp/
Textual Modeling Framework(Xtext) 외부 텍스트 DSL 코드 작성 http://www.eclipse.org/modeling/tmf/
TmL(Tools for mobile Linux) 모바일 애플리케이션 코드 작성 http://www.eclipse.org/dsdp/tml/
WTP(Web Tools Platform) 웹 및 Java EE 애플리케이션 코드 작성 http://www.eclipse.org/webtools/

이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/08/31 10:46 [Edit/Del] [Reply]
    호.. 이거 유용한데요. 잘 쓸게요 ^^;

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자.
싱글톤(singleton)은 정확히 하나의 인스턴스만 생성되는 클래스. 싱글톤은 본질적으로 유일한 시스템 컴포넌트를 나타낸다.

예를 들면, 윈도우 매니저나 파일 시스템 등

자바 1.5 이후 싱글톤 구현하는 가장 좋은 방법

//열거형( Enum) 싱글톤
public enum Elvis {
      INSTANCE;
      public void leaveTheBuilding() { ... } 
}

복잡한 직렬화나 리플렉션 상황에서도 직렬화가 자동으로 지원되고, 인스턴스가 여러 개 생기지 않도록 확실하게 보장해준다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. 2009/08/30 17:07 [Edit/Del] [Reply]
    오... enum 으로 싱글턴을... 신기하네요~
    INSTANCE; 구문도 첨 본거고...

    자바도 아직 공부할 게 많이 남았네요 ^^;;
    • 버리
      2009/09/01 12:17 [Edit/Del]
      Heart님 올만이에요~^^
      저도 이번에 effective java 2nd 책 보면서 싱글턴으로 하는거 알아서..^^
      메소드에 접근하고 싶다면,
      Elvis.INSTACE.leaveTheBuilding();
      이렇게 접근하면 된답니다.^^

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

[Mac] Mac 에서 화면 캡쳐 단축키

Posted at 2009/08/06 18:01// Posted in 나만의 작업/Mac

유용하지만 별로 캡쳐할 일 없는 저로썬, 자꾸 까먹어서...포스팅합니다.

맥 OS 에서 캡쳐 단축키

shift + command + 3 : 전체화면 캡춰
shift + command + 4 : 부분 캡춰

파일은 바탕화면에 저장됩니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. 2009/08/06 18:52 [Edit/Del] [Reply]
    command + shift + 4 누른다음에 space하면 한 구역씩(창, dock같은거) 캡쳐할수도 있다지 ㅎㅎ
  2. 2009/08/30 17:08 [Edit/Del] [Reply]
    skitch 라는 캡쳐 프로그램이 있는데 한번 설치해서 써 보세요~
    • 버리
      2009/09/01 12:19 [Edit/Del]
      스키치 찾아보니, 아이콘이 정말 매혹적이게 생겼더라구요..^^
      이미지 공유도 가능하고 좋은 프로그램 같아요.
      감사해용~ㅋㅋ

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

Static 팩토리 메소드와 생성자의 공통적인 제약은 선택 가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다는 것인데, 흔히 나도 그러한데 텔리스코핑 생성자(telescoping constructor)패턴을 사용한다. 
필수 매개변수들만 갖는 생성자, 필수 매개변수들과 선택 매개변수 하나를 갖는 생성자, 선택 매개변수 두개를 갖는 생성자 등등의 형태로 오버로딩을 통해 여러개의 생성자를 겹겹이 만드는 것이다.

public class User{
    private String id;
    private String pw;
    private String address;
    // .......15 more field

    public User(String id, String pw){
         this(id, pw, null);
    }
    
    public User(String id, String pw, String address){
        this(id,pw,address);
    }
     //..... more constructor
}

이런식으로 필요한 매개변수만큼의 생성자를 만드는 방법.
매개변수가 몇개 안된다면 문제가 그리 되지 않지만 많으면 많을수록 가독성도 떨어지고 생성자를 찾아가고 또 찾아가고는 하다보면 실수를 유발할 수도 있다.

그럼 자바빈즈(JavaBeans)패턴 사용은 어떨까?

Class에 Setter method를 만들고, 
User user = new User();
user.setId("id");
user.setPw("pw");
user.setAddress("address");
...//more setter method

코드는 길어지지만 인스턴스 생성이 간단하고 코드의 가독성도 좋다..
하지만, 단점은 불변(immutable) 클래스를 만들 수 있는 가능성을 배제하고 스레드(thread)에서 안정성을 유지하려면 다른 작업이 필요하다. 

그럼 조금 더 우아한 방법은? Builder pattern!

public class NutritionFacts {
    public class Builder {
        public Builder(String name, int servingSize,  int servingsPerContainer) { ... }
        public Builder totalFat(int val) { ... }
        public Builder saturatedFat(int val) { ... }
        public Builder transFat(int val) { ... }
        public Builder cholesterol(int val) { ... }
        ... // 15 more setters

        public NutritionFacts build() {
                   return new NutritionFacts(this);
       }
    }
    private NutritionFacts(Builder builder) { ... } 
    }
}

이렇게 선언을 해놓고
NutritionFacts twoLiterDietCoke = new NutritionFacts.Builder("Diet Coke", 240, 8).sodium(1).build();

Builder의 setter method는 연속적으로 여러 번 호출될 수 있도록 빌더 자신의 객체를 반환한다.
코드 작성도 쉽고 가독성도 좋다!!!! 
생성자처럼 빌더는 자신의 매개변수에 불변규칙(invariants : 매개 변수나 필드가 가질 수 있는 값의 약속된 범위나 타입 및 형태를 말한다.)을 적용할 수 있고 build method는 불변 규칙을 검사할 수 있다. 
매개변수들의 값이 빌더로부터 객체에 복사된 후 빌더의 필드가 아닌 객체의 필드에 대해 불변 규칙 검사를 수행된다.

또 다른 장점은 여러개의 가변인자(varargs) 매개변수를 가질 수 있고, 유연성이 좋다. 

단점은, 어떤 객체를 생성하려면 우선 그것의 빌더를 생성해야 하기 때문에 빌더 객체의 생성 비용이 많이는 아니지만 성능이 매우 중요한 상황에서는 문제가 될 수 있다. 

결론은 생성자나 static 팩토리 메소드에서 많은 매개변수를 갖게 될 클래스를 설계할 때 빌더 패턴이 좋다는거~~위의 두 패턴보다 가독성도 좋고 자바빈즈 패턴보다 안전하다는 거~~


참고 
Effective Java 2nd book

Effective Java Reloaded : http://developers.sun.com/learning/javaoneonline/2006/coreplatform/TS-1512.pdf?






이올린에 북마크하기(0) 이올린에 추천하기(0)
  1. [NC]...YellOw
    2009/08/06 13:42 [Edit/Del] [Reply]
    오~ 이런.. 무슨말인지 한개도 모르겠네요 -0-

댓글을 남겨주세요

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

1 2 3 4 5 ... 9