로그인

이메일
비밀번호
 

Effective Java (이펙티브 자바) #1

개발 2009/09/26 22:26 한최모

요즘 Effective Java (이펙티브 자바) 책을 보고 있어.


  옛날에 2006년 쯤에 1판인가를 보다가
  중간에 관뒀던 기억이 나.
  읽다가 중간중간 뭔소린지 모르겠는것은
  3년이 지나도 여전하네.

  그래도
  그때보단 술술 책장이 넘어가는 편이고
  내가 겪은 코드문제들이 더러 있어서 좀 재밌다.







항목 46 : 종전의 for루프보다는 for-each루프를 사용하자.
아마도 컬렉션 객체 사용시에 이렇단 얘기겠지?

for-each문은 for문에 비해서 약간의 성능향상이 있을 수 있다. 배열 인덱스의 한계 값을 한번만 계산하기 때문.

1.5부터 추가된 for-each구문
for(Element e : elements) {
   doSomething(e);
}
단, 병행반복처리(Parallel iteration)의 경우 여러 컬렉션의 요소들을 오가면서 처리할 필요가 있다면 인덱스 변수를 명시적으로 사용할테니 종전의 for문만 가능하겠다.



항목 48 : 정확한 계산, 금전계산에는 float나 double타입을 쓰지 말자.
(얼래.. 작년에 알바로 ERP 개발할 때 간혹 double질 한 코드 본 기억이.. ㅡㅡ;;)

float, double타입은 과학, 공학 계산을 목적으로 설계되어서 이진 부동소수점 연산을 통해 넓은 범위의 수에 대해
"정확한 근사치"를 빨리 산출하기 위해 사용된대. 실제로 소수점 계산 시 이상한 값이 나오지.

BigDecimal, int, long 타입 중 하나를 사용하도록 하라.
(int는 범위가 작으니 long을 쓰게 되더라.)

BigDecimal은 기본형 데이터(int, long)에 비해 다소 사용이 불편하고 성능의 저하가 예상되지만,
반올림이 수반되는 연산 시 완벽히 반올림을 제어할 수 있다. 그리고 너무 큰 수에 사용한다.



항목 26 : 제네릭 타입을 애용하자
C++의 템플릿과 유사한 면이 있지만 장점이 있어.

캐스팅을 해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 쉽다.
Stack <String> stack = new Stack<String>();
stack.push(arg[0]);
String str = stack.pop(); // 캐스트 없이 바로 써먹을 수 있자네.

해당 코드를 제네릭하게 만들 수가 있다는 얘기.



항목 27 : 제네릭 메소드를 애용하자
책 내용이 쫌 어렵다. 아씨
실제로 Collections 클래스의 모든 알고리즘 메소드들은 제네릭화 되어있대.

// 제네릭 메소드
public static <E> Set<E> union(Set<E> s1, Set<E> s2) { ........; }

타입추론(type inference) : 컴파일러는 union메소드의 인자가 모두 Set<String>이라는 것을 알 때에,
타입 매개변수 E 또한 String이 되어야만 한다는 것을 알게 돼. 이런 처리를 타입추론이라고 한대.



항목 51 : 문자열 결합의 성능저하에 주의
이건 꽤 유명한 내용이야. java 성능에 대한 책마다 나오네.

n개의 문자열을 +로 붙여 쓸 때 n의 제곱에 비례하는 시간이 소요된다.
두 문자열의 결합될 때 두 값 모두 복사되어 하나의 문자열을 만들기 때문이래.
따라서 StringBuilder를 사용하자. (자바 1.5에서 추가, StringBuffer의 비동기화 버전이래)



항목 52 : 객체 참조는 그 객체의 인터페이스 타입으로 하자.
인터페이스로 객체의 타입을 사용하는 습관을 들이면 프로그램이 유연해진다.

// 좋다.
List<Subscriber> subscribers1 = new Vector<Subscriber>();
// 나쁘다.
Vector<Subscriber> subscribers2 = new Vector<Subscriber>();

위의 subscriber1의 구현체 클래스를 살짝 바꿀때 new 다음에 나오는 생성자만 바꾸면 (Vector대신 딴거)
주위의 해당 코드들은 전혀 알아채지 못하고 그대로 사용할 수 있다. (예외 있지. Vector만의 기능을 쓴 경우 gg)
하여간 인터페이스나 덜 특화된 슈퍼클래스를 사용하는 것이 좋대.


항목 56 : 보편화된 작명 규칙을 따르자.

자바 플랫폼은 안정된 작명규칙(naming convention)을 갖고 있으며 대부분은 JLS(The Java Language Specification], 6.8에 포함되어 있대.

