Python์—์„œ Java ํด๋ž˜์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ JPype 1.0 ๋ฆด๋ฆฌ์Šค

์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ ˆ์ด์–ด ๋ฆด๋ฆฌ์Šค JPype 1.0, Java ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์˜ JPype๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Java ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java์™€ Python ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Jython๊ณผ ๋‹ฌ๋ฆฌ Java์™€์˜ ํ†ตํ•ฉ์€ JVM์šฉ Python ๋ณ€ํ˜• ์ƒ์„ฑ์„ ํ†ตํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ƒ ๋จธ์‹  ์ˆ˜์ค€์—์„œ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  CPython ๋ฐ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฐฐํฌ์ž Apache 2.0์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ :

  • JChar๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์œผ๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด JChar๋Š” "str"์„ ์ƒ์†ํ•˜๊ณ  "int"๋กœ์˜ ์•”์‹œ์  ๋ณ€ํ™˜์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ„์•ฝ์˜ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” Python์—์„œ ๋” ์ด์ƒ ์ˆซ์ž ์œ ํ˜•์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ isinstance(c, int)๊ฐ€ Java ์œ ํ˜• ๋ณ€ํ™˜ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•˜๋Š” False๋กœ ํ‰๊ฐ€๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Java ์œ ํ˜• Type@obj๋ฅผ ์บ์ŠคํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์ž๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค(@๋Š” ๋‚ด๋ถ€ ๊ณฑ์— ๋Œ€ํ•œ Python ์—ฐ์‚ฐ์ž์ด๋ฉฐ Java์—๋Š” ์—†์Šต๋‹ˆ๋‹ค).
  • Java ๋ฐฐ์—ด ์ƒ์„ฑ์„ ์œ„ํ•œ ํ‘œ๊ธฐ๋ฒ•์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ • ํฌ๊ธฐ ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ [s1][s2][s3]์„ ์ž…๋ ฅํ•˜๊ณ  ๋‚˜์ค‘์— ์ƒ์„ฑ๋  ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ [:][:][:]๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • @FunctionalInterface๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด __call__์„ ์‚ฌ์šฉํ•˜์—ฌ Python ๊ฐ์ฒด์—์„œ Java ํŽ‘ํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” JIterator, JException์„ ํŒฉํ† ๋ฆฌ๋กœ ์‚ฌ์šฉ, get_default_jvm_path ๋ฐ jpype.reflect๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ Java ๋ฌธ์ž์—ด์€ Python ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Python์—์„œ๋Š” "__int__"๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ •์ˆ˜ ์œ ํ˜•๊ณผ ๋ถ€๋™ ์†Œ์ˆ˜์  ์œ ํ˜• ๊ฐ„์˜ ์•”์‹œ์  ์บ์ŠคํŠธ๋Š” TypeError๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • JException ์‚ฌ์šฉ์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ํฌ์ฐฉํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ Java ์˜ˆ์™ธ ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด java.lang.Throwable์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Java ์˜ˆ์™ธ์˜ ๊ณ„๋‹จ์‹ ์›์ธ์ด ์ด์ œ Python ์Šคํƒ ํ”„๋ ˆ์ž„์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • JString์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ Java ๋ฌธ์ž์—ด ์œ ํ˜•์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด java.lang.String์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Repr ๋ฉ”์†Œ๋“œ๊ฐ€ Java ํด๋ž˜์Šค์—์„œ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • java.util.List๋Š” collections.abc.Sequence ๋ฐ collections.abc.MutableSequence์— ๋Œ€ํ•œ ๊ณ„์•ฝ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • java.util.Collection์€ collections.abc.Collection์— ๋Œ€ํ•œ ๊ณ„์•ฝ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • Java ํด๋ž˜์Šค๋Š” ๋น„๊ณต๊ฐœ์ด๋ฉฐ Python์—์„œ ํ™•์žฅ๋˜๋ฉด TypeError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • Control-C๋ฅผ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฃจ์‹ญ์‹œ์˜ค. ์ด์ „ ๋ฒ„์ „์€ ํ˜ธ์ถœ ์ค‘์— Java๋ฅผ ์ข…๋ฃŒํ•˜๋ฏ€๋กœ Java๊ฐ€ Control-C ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. JPype๋Š” ์ด์ œ Java์—์„œ ๋ฐ˜ํ™˜ํ•  ๋•Œ InterruptedException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. Control-C๋Š” ํ˜„์žฌ ๊ตฌํ˜„๋œ ๋Œ€๊ทœ๋ชจ Java ํ”„๋กœ์‹œ์ €๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Java์—๋Š” ์ด๋ฅผ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๋„๊ตฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, Python 1.0.1 ๋ฆด๋ฆฌ์Šค์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•œ ์ˆ˜์ • ๋ฆด๋ฆฌ์Šค 3.8.4์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Python์—์„œ๋Š” "๊ฐ์ฒด" ๋ฐ "์œ ํ˜•"์— ๋Œ€ํ•œ "__setattr__" ์‚ฌ์šฉ๊ณผ ๊ด€๋ จ๋œ ๋…ผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋„ "__setattr__" ๋ฉ”์„œ๋“œ์—์„œ ์œ„์ž„๋˜์—ˆ์œผ๋ฏ€๋กœ ์ผ๋ถ€ ์ ํ•ฉ์„ฑ ๊ฒ€์‚ฌ์˜ ์˜ˆ์™ธ ์œ ํ˜•์ด ์ด์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€