[ CnUnix ] in KIDS 글 쓴 이(By): zeo (ZeoDtr) 날 짜 (Date): 2004년 10월 13일 수요일 오후 12시 13분 04초 제 목(Title): Re: [질문] Eclipse + java + C-like prepr java 자체로만 보면 interface에 final variable들을 정의하는 방법도 여전히 문제가 있습니다. 우선, interface가 정의된 class file 자체에 그 const variable들의 정의가 모두 포함됩니다. (이건 피할 수 없습니다) 따라서, JAR file 자체가 커지는 것을 막을 수 없고, 그게 mobile device에까지 들어가야 하는 것도 막을 수 없습니다. 그리고 그 interface class가 (비록 거기에 들어있는 모든 variable이 inlining되었다고 해도) memory에 load되지 않는다는 보장은 어디에도 없습니다. 심지어, 일부 WIPI emulator는 모/든/ class들을 사/전/에/ memory에 load하거나, 적어도 그것을 위한 heap을 미/리/ reserve합니다. 그 heap은 그 program에서 allocate하는 memory를 위한 공간이기도 하기 때문에, program에 수행될 memory를 잡아먹게 되는 거죠. 웃기는 상황이죠. 그것 말고도, static const variable을 쓰는 경우 '그 variable의 type과 그 value의 유형에 따라' 어떤 것은 inline이 되고 어떤 것은 안 될 수 있습니다. 따라서 class 간의 compile dependency가 생길 수도 있고 안 생길 수도 있고... 그래서 java spec 어딘가에서도 static const variable 자체를 쓰는 것을 별로 권장하지 않더군요. modularity와 efficiency라는 두 토끼를 섣불리 쫓다가 실패한 케이스라고나 할까. 하지만 뭐 이건 알고 조심해서 쓴다고 치고. (java가 간단명쾌한 language라고?... 그럼 C++도 마찬가지다.) 그런데, Proguard라는 obfuscator가 더러운 일을 대신해 주는군요. 이놈 하는 일 중에 jar 단위로 필요 없는 class나 variable, method 같은 걸 없애주는 게 있는데, 그 과정을 통과하면 final static const variable만 정의한 interface class file 자체가 없어져 버리네요. 물론 그 variable의 값들은 다른 class의 code에 inline되어 있고요. 결국 이걸 써 줘야겠습니다. #define 대신. class나 variable 이름들도 obfuscate 과정 중에 두 글자 정도로 모두 줄여주니 덤으로 크기가 더 줄어들구요. (뭐 verification 과정에서 문제가 있을 수도 있다고 하는데, 그건 다음에 알아보도록 하고.) 다만, Proguard가 변환한 jar는 WIPI runtime이 제대로 읽어들이지 못한다는 문제가 있어서 jar xf로 풀었다가 jar cf로 다시 묶는 삽질을 해야 한다는...-_- (누가 바보일까? Proguard+jar+빵집 쪽일까, WIPI runtime일까?) -- ahsarang님도 감사. ZZZZZ "Why are they trying to kill me?" zZ eeee ooo "Because they don't know you are already dead." zZ Eeee O O ZZZZZ Eeee OOO - Devil Doll, 'The Girl Who Was...Death' |