'분류 전체보기'에 해당되는 글 53건

  1. 2009.10.21 Clean Code 번역판 곧 출간
  2. 2009.10.18 Scala의 Option
  3. 2009.10.01 Windows 7 런칭파티
  4. 2009.09.23 Scala로 Eclipse plugin 개발하기
  5. 2009.09.20 Effective Java 2nd Edition
Clean Code박재호님 번역으로 곧 출간된다고 한다. 이미 책 스택(큐 아님)에 읽지 않은 책이 쌓여있고, 오늘도 몇 권 더 쌓았지만, 출간되면 바로 사서 읽어보게 될 것 같다.
Posted by lispholic
,

Scala의 Option

Scala 2009. 10. 18. 21:26

Scala에는 Option이라는게 있는데 이것을 이용하면 귀찮은 코드를 줄일 수 있다. 예를 들어 java 에서는 뭔가를 리턴해야하는데 그럴 수 없는 경우 보통 null을 리턴한다. 그러면 받는 쪽에서는 받은게 null이 아닌지 항상 확인해야 한다.

    SomeObject obj = callSomeMethod() ;
    if (obj == null) {
        // 받은게 없는 경우 동작
    }
    else {
        // 정상 객체를 받은 경우 동작
    }

이런 귀찮은 것을 처리하기 위해 Null Object Pattern 을 쓰기도 한다. 즉 null을 리턴하는 대신에 아무 것도 아닌 객체를 리턴하는 것이다. Effective Java에는 배열이나 컬렉션을 리턴해야 할 때 리턴할게 없으면 null을 리턴하지 말고 빈 배열을 리턴하라는 내용이 나오는데 이것도 같은 것이다.

Scala의 OptionNull Object Pattern을 일반화시켜 쓰기 쉽게 해 놓은 것이다. 어떤 메소드의 리턴 타입이 Option인 경우 리턴할 객체를 Some으로 감싸서 리턴하거나 리턴할 게 없으면 None을 리턴하면 된다.

    def func(a : Int) : Option[String] = {
         if (a > 0) Some(a.toString) else None
    }

Option은 컬렉션 인터페이스를 구현했기 때문에 map() 메소드를 이용하여 필요한 필요한 동작을 수행하면 된다. Some을 받았다면 감싸고 있는 객체에 대해 뭔가 동작을 하게 되고, None을 받은 경우에는 아무 것도 하지 않게 된다. 이렇게 함으로써 받는쪽에서 null검사를 할 필요가 없어진다.

    val b = func(0) ;
    b.map{print _} ; // 출력 없음
    val c = func(1) ;
    c.map{print _} ; // 1 출력

다만 이것에 단점도 있는데, 뭔가를 리턴할 때는 객체를 하나 더 만들게 된다는 것이다. 그리고 리턴받은게 없은 경우 뭔가를 해야한다면 결국 null 검사 비슷한 것을 해야한다.

Posted by lispholic
,

Windows 7 런칭파티

기타 2009. 10. 1. 17:45

선정되면 Windows 7 정품을 준다고 하니 도전해보는 것도 괜찮을 듯...
등록하러 가기
Posted by lispholic
,

Scala 로 Eclipse 플러그인을 개발하는 것에 대해 간략히 기록해본다.

  1. eclipse scala plugin 을 설치해야 한다. 여기의 내용을 참고하여 설치한다.
  2. 다음으로 플러그인 프로젝트(Scala 프로젝트가 아니다)로 새 프로젝트를 하나 만든다.
  3. 프로젝트에서 마우스 우클릭 Scala -> Add Scala Nature 를 선택하여 Scala 관련 기능을 쓸 수 있게 한다.
  4. 플러그인 설정 편집창의 dependency 탭에서 scala.library를 추가한다.

이렇게 한다음 Scala 로 org.eclipse.jface.viewers.IStructuredContentProvider 구현체를 만들어 사용해보았다.

package scala_test
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
class ScalaContentProvider extends IStructuredContentProvider {
    def inputChanged(v : Viewer , oldInput: Object, newInput:Object) : Unit = {
    }
    def dispose() {
    }
    def getElements(parent:Object):Array[Object] = {
        val x : Array[Object] = Array( "Scala 1", "Scala 2", "Scala 3" );
        return x ;
    }
}

그리고 다음처럼 이 클래스를 java로 되어있는 쪽에서 가져다 쓴다.

    public void createPartControl(Composite parent) {
        this.viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
                | SWT.V_SCROLL);
        
        ScalaContentProvider c = new ScalaContentProvider();
        for(Class i : ScalaContentProvider.class.getInterfaces()) {
            System.out.println(i.getName()) ;
        }
        this.viewer.setContentProvider(c);
        this.viewer.setLabelProvider(new ViewLabelProvider());
        this.viewer.setInput(getViewSite());
    }

실행시켜보면 잘 된다.

그런데 아직 플러그인에 문제가 있는 것인지 ScalaContentProvider를 가져다 쓰는 쪽에 오류마크가 뜬다. (실행에는 문제가 없다.) 아래 화면처럼 ScalaContentProviderorg.eclipse.jface.viewers.IStructuredContentProvider를 구현하는데도 이런 마크가 표시된다. 아직은 Scala를 eclipse 플러그인 개발하는데 쓰기는 쉽지 않은 듯 하다.


일단 임시 해결책이 있는데, org.eclipse.jface.viewers.IStructuredContentProvider로 캐스팅을 하는 것이다. 좀 마음에 안들기는 하지만 일단 에러 표시는 사라진다.

        this.viewer.setContentProvider((IStructuredContentProvider)c) ;
Posted by lispholic
,

Effective Java 2nd Edition

Java 2009. 9. 20. 22:05
Effective Java 2nd Edition 의 번역판이다. 첫번째 판에 java5 이후에 대한 내용 (Generic , Enum , Annotation 등) 이 추가되었다.  첫 판에서 객체지향 Enum 패턴을 소개했었는데, 2판에서는 Enum을 써라 라고 내용이 바뀐 것을 보니 감회가 새롭다.

번역은 전반적으로 잘 된 편이다. 다만 마음에 안드는게 하나 있는데, Reflexive를 "재귀"라고 번역한 것이다. 재귀라는 말을 들으면 누구나 Recursive를 떠올리지 Reflexive를 생각하지는 않을 것이다. 이것 때문에 읽는데 약간 고생했다. 이렇게 번역한 것에 뭔가 심오한 뜻이 있는지도 모르겠다. (하지만 번역한 분에게 물어볼 방법이 없으니 확인 불가)

Java 프로그래머라면 꼭 읽어봐야 할 것이다.

책 정보 보러가기








Posted by lispholic
,