Java 5.0에서 추가된 static import 기능이 있다. static 메소드나 static 변수를 접근하기 위해 해당 클래스의 이름과 함께 써 주어야 한다. 하지만 유틸리티성 메소드나 상수의 경우 일일이 클래스 이름을 써주기 귀찮은 경우가 있는데 이 경우 static import를 사용하면 클래스 이름 없이 static 메소드나 static 변수 이름만으로 사용할 수 있다.

좀 찾아보니 가장 만만한 예제는 java.lang.Math인가보다. @ㅅ@ static 메소드나 변수가 많아서 그런가.. 그래서 나는 java.util.Calendar를 사용하기로 했다. -ㅅ- 왜냐?? 똑같은건 재미 없잖아~ ㅋㅋ 사실 Calendar를 쓰면서 Calendar.YEAR, Calendar.MONTH, Calendar.DATE 같이 Calendar 클래스명을 계속 쓰는게 귀찮았다 -ㅅ-;;;

import static java.util.Calendar.*; // static import 사용(".*" 주의 ㅋ)

import java.util.Calendar;

public class StaticImportTest
{
    public static void main(String [] args)
    {
        Calendar cal = getInstance();
        System.out.println(cal.get(DATE) + "/" + (cal.get(MONTH) + 1) + "/" + cal.get(YEAR));
    }
}


static import를 사용하지 않으면 아래와 같이 써야 한다.

import java.util.Calendar;

public class StaticImportTest
{
    public static void main(String [] args)
    {
        Calendar cal = getInstance();
        System.out.println(cal.get(Calendar.DATE) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR));
    }
}





이클립스(Eclipse)와 같은 툴과 함께 static import를 사용하면 조금 불편할 때가 있다. 이클립스에는 import 문을 자동으로 구성해주는 "Organize Imports"라는 이름의 기능이 있다. (이클립스 메뉴의 Source -> Organize Imports를 클릭하거나 Ctrl + Shift + O를 누르면 된다.)

import static java.util.Calendar.*;


그러면 바로 위와 같은 import문이 현재 클래스(맨 위의 예제 클래스)에서 사용한 것들만 import하도록 아래처럼 변경되어 버린다.

import static java.util.Calendar.DATE;
import static java.util.Calendar.MONTH;
import static java.util.Calendar.YEAR;
import static java.util.Calendar.getInstance;


이렇게 되면 더 이상 Calendar 클래스 내의 static 메소드나 변수를 "Content Assist(자동 완성)"을 통해서 사용할 수 없게 된다. 만일, 요일을 출력하는 부분을 추가하기 위해 Calendar.DAY_OF_WEEK를 사용하려면 손수 import문을 추가해 주어야 하는 불편함이 생긴다. TㅅT

자.. 오뜨케 하믄 "Organize Imports" 이후에도 편하게 static import를 할 수 있을까?? 기선님의 포스트에서 간단한 해결 방법을 찾았다. 이클립스의 설정 중에 "Organize Imports" 설정이 있다. 이클립스의 설정창(Window -> Preferences)에서 Java -> Code Style -> Organize Imports -> Number of static imports needed for.*의 숫자를 99(기본값)를 1로 줄여주면 된다고 한다. 그럼 줄여보자~~ 그러면 단 1줄이라도 static import를 사용하면 ".*"로 import된다.






참.. 설정하는 그 숫자들의 의미는.. 그 숫자 이상의 동일한 패키지나 클래스의 import문이 있을 경우 ".*"로 대체해 버린다는 뜻이다. 그러니 숫자를 1로 줄이면, 1번 이상 import문이 나오면 ".*"로 바꿔준다. 만일, 3으로 바꾸면 3번 이상 출현하면 대체~


+ 이클립스는 이런 세세한 설정을 할 수 있는게 은근히 마음에 든다. 내 코드 스타일과 다른 사람이 작성한 코드를 간단하게 Ctrl + Shift + F 눌러서 내가 원하는 코드 스타일로 변경될 때의 그 쾌감이란 -ㅅ-;; 개발자는 각자 개성이 워낙 독특해서 이런데 민감하기도 해요. ㅋㅋ Ctrl + Shift + O는 Formatter(설정창의 Java -> Code Style -> Formatter)를 원하는 형태로 설정해 놓은 뒤에 사용하여야 함. formatter 설정을 xml 형태로 export/import할 수 있어 이클립스 버전이 바뀌거나 하면 다른 곳으로 옮기기 편하다

Posted by maysent
:



Window -> Preferences -> Java -> Editor -> Save Actions

[v] Perform the selected actions on save
  [v] Format source code
    (o) Format all lines
  [v] Organize imports


Posted by maysent
:

Compile++ thumb : cocos2dx_static <= CCCommon.cpp In function 'void cocos2d::CCLog(char const*, ...)': CCCommon.cpp:44:72: error: format not a string literal and no format arguments [-Werror=format-security] CCCommon.cpp: In function 'void cocos2d::CCLuaLog(char const*)': CCCommon.cpp:54:77: error: format not a string literal and no format arguments [-Werror=format-security]

jni 폴더의 Application.mk 파일에 다음 라인을 마지막에 삽입하면 오류 없이 컴파일이 진행됩니다.

( 혹은 APP_CPPFLAGS의 마지막에 -Wno-error=format-security 를 추가해줘도 됩니다. )


APP_CFLAGS += -Wno-error=format-security



근데 이게 매번 프로젝트 생성해줄때마 해주는게 번거롭다는 생각이 들었습니다...

쭉 살펴보니, cpp 프로젝트의 경우 sample/HelloCpp/proj.android 에서 template을 끌어오는걸 확인했네요.

( 왜 template 폴더가 아닌거야 응? -_- )


cocos2d-x root 디렉토리의 sample/HelloCpp/proj.android/jni/Application.mk 파일 맨 아래에도 위 라인을 삽입해주면 앞으로 생성되는 프로젝트는 다 달려서 나옵니다.


혹은 예전 버전 빌드의 경우 ndk가 낮은 버전이 필요하게 될 수 도 있다.


http://dl.google.com/android/ndk/android-ndk-r9b-darwin-x86_64.tar.bz2

위 링크가 OS X용 r9b 버전을 받기 위한 주소인데


http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86_64.tar.bz2

이렇게 링크를 변경하여 브라우저에서 링크를 띄우면 OS X용 r8e 버전을 받을 수 있다.


너무 쉬워서 그런가 안내글이 별로 없길래 글 쓴다.

Posted by maysent
: