로그인

이메일
비밀번호
 

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
받은 트랙백이 없고, 댓글 371개가 달렸습니다.

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

메이븐(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
받은 트랙백이 없고, 댓글 2개가 달렸습니다.

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