패키지 : com.google.inject, org.joda.time.format
클래스, 인터페이스 : Timer, HttpServlet
메소드, 필드 : remove, getSrc
상수 필드 : MIN_VALUE
지역 변수 : i, xref, houseNumber
타입 매개 변수 : T(임의타입), E(컬렉션요소), K(키), V(값), X(예외), T1, T2



항목 57 : 예외 상황에서만 예외를 사용하자
예외를 발생시켜 특정 구문에 대한 조건을 준다거나 하는 코드를 본 것 같은데 그러지 말래
난 예외로 루프를 제어하는 코드를 예전에 본 적이 있어. 우왓 새로운 아이디어! 라고 생각했었는데 ㅡㅡ;

예외 기반의 루프는 성능이 안좋아. 목적이 불순하고 버그를 감추고 블라블라 하여간 나빠.

이올린에 북마크하기
2009/09/26 22:26 2009/09/26 22:26
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://kk67547.cafe24.com/blog/rss/response/134

사용자 삽입 이미지














닥터하우스

전에 길모어걸스가 생각보다 완전 지겨웠던 이후로 미드를 안보다가 집어든 새로운 미드.
시즌 5까지 나와서 한 동안 미드 뭐 볼지 걱정안해도 될 것 같아서 좋아.
이미 시즌 5의 24편, 시즌 1의 22편을 다 본 상태야. 거의 50여편을 본 거지.

보통 집에서 혼자 밥먹을때 심심해서 미드를 보곤 하는데,
이 미드는 살 자르는 장면이나 피흘리는 장면이 너무 많이 나와서 밥먹을때 보면 다이어트 효과가 있어.

다리를 통증을 이기기 위해 약물에 의존해야만 하는 미국 최고의 진단의사
주인공 그레고리 하우스는 성격은 별나고 화술이 독해서 사람들이 피하기 일쑤지.
하지만 진단 실력이 매우 뛰어나.
이런 비슷한 분 예전에 병특할 때 우리 회사에 있으셨지.

이 미드의 에피소드들은 거의다가 하나같이 일관적인 흐름이야.
환자는 갑자기 아파. 발작을 하기도 하고 환각증세를 갖아. 증상이 여러개 겹치기도 하지.
다른 의사들은 병명을 도무지 알아내지 못해. 흔하지 않은 케이스의 환자야.
그럼 이제 4~5명으로 구성된 진단팀, 그레고리 하우스 팀이 나서게 되지.
팀의 나름대로 유능한 의사들은 환자의 병명을 진단해내느라고 계속 삽질해.
그리곤 그걸 지켜보던 최종보스 하우스가 특정한 이벤트로 영감을 얻고 결국 진단해내지.
환자는 치료후 완치되거나 죽어.
하우스에겐 병명을 진단을 해내는 것만이 중요한 관건이야. 일종의 퍼즐이라고 생각해.

음.. 이런 뻔한 내용인데, 매우 재밌어.
그러니 약 2주만에 벌써 50편에 가까운 에피소드를 본 것 같아.

그러던 중에........

 
시즌2의 2화는 좀 더 집중해서 봤어.
거의 손톱을 이빨에서 떼지 못하고 본 것 같아.
사용자 삽입 이미지

남자 어른이 닥터 하우스이고

환자는 저 꼬만데 디게 복잡한 병에
걸려서 목숨이 일주일도 안남았다고
진단된, 곧 죽을 여자아이야.

걱정하는 엄마를 오히려 위로하는
용감하고 의젓한 성격이지.







이때, 하우스 의사는 매우 위험한 방식의 수술을 제안해.
머리속에 있을지, 없을지도 모르는 혈전을 찾기 위해 피를 2리터를 뽑고 저온으로 냉각하고
심장을 일시적으로 정지시켜. 그 상태로 MRI기계에 아이를 넣어서 혈전의 위치를 찾는 것을 제안하지.
개인적으로는 50여편의 에피소드를 보는 동안 가장 독해보이는 수술이었어.
60초라는 제한된 짧은 시간동안에 뇌속에서 문제를 찾아내야하고
MRI를 찍는 동안 몸이 움직여지거나 하는 등의 실수가 발생할 경우 실패하기 때문에
성공확률을 높이기 위해 또 다른 시체를 갖고 리허설까지 시행해.
화면에 보이는 수술인원만 18명 정도였어.

실제 수술을 할 때 60초의 시간동안 아무도 발견해내지 못하는 그 순간!
해마에서 4밀리 외측에 있는 것을 포어맨만이 발견해내

뭐.. 이 드라마의 에피소드는 거의 해피엔딩이니까 수술은 다행히 성공을 하지.

