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

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

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

  • C++ ๋ฐ Java ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋Š” ์ด์ œ Python ์ฝ”๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์˜ˆ์™ธ ์Šคํƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ˆ์™ธ ์Šคํƒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋” ์ด์ƒ stacktrace()๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ†ตํ™” ์‘๋‹ต ์†๋„๊ฐ€ 3๋ฐฐ ๋นจ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.
  • ์ „์†ก ์†๋„๊ฐ€ ํฌ๊ฒŒ(ํฌ๊ธฐ ๋‹จ์œ„๋กœ) ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ numpy ๋ฒ„ํผ. ๋‹ค์ฐจ์› ๊ธฐ๋ณธ ์š”์†Œ๋Š” ์—ฐ์† C ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ JVM ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ๋œ ์ฝ๊ธฐ ์ „์šฉ ๋ณต์‚ฌ๋ณธ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋…ธ์ถœ๋œ ๋ชจ๋“  ๋‚ด๋ถ€๋Š” CPython ๊ตฌํ˜„์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์œผ๋ฉฐ ๊ธฐํ˜ธ __javaclass__, __javavalue__ ๋ฐ __javaproxy__
    ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. jpype ํด๋ž˜์Šค ์œ ํ˜•์—์„œ ์ƒ์†๋˜๋Š” ๋ชจ๋“  CPython ์œ ํ˜•์— ์ „์šฉ Java ์Šฌ๋กฏ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ์ธ ํ…Œ์ด๋ธ”์ด CPython์œผ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Java ์œ ํ˜•์€ ์œ ํ˜• ์Šฌ๋กฏ์„ ์‚ฌ์šฉํ•˜๋Š” JClass ๋ฉ”ํƒ€ํด๋ž˜์Šค์—์„œ ์ƒ์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Python ๊ธฐ๋ณธ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ฏน์Šค์ธ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์€ Object, Proxy, Exception, Number ๋ฐ Array์ด๋ฉฐ CPython์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์—์„œ ์ง์ ‘ ์ƒ์†๋ฉ๋‹ˆ๋‹ค.

  • ์ถ”์  ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ œ ๋ฐฐ์—ด ์กฐ๊ฐ์€ numpy ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด ์›๋ณธ์— ๋‹ค์‹œ ์“ฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ทฐ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด ์Šฌ๋ผ์ด์‹ฑ์˜ ๊ฒฝ์šฐ ๋‹จ๊ณ„๋ณ„(์Šฌ๋ผ์ด์Šค(์‹œ์ž‘, ์ค‘์ง€, ๋‹จ๊ณ„))๋กœ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›๋ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ ๋ฐฐ์—ด์€ "__reversed__"๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ Java ๋ฐฐ์—ด์€ memoryview API๋ฅผ ์ง€์›ํ•˜๊ณ  ๋ฒ„ํผ ๋‚ด์šฉ์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด numpy์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • Numpy๋Š” ๋” ์ด์ƒ ์ข…์†์„ฑ์ด ์•„๋‹ˆ๋ฉฐ(์ถ”๊ฐ€) numpy ์ง€์›์œผ๋กœ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ ๋„ numpy๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JInterface๋Š” ๋ฉ”ํƒ€ ํด๋ž˜์Šค๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด isinstance(cls, JInterface)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋ˆ„๋ฝ๋œ TLD "mil", "net" ๋ฐ "edu"๋ฅผ ๊ธฐ๋ณธ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์‹œ์ž‘ ์ค‘ UnsupportedClassVersion์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • java.util.Map์€ ์ด์ œ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ KeyError๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. null์ธ ๊ฐ’์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ˆ์ƒ๋Œ€๋กœ None์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ ํ‚ค๋ฅผ None์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด get()์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๋ชฉ๋ก์˜ ์ œ๊ฑฐ(Object)์™€ ์ œ๊ฑฐ(int) ์‚ฌ์ด์— ์ด์ƒํ•˜๊ฒŒ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ java.util.Collection์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ Java ๋™์ž‘์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด Java Remove() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ํ•˜์ง€๋งŒ ์˜ค๋ฒ„๋กœ๋“œ ์ œ์–ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์œ ํ˜• ์บ์ŠคํŒ…์„ ์ ๊ทน ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ java.util.List ์š”์†Œ์— ์•ก์„ธ์Šคํ•  ๋•Œ IndexError ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ java.lang.IndexOutOfBoundsException์„ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

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