[Java] @Override 어노테이션의 사용

자바 언어에서 클래스를 작성할때 그 행위를 파생 클래스에 특화시키기 위해 부모 클래스의 매서드를 오버라이드(Override)하는 경우가 있습니다. 예를 들어서.. 안드로이드라는 모바일 개발 플랫폼에서 모바일 애뮬레이터의 Menu 키를 누르게 되면 Activity라는 클래스의 onCreateOptionsMenu 매서드가 호출됩니다. 즉, Activity 클래스를 상속받아 자신만의 메뉴를 만들기 위해 상속받은 클래스는 onCreateOptionsMenu 매서드를 오버라이드해야 한다는 것입니다. 아래처럼요..

public class MenuTest extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public boolean onCreateOptionMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

         menu.add(0, 1, 0, "Menu1");
         menu.add(0, 2, 0, "Menu2");

         return true;
     }
}

자.. 이제 실행하고 Menu 키를 누르면 메뉴가 짠~하고 나타나길 기대합니다! 하지만 나타나지 않습니다.. 이유는 MenuTest라는 클래스에 Override했다고 생각하는 onCreateOptionsMenu가 Override되지 않았기 때문입니다. 분명히 위의 코드에서 Override했다고요? 눈을 크게 뜨고 보시기 바랍니다.. 네.. 철자가 틀렸습니다! 우리가 Override 했다고 생각한 것은.. 사실 새로운 onCreateOptionMenu 매서스를 추가한 것입니다.. 즉 철자가 틀렸습니다.. onCreateOptionMenu가 아니고 onCreateOptionsMenu입니다..

의도는 분명했으나 개발자도 사람인지라 철자에 대한 실수를 했습니다.. 바로 이러한 실수를 방지할 목적으로 자바에서는 @Override 어노테이션을 지원하게 되었습니다.. 이제 다시 위의 코드에 이 @Override 어노테이션을 사용해 보면 아래와 같습니다..

public class MenuTest extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onCreateOptionMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

         menu.add(0, 1, 0, "Menu1");
         menu.add(0, 2, 0, "Menu2");

         return true;
     }
}

컴파일 해보면 에러가 발생합니다.. 에러 내용은 onCreateOptionMenu는 Override될만한 매서드가 아니라는 내용을 개발자에게 전달합니다. 여기서 개발자는 자신의 실수를 인지하고 해결책을 마련합니다. 즉, 틀린 철자를 고쳐서 말입니다.

자바라는 언어가 앞서 예를 든 개발자의 실수를 방지할 수 없으므로.. 비록 차선책이라고 생각되기는 하지만… 바로 @Override라는 어노테이션을 제공하게 되었습니다. 이 어노테이션을 제대로 활용하기 위해서는.. 일괄적으로 개발자 스스로가 Override 되는 모든 매서드에 대해서 바로 이 @Override를 붙여 놓는 것입니다. 이것은 분명히 명확하고 옳바른 습관입니다.

안드로이드의 패스위의 텍스트

수년전에 오렐리라는 출판사에서 나온 자바의 2D API를 보면서… 이 API를 이용해 2D GIS 엔진을 자바로 만들면 정말 환상이겠구나… 라는 생각을 했던 적이 있었습니다. 그런데.. 안드로이드를 살펴보면서 또 다시 이런 생각이 다시 듭니다.. 안드로이드가 내세우는 주요 개발 언어가 자바라는 점과 이러한 생각은 우연이 일치이겠지만 말입니다. 또 다시 이러한 생각을 들게 만드는 안드로이드의 기능은 아래와 같은 기능 때문입니다. 즉, Path을 따라 사용자가 표현하고자 하는 텍스트를 자연스럽게 회전시켜주는 기능입니다.

사용자 삽입 이미지
참으로.. 아름답습니다! 그럼 어떻게 이렇게 하는지 안드로이드 맛보기 겸해서 코드를 잠시 살펴보도록 하겠습니다. 물론 안드로이드를 잘 아시는 분들은 걍.. 살짝 패스해주셔도 됩니다!

먼저 간단히 View를 하나 만듭니다. View 클래스는 안드로이드에서 위젯(UI 컨트롤)을 나타내는데 유용한 부모클래스입니다..

public class MyView extends View {
    public MyView(Context context) {
        super(context);
    }
 
    public void onDraw(Canvas canvas) {
        Path path = new Path();
        canvas.drawColor(Color.BLACK);
  
        Paint Pnt = new Paint();
        Pnt.setAntiAlias(true);
        Pnt.setStrokeWidth(1);
        Pnt.setColor(Color.GREEN);
        Pnt.setStyle(Paint.Style.STROKE);

        path.moveTo(10, 10);
        path.cubicTo(80, 150, 100, 220, 310, 410);
        
        Pnt.setColor(Color.GREEN);
        canvas.drawPath(path, Pnt);
  
        Pnt.setTextSize(40);
        Pnt.setStrokeWidth(1);
        Pnt.setStyle(Paint.Style.FILL);
        Pnt.setColor(Color.WHITE);
        Pnt.setAntiAlias(true);
        canvas.drawTextOnPath("안드로이드의 패스위 문자열 표현", path, 0, 0, Pnt);
    }
}

즉, 문자열이 표시될 방향을 결정할 Path 객체를 만들어주고.. Canvas의 drawTextOnPath 매서드를 통해 원하는 문자열을 표시해주기만 하는.. 매우 효율적인 API를 제공합니다. 이제 이 View를 실제로 사용하는 Activity를 정의합니다.

public class UseMyView extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyView vw = new MyView(this);
        setContentView(vw);
    }
}

안드로이드에서 Activity는 실제로 화면에 표시되지는 않지만 화면을 구성하는 가장 핵심이 되는 단위로.. View를 컨트롤하여 화면에 개발자가 원하는 컨텐츠를 표시할 수 있습니다. 안드로이드의 2D 그래픽스…. 많은 모바일 API를 경험해 보지는 않았으나… 정말 이 정도로 뛰어난 2D 그래픽 API를 제공하는 모바일 개발 플랫폼이 있을까… 싶습니다..

[GIS] SHP을 SQL 문으로 변환해 주는 툴 – SHP2SQL

SHP 파일의 좌표 정보와 속성 정보를 DBMS에 테이블 구조를 생성하고 값을 추가하는데 필요한 SQL문을 생성해 주는 툴입니다. 현재는 포인트 타입에 대한 SHP 파일에 대해서 적용할 수 있습니다. 먼저 실행 화면은 아래와 같습니다.

사용자 삽입 이미지
위의 UI 화면에서 Export Fields에 DBMS로 내보내고자 하는 필드를 선택하면 됩니다.. 필요없는 필드값에 대해서도 제외시켜도 됩니다. 이 기능을 이용해서 DBMS에 따라 필드명으로써 사용할 수 없는 필드는 이곳을 통해 제외시켜줄 수 도 있습니다.. 위의 화면 예시처럼 입력값들을 지정한 후 변환 버튼을 누르게 되면 다음과 같은 sql 문이 담긴 텍스트 파일이 만들어 집니다..

사용자 삽입 이미지
테이블을 생성하고 생성된 테이블에 속성값을 추가하기 위한 Ansi SQL 구문으로 구성됩니다.. 이 내용을 수정해 줄 필요(테이블명)도 있을 것입니다..  이렇게 생성된 SQL 파일을 각 DBMS에서 불러와 실행해주면 간단하게 DBMS에 SHP 파일에 대한 테이블이 생성됩니다.. MySQL의 경우 soruce 명령어를 이용해서 외부의 sql 문이 담긴 파일을 실행할 수 있습니다.

이 툴의 실행을 위해서는 최신 버전의 듀라맵을 설치하셔야 합니다. 다음 url을 통해 듀라맵을 설치하시기 바랍니다.

http://www.gisdeveloper.co.kr/notice/574

소스 코드와 컴파일된 실행 파일 모두를 제공해 드리니.. 개발자 분이라면 목적에 맞게 커스터마징해 사용하시길 바랍니다..

아래의 이미지는 위에서 만들어진 sql 구문이 담긴 text 파일을 MySQL에서 실행시켜 만들어진 테이블을 조회해 본 화면입니다.

사용자 삽입 이미지
위의 이미지를 보시면.. X, Y 필드명으로 POI의 좌표가 자동으로 추가된 것을 확인할 수 있습니다.

[GIS] 구글맵의 타일맵의 크기

정확히 말씀드리면.. 아이폰에서 구글맵에서 서비스 되는 타일맵의 크기입니다. 블로그의 방문자분 중 모바일폰의 지도 서비스에서 타일맵의 트래픽 관련 댓글을 보고.. 혹시나 해서 제가 가지고 있는 아이폰으로 요래 저래 단순하지만 확실한 방법으로 ^^; 타일맵의 크기를 찾아봤습니다. 아래는 그 크기를 알아보기 위해 얻은 캡쳐 화면입니다.

사용자 삽입 이미지
저는 처음에 64×64 크기의 타일맵을 사용할거라 예상했더랬습니다.. 아이폰의 픽셀 화소 크기가 일반 LCD 모니터의 화소 크기보다 미려해서.. 이런 판단을 하게 되었나 봅니다만.. 여튼.. 이번에 모바일쪽에서 서비스할 지도를 타일로 가공하는 작업을 눈앞에 두고 있던 차에.. 이제 타일맵의 크기를 128×128로 가공하도록 방향을 바꿔야 겠습니다..

끝으로.. 제가 가지고 있는 아이폰3의 화면 크기가 정확하지는 않지만.. 480×360인데.. 이 화면 크기면.. 위의 캡쳐 이미지 처럼 타일 이미지의 개수가 최소 9개면 충분하다는 결론입니다.. 현재 대부분의 스마트폰의 화면 크기가 이의 4배정도 되므로.. 곰곰히 생각해 보면.. 모바일 폰이든.. 일반 데스크탑에서든.. 타일맵의 크기를 공통적으로 256×256으로 하는 것도 별 무리는 없지 않을까 생각이 듭니다.. 타일맵 가공이 생각외로 상당히 시간이 많이 걸리고 손이 많이 가는 작업인지라.. 타일맵의 크기를 최대한 키워서 파일 개수를 최소로 줄여 작업하는게 수월하기 때문입니다..

요즘… 에어컨으로 인해.. 실내의 온도차이와 실외의 온도 차이가 너무 극심한것같습니다.. 실내에서 정신없이 작업하다가 잠시 밖에 볼일 보러 나갈라치면… 한마디로 쪈다는.. 쪈다는 표현이 딱이네요.. 쪕니다 쪌어요.. -_-; 극심한 온도차이로 생체리듬도 다소 흐트려진 요즘입니다.. 그래도 긴박한 요즘.. 정신 바짝 차려야하다는 생각으로 버텨봅니다..