이 드라마, 닥터하우스 괜찮네.
보스턴리갈 이후로 한참 아주 재밌게 볼 것 같은 드라마라고 생각되서 좋다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/09/24 01:49 2009/09/24 01:49
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://kk67547.cafe24.com/blog/rss/response/133

메이븐(maven) 스토리

개발 2009/09/17 02:29 한최모


메이븐(maven)을 사용해보자.


http://maven.apache.org/
아파치 메이븐은 소프트웨어 프로젝트 관리, comprehension 도구이다.
POM(Project Object Model)의 개념을 기반으로 한 메이븐은 프로젝트의 빌드와 리포트와 문서의 관리를
돕는다.

메이븐은..
- 빌드 과정을 쉽고, 동일하게
- 높은 수준의 프로젝트 정보를 제공하고
- 개발의 best practice의 가이드라인을 제공하며
- 새로운 기능에 투명한 마이그레이션을 허락해.

태현씨 말로는 프로젝트에 대해서 라이브러리의 추가 등 이런저런 변경사항이 생긴 경우
변경된 pom.xml파일만 팀원 들간에 공유하면 되므로 굉장히 편하대.

각종 라이브러리를 메이븐 레파지토리를 통해서 다운받아서 로컬 레파지토리에 저장해서 사용한대.

계속해서 다음 과정을 알아보지 머.
1. 메이븐 설치
2. 샘플 프로젝트 생성 및 컴파일
3. 이클립스에 붙이기


메이븐 설치
- jdk가 깔려있어야해.
- http://maven.apache.org/download.html 로부터 최신버전 다운로드 및 적절한 경로에 압축해제.
- 환경변수 M2_HOME을 만들고 maven 압축 푼 디렉토리로 지정.
- 환경변수 path에 %M2_HOME%\bin 추가.
- 커맨드 창에서 작동여부를 확인한다.
(각 OS별 설치 방법은 http://maven.apache.org/download.html#Installation 링크에 나와있어)

C:\Documents and Settings\greesp>mvn --version
Apache Maven 2.2.1 (r801777; 2009-08-07 04:16:01+0900)
Java version: 1.6.0_16
Java home: C:\Java\jdk1.6.0_16\jre
Default locale: ko_KR, platform encoding: MS949
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"


프로젝트 생성 및 컴파일 (참고url)
> mvn archetype:create -DgroupId=com.nushirt.app -DartifactId=guestbook

이 명령어를 실행한 디렉토리에 프로젝트가 생성되는데 적절한 경로에서 실행하는게 좋겠다.
실행하면 해당 디렉토리에 샘플코드가 들어있는 src폴더와 pom.xml이 생성된다.

> mvn package
결과로는 target 폴더가 생기면서 컴파일된 결과와 .jar파일이 생성돼.

실행해보면..
> java -cp target/guestbook-1.0-SNAPSHOT.jar com.nushirt.app.App
Hello World!

Running Maven Tools

메이븐의 단계들.. 억지로 한국말로 바꾸는 것도 지겹..

Although hardly a comprehensive list, these are the most common default lifecycle phases executed.

  • validate: validate the project is correct and all necessary information is available
  • compile: compile the source code of the project
  • test: test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
  • package: take the compiled code and package it in its distributable format, such as a JAR.
  • integration-test: process and deploy the package if necessary into an environment where integration tests can be run
  • verify: run any checks to verify the package is valid and meets quality criteria
  • install: install the package into the local repository, for use as a dependency in other projects locally
  • deploy: done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

There are two other Maven lifecycles of note beyond the default list above. They are

  • clean: cleans up artifacts created by prior builds
  • site: generates site documentation for this project

> mvn compile
이런 식으로 각 단계를 실행해. 단, 해당 단계의 이전 단계들을 선행한 후에 실행한대.


이클립스에 붙이기(참고url)
> mvn eclipse:eclipse
위 명령어를 실행하면 해당 프로젝트 폴더에 이클립스 설정 xml파일인 .classpath와 .project파일이 생기
므로 이클립스의 import > Existing Projects into Workspace 메뉴로 쉽게 임포트가 되겠네.

여기까지하면 생성된 프로젝트는 일단 에러가 발생할 것이야.
메이븐 로컬 repository경로를 몰라서 나는 에러이므로 M2_REPO라는 classpath변수가 설정해야해.

이클립스를 실행하여 다음과 같이 실행해서 M2_REPO변수를 추가하자.
Window > Preferences > Java > Build Path > Classpath

메이븐 로컬 repository경로는 C:\Documents and Settings\xxxx\.m2\repository 이런곳에 있네.

이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/09/17 02:29 2009/09/17 02:29
받은 트랙백이 없고, 댓글 하나가 달렸습니다.

댓글+트랙백 RSS :: http://kk67547.cafe24.com/blog/rss/response/132