새해 인사를 할 시간이 됐군요.

올 한 해 정신적으로나 물리적으로 가장 큰 임팩트를 주신 영회 형을 비롯하여 Spring korea선배님들과 찬욱이에게 새해 인사를 올립니다. 그리고 AJN의 반장님이신 민재님과 여러 AJN 팀 식구 분들에게도 새해 인사를 올립니다. 교내 스터디 팀원들에게도 새해 인사를 올리며 친절하게 하이버네이트 강좌를 해주시는 물개 선생님이 속하신 OpenSeed 에도 인사를 드립니다.

“모두 새해에 건강하시고 즐거운 나날들이 가득하시길 바랍니다.”

어머니 아버지 내년에도 공부 열심히 해서 내 후년에는 얼마 못벌지도 모르지만 돈 벌어 드릴께요. 1년만 더 부탁드리겠습니다. 🙂

자바 검은 띠에 도전해 보시길~

RSS로 구독중인 어느 외국인 블로그에 올라온 ‘자바의 주석에 대한 글’을 보다가.

public void insertCommentBetweenCode(){
        System.out./*this is comment*/println(“Hi”);
        System.out/**/.println(“keesun”);
    }
이런 주석 사용이 가능하다는 내용이였습니다.

이 블로그의 왼쪽에 보니 자신의 자격증을 쭉~ 나열해 놓았길래 구경했습니다. Java 자격증이 세개나 있는 찬욱이가 생각나더군요. 그런데 보다보니 희한한 자격증 발견…



Brown belt

오호 이건 뭔가~ 해서 링크를 들어가 봤더니..http://www.javablackbelt.com/# 한글로 “자바 검은 띠”라는 사이트가 있더군요.
bl111.bmp
일단 목표는 녹색띠인데 몰래 해보고 녹색띠 못따면 조용히 있으렵니다.

Hiding Method

overriding에 대해 정리를 하다가 java toturial에 있던 hiding 관련 부분을 보게 됐습니다. 이 부분도 오버라이딩과 헷갈릴 여지가 있어서 정리를 해둡니다.

클래스 메소드[footnote]static scope의 메소드[/footnote]의 경우 하위 타입의 메소드가 상위 타입의 메소드의 시그네쳐와 동일 하더라도 오버라이딩이 아닙니다.

클래스 단위로 가지고 있는 메소드이기 때문에 메소드의 서명이 같더라도 메소드가 정적으로(static) 결정되어 버리기 때문에 오버라이딩이 될 수 없습니다. 오버라이딩 되려면 동적 바인딩이 되어야 하는데 static이기 때문에 그럴 수 없는 것 같네요.

튜토리얼에 있는 예제 코드를 보겠습니다.
[#M_ more.. | less.. | public class Animal {
    public static void testClassMethod() {
        System.out.println(“The class method in Animal.”);
    }

    public void testInstanceMethod() {
        System.out.println(“The instance method in Animal.”);
    }
}

public class Cat extends Animal {

    public static void testClassMethod() {
        System.out.println(“The class method in Cat.”);
    }

    public void testInstanceMethod() {
        System.out.println(“The instance method in Cat.”);
    }

    public static void main(String[] args) {
        Animal myAnimal = new Cat();
        Animal.testClassMethod();
        myAnimal.testInstanceMethod();
    }
}
_M#]
녹색 메소드는 Hiding, 주황색 메소드는 Overriding입니다. Hiding이라고 하는 이유는 오버라이딩 하는 메소드를 숨긴다는 의미로 그렇게 지은것 같습니다. 클래스 타입으로 결정이 되기 때문에 분홍색 부분에서는 Animal의 메소드가 호출 될 것이며 보라색 부분에서는 Cat에 있는 메소드가 호출될 것입니다.

결과는 아래와 같습니다.

The class method in Animal.
The instance method in Cat.

Overring이 긴지 아닌지 확인하기 위해서는 @Override를 붙여보면 됩니다.
bl109.bmp역시 이클립스가 “이건 오버라이딩이 아닌데~” 이러는게 보입니다.
하지만 컴파일 에러는 발생하지 않습니다.

두개의 글로 살펴본 Overriding and Hinding Methods의 Summary부분에 나와있는 그림입니다.
bl110.bmp

Overriding – covariant return type

Java tutorial에 보시면 다음과 같이 나와있습니다.

An instance method in a subclass with the same signature (name, plus the number
and the type of its parameters) and return type
as an instance method in
the superclass overrides the superclass’s method.

메소드 서명 부분(메소드 이름, 매변수의 수, 매개변수의 타입) 과 리턴 타입이 부모 클래스의 것과 같을 때 자식 클래스에 있는 메소드가 오버라이딩을 한다.

하지만 이게 끝이 아닙니다. 다음 문단에 보시면

An overriding
method can also return a subtype of the type returned by the overridden
method.
This is called a covariant return type.

오버라이딩 하는 메소드의 리턴 타입은 오버라이딩 당하는 메소드의 리턴타입의 하위 타입이 될 수 있습니다. 이것을 covariant return type이라고 한다는데 한글로는 뭐라고 해야하는지 모르겠네요.

팁으로 Overriding이 맞는지 확인하고 싶으면 Overriding하는 메소드 위에 @Override 라고 어노테이션을 붙여 주시면 됩니다. 적절한 오버라이딩이 아닐 때는 이 어노테이션을 근거로 컴파일 에러가 발생합니다. “오버라이딩이 아닌데 왜 오버라이딩이라고 써논거야?” 뭐 이런 에러가 발생합니다. 그래서 오버로딩과 오버라이딩이 명확하지 않을 땐 @Override를 붙여주는 것도 좋은 코딩 습관이 될 것 같습니다.

코드로 확인해 보겠습니다.
[#M_ more.. | less.. | package override;

public class Animal {
    public Animal getAnimal(){
        return new Animal();
    }
}

package override;

public class Cat extends Animal {
    @Override
    public Cat getAnimal(){
        return new Cat();
    }
}

//이클립스에서는 @Override에 빨간 불이 안들어오는 걸 보고도 오버라이딩이 적용된다고 생각할 수 있겠습니다.
_M#]
전 이 부분을 읽고나서 한 참 뒤 매개변수도 하위 타입으로 받아 들이게 되면 오버라이딩 아닌가~ 하는 생각으로 ‘외곡된 기억’을 가지게 되었고 다행히 열공하는 후배 덕분에 제가 ‘외곡된 기억’을 가지고 있었다는 사실을 알게 되었습니다.

머릿속으로 ‘맞다’라고 생각했던 것이 ‘외곡된 기억’일 수도 있다는 교훈을 얻게 됐네요.

DDD Jedi 선수작업

ORM : http://www.agiledata.org/essays/mappingObjects.html#MapHierarchyToTable

AOP : Spring Reference 6장, 7장 정리. 하다가 모르는 것만 Aspectj in action 참조.
* Proxy 기반과 Aspect 기반의 차이점
* Spring에서 AOP 어떻게 쓰는가 (reference 참조)
* 어떻게 쓰는지, 기본 개념 등이 파악되면.. 언제 어떻게 쓰는 것이 좋은가.
* AOP를 써서 어떨 때 어떻게 좋아졌는지 보여주는 예제 소스 코드 위주로 공부.