๐Ÿ’ป Programming (358)

์•ˆ๋…•ํ•˜์„ธ์š”~~ ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค~


์˜ค๋Š˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ํ—ค๋“œ, ๋ฐ”๋”” ํƒœ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ  ๋‘ ํƒœ๊ทธ ๋ชจ๋‘์— ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๊ณ , ์™ธ๋ถ€ํŒŒ์ผ๋กœ ์ •์˜ํ•ด์„œ includeํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ฃ . 


 <head> ํƒœ๊ทธ ๋‚ด์˜ JavaScript

์‚ฌ์šฉ์ž๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋™์ž‘์„ ํ•ด์•ผํ•œ๋‹ค๋ฉด ํ—ค๋“œํƒœ๊ทธ ์•ˆ์ชฝ์— ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

 

<html>
<head>
<script type="text/javascript">
<!--
function sayHello() {
   alert("Hello World")
}
//-->
</script>
</head>
<body>
<input type="button" onclick="sayHello()" value="Say Hello" />
</body>
</html>

 

 

 <body> ํƒœ๊ทธ ๋‚ด์˜ JavaScript

์›นํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์–ด๋–ค ๋‚ด์šฉ๋ฌผ์ด ํ™”๋ฉด์— ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ”๋”” ํƒœ๊ทธ ์•ˆ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”. ์ด ๊ฒฝ์šฐ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ ์ •์˜๋œ ํ•จ์ˆ˜๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

<html>
<head>
</head>
<body>
<script type="text/javascript">
<!--
document.write("Hello World")
//-->
</script>
<p>This is web page body </p>
</body>
</html>

 

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณด์ด๊ฒ ์ฃ ?

 

Hello World
This is web page body

 

 

<body> ์™€ <head>์— ๋™์‹œ์— ์“ฐ์ด๋Š” JavaScript

 

<html>
<head>
<script type="text/javascript">
<!--
function sayHello() {
   alert("Hello World")
}
//-->
</script>
</head>
<body>
<script type="text/javascript">
<!--
document.write("Hello World")
//-->
</script>
<input type="button" onclick="sayHello()" value="Say Hello" />
</body>
</html>

 


์™ธ๋ถ€ ํŒŒ์ผ๋กœ ์ •์˜๋œ JavaScript

JavaScript๋ฅผ ์ข€๋” ํ™•์žฅํ•ด์„œ ์“ฐ๋ ค๋ฉด ์™ธ๋ถ€ํŒŒ์ผ๋กœ ์ •์˜ํ•ด์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ๋ณ„๋กœ ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด์„œ ์ •๋ฆฌํ•˜๋ฉด ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํŽธํ•ด์ง€๊ฒ ์ฃ . ์ด๊ฑด ๋ญ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ ธ์ง€๋งŒ์š” ใ…‹ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๋™์ผํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ• ๊ฒ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์™ธ๋ถ€ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋ ค๋ฉด .jsํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํŒŒ์ผ์„ includeํ•˜๋Š” ๋ฐฉ๋ฒ•์€ src์†์„ฑ์„ ์ด์šฉํ•ด์„œ ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 


<html>
<head>
<script type="text/javascript" src="filename.js" ></script>
</head>
<body>
.......
</body>
</html>

 

 

filename.js 

function sayHello() {
   alert("Hello World")
}

 

 

ํ•œ๋ฒˆ์”ฉ ๋‹ค ํ•ด๋ณด์‹œ๊ณ  ์•ˆ๋œ๋‹ค ํ•˜์‹œ๋Š”๊ฒŒ ์žˆ์œผ์‹œ๋ฉด ๋Œ“๊ธ€๋กœ ์งˆ๋ฌธ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~ ^-^


์ด์ƒ ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค~


์ฆํ”„ํ•˜์„ธ์š”~~ ^-^

 

Reference : http://www.tutorialspoint.com/javascript/javascript_placement.htm 

 


์•ˆ๋…•ํ•˜์„ธ์š” ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ํ˜น์‹œ๋‚˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ €์— ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›Œ์ฃผ๋Š” ๊ฒƒ์„ ํ• ๊ฒ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฏธ์ง€์› ๋ธŒ๋ผ์šฐ์ €์— ๊ฒฝ๊ณ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด๊ธฐ

์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ <noscript> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

<html>
<body>

<script language="javascript" type="text/javascript">
<!--
   document.write("Hello World!")
//-->
</script>

<noscript>
  Sorry...JavaScript is needed to go ahead.
</noscript>
</body>
</html>

 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฏธ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„ค์ •์—์„œ ๋ง‰์•„๋†“์€ ๊ฒฝ์šฐ์—๋Š” <noscript> ํƒœ๊ทธ ๋‚ด์— ์žˆ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. 

 

์•ˆ๋…•ํ•˜์„ธ์š” ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ•ด๋ณผ๊นŒ์š”?

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ  <script>... </script>  ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋Š” ์›นํŽ˜์ด์ง€ ์–ด๋””์—๋‹ค๊ฐ€ ๋„ฃ์–ด๋„ ํฐ ์ƒ๊ด€์€ ์—†์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š”  <head> ํƒœ๊ทธ๋‚ด์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 

 

<script ...>
  JavaScript code
</script>

 

script ํƒœ๊ทธ๋Š” ๋‘๊ฐ€์ง€ ์ค‘์š”ํ•œ ์†์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • language: ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด๊ฐ€ ๋ญ”์ง€๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š”๊ฑฐ์ฃ . ์šฐ๋ฆฌ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋‹ˆ๊นŒ javascript ๋ผ๊ณ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ HTML์ด๋‚˜ XHTML์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ๋ ๊ฑฐ๋ผ๊ณ  ํ•˜๋„ค์š”. ์ €๋„ ์ด์ œ ๋ง‰ ์ž์Šค ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด์„œ ํ™•์‹ค์น˜๋Š” ์•Š์Šต๋‹ˆ๋‹ค ใ…‹ใ…‹ 

  • type:  ํƒ€์ž…์€ "text/javascript" ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.  

 

๊ทธ๋ž˜์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๊ธฐ๋ณธํ‹€์ด ์žกํ˜€์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฑฐ์ฃ .

 

<script language="javascript" type="text/javascript">
  JavaScript code
</script>

 

๋‚˜์˜ ์ฒซ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ "Hello World"๋Š” ๊ธฐ๋ณธ์ด์ฃ . ์ž์Šค(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค„์ž„)๋ฅผ ์ด์šฉํ•ด์„œ "์•ˆ๋…• ์„ธ์ƒ์•„"๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

<html>
<body>
<script language="javascript" type="text/javascript">
<!--
   document.write("Hello World!")
//-->
</script>
</body>
</html>

 

 ์ž ์œ„ ์†Œ์Šค๋ฅผ ๋ณด์‹œ๋ฉด ์ž์Šค์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์•ผ ํ•  ๋ถ€๋ถ„์— ์ฃผ์„์ฒ˜๋ฆฌํ•˜๋Š” ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€๋กœ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ์™œ ๋„ฃ์—ˆ๋ƒ ํ•˜๋ฉด๋ง์ด์ฃ . ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” ์‹คํ–‰ํ•˜์ง€ ๋ง๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚ ํ…Œ๋‹ˆ ๋ง์ด์ฃ . "//-->"์—์„œ  "//" ๋Š” Javascript์—์„œ ์“ฐ๋Š” ์ฃผ์„๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

 document.write ๊ฐ€ ํ•˜๋Š” ์—ญํ• ์€ HTML๋ฌธ์„œ์— ์ŠคํŠธ๋ง์„ ์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” text๋‚˜ HTML๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์“ฐ๊ธฐ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์™€์•ผ๊ฒ ์ฃ ?

 

Hello World!

 

 

 

์ด์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์ง•์„ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋นˆ์นธ, ํƒญ, ๊ทธ๋ฆฌ๊ณ  ๋ผ์ธ ๋ธŒ๋ ˆ์ด์ปค๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๋Š” ์ฝ”๋“œ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ŠคํŽ˜์ด์Šค๋‚˜ ํƒญ, ๊ทธ๋ฆฌ๊ณ  new lines ๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜๊ฐ€ ์žˆ๊ฒ ์ฃ ??

์„ธ๋ฏธ์ฝœ๋ก ์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ผ์ธ์˜ ๋์„ ์•Œ๋ ค์ฃผ๋Š”๊ฒŒ ์„ธ๋ฏธ์ฝœ๋ก ์ด์ฃ . C, Java ๋“ฑ๋“ฑ์—์„œ ๋ชจ๋‘ ๊ทธ๋ ‡๊ฒŒ ์“ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž์Šค์—์„œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์จ๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.  

<script language="javascript" type="text/javascript">
<!--
  var1 = 10
  var2 = 20
//-->
</script>

 

ํ•˜์ง€๋งŒ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•œ์ค„์— ํ•˜๋‚˜์˜ statement๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐ€์ง€ ์ผ์„ ํ•˜๋Š” statement๋ฅผ ํ•œ์ค„์— ์“ฐ๋ ค๋ฉด ์„ธ๋ฏธ์ฝœ๋ก ์€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ญ ๊ทธ๋ƒฅ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์“ฐ๋Š”๊ฒŒ ๋‚ซ๊ฒ ์ฃ ?

<script language="javascript" type="text/javascript">
<!--
  var1 = 10; var2 = 20;
//-->
</script>

 

 

๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์˜ ์ฃผ์„์ฒ˜๋ฆฌ๋ฐฉ์‹๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

JavaScript ๋Š” C-style ๊ณผ C++-style ์˜ ์ฃผ์„์ฒ˜๋ฆฌ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

 

<script language="javascript" type="text/javascript">
<!--

// This is a comment. It is similar to comments in C++

/*
 * This is a multiline comment in JavaScript
 * It is very similar to comments in C Programming
 */
//-->
</script>

 

 

์ž, ์ง€๊ธˆ๊นŒ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ• ๋ฐ ํŠน์ง•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 

์•ˆ๋…•ํ•˜์„ธ์š” ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ์ˆ˜๋งŽ์€ ์†Œ์Šค ์ •์  ๋ถ„์„ ํˆด ์ค‘์—์„œ ์„ธ๊ฐ€์ง€ ํˆด์— ๋Œ€ํ•œ ๋น„๊ต๋ฅผ ํ•ด๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฏธ ์–ด๋–ค ๋ถ„์ด ๋ถ„์„์„ ํ•ด๋†“์€ ์˜๋ฌธ ์ž๋ฃŒ๊ฐ€ ์žˆ์–ด์„œ ๋ฒˆ์—ญ์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 


   
 Findbugs

 
 PMD
 
 Checkstyle
  ๋ฒ„์ „  3.0.0  5.2.2  6.1.1

  ๋ผ์ด์„ผ์Šค

 Lesser GNU Public License  BSD-style license  Lesser General Public License
  ๋ชฉ์    ์ž ์žฌ์  ๋ฒ„๊ทธ ์ฐพ๊ธฐ
( ์ž๋ฐ” ์†Œ์ŠคํŒŒ์ผ์ด ์•„๋‹Œ  ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ด์šฉ )
   ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋“ค, ๋ฒ„๊ทธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ถ€๋ถ„๋“ค,
  ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋“ค ๊ฒ€์ƒ‰
  ์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ์„ ์ฝ์–ด์„œ ์†Œ์Šค ์ฝ”๋“œ ํ‘œ์ค€์— ์œ„๋ฐ˜๋˜๋Š” ๊ฒƒ๋“ค์„ ๊ฒ€์ƒ‰,
 e.g.  Sun Code Conventions, JavaDoc
 ์žฅ์  - ์‹ค์ œ ๊ฒฐํ•จ์„ ์ž˜ ์ฐพ์•„์คŒ
- ์ฐพ์€ ๊ฒฐํ•จ์ด ์—‰๋šฑํ•œ ๊ฒฐํ•จ์ผ ํ™•๋ฅ ์ด ๋‚ฎ์Œ ( ์ •ํ™•์„ฑ์ด ๋†’์Œ )
- ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฝ์Œ์œผ๋กœ ์†๋„๊ฐ€ ๋น ๋ฆ„
- ์ข…์ข… ์‹ค์ œ ๊ฒฐํ•จ์„ ์ฐพ์•„์คŒ
- finds bad practices
 - ์ •ํ•ด์ค€ ์ฝ”๋”ฉ ๊ทœ์•ฝ์— ์œ„๋ฐ˜๋˜๋Š” ๊ฒƒ๋“ค์„ ๊ฒ€์‚ฌํ•ด์คŒ. ์ง์ ‘ ์ฝ”๋”ฉ ๊ทœ์•ฝ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ๊ฐ€๋Šฅ.
 ์•ฝ์  - ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์—์„œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ ๋นŒ๋“œ๊ณผ์ •์ด ํ•„์ˆ˜  - ๋ณต์ œ๋œ ์ฝ”๋“œ๋ฅผ ์ฐพ๋Š” ์†๋„๊ฐ€ ๋Š๋ฆผ  - ์‹ค์ œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ
 ๊ทœ์น™ ์ˆ˜  408  234  132
๊ทœ์น™ ์นดํ…Œ๊ณ ๋ฆฌ
 Correctness
 Bad practice
 Dodgy code
 Multithreaded Correctness 
 Performance Malicious 
 Code Vulnerability
 Security Experimental
 Internationalization


 JSP 
 - Basic JSF 
 - Basic JSP
 XSL 
 - XPath in XSL
 Java 

 - Design 
 - Coupling 
 - Jakarta Commons Logging 
 - Basic 
 - Strict Exceptions 
 - Security Code Guidelines 
 - Java Logging 
 - Android -Controversial 
 - Comments 
 - Type Resolution 
 - Empty Code 
 - String and StringBuffer 
 - Code Size 
 - Braces 
 - Unused Code 
 - Unnecessary 
 - J2EE 
 - JavaBeans 
 - Migration 
 - Import Statements 
 - JUnit 
 - Naming 
 - Finalizer 
 - Optimization 
 - Clone Implementation
 Ecmascript
 
 - Basic Ecmascript 
 - Unnecessary 
 - Braces 
 XML
 
 - Basic XML
 Annotations
 Block Checks
 Class Design
 Coding
 Duplicate Code
 Headers
 Imports
 Javadoc Comments
 Metrics
 Miscellaneous
 Modifiers
 Naming Conventions
 Regexp
 Size Violations
 Whitespace

์ถœ์ฒ˜ : http://www.sw-engineering-candies.com/blog-1/comparison-of-findbugs-pmd-and-checkstyle

 

2020๋…„ 5์›” ์—…๋ฐ์ดํŠธ

์‹ค์ œ๋กœ ์„ธ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ ํ…Œ์ŠคํŠธ๋„ ํ•ด๋ณด์•˜๊ณ  FindBugs๋Š” ์‹ค์ œ ์„œ๋น„์Šค์— ๊ธฐ๋Šฅ์œผ๋กœ ์ ์šฉ๋„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ ๋ถ„์„์„ ์œ„ํ•ด์„œ๋Š” FindBugs๊ฐ€ ๋‹จ์—ฐ ์ตœ๊ณ ์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝ”๋”ฉ์ปจ๋ฒค์…˜์„ ์ •ํ•ด๋†“๊ณ  ํ™•์ธํ•˜๊ธฐ์—๋Š” CheckStyle์ด ์ข‹์Šต๋‹ˆ๋‹ค. 

FindBugs์™€ CheckStyle์€ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์  ์ž์ฒด๊ฐ€ ๋‹ค๋ฅธ ํˆด์ด์—ˆ์Šต๋‹ˆ๋‹ค.

PMD๋Š” ์ด๋„์ €๋„ ์•„๋‹Œ ๊ทธ์ €๊ทธ๋Ÿฐ ํˆด๋กœ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.

 

 

--- ์ดํ•˜ ์ตœ์ดˆ ๋ฐœํ–‰๊ธ€ ---

์ถ”์ฒœ ์‚ฌํ•ญ

ํ•„์š”์— ๋”ฐ๋ผ ํ•˜๋‚˜์”ฉ๋งŒ ์‚ฌ์šฉํ•˜์…”๋„ ๋˜์ง€๋งŒ ์„ธ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ์ข€ ๋” ํ™•์‹คํ•œ ์ •์  ํˆด ๋ถ„์„์„ ํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์„ธ ํˆด์„ ๋ชจ๋‘ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ์ œ์ผ๋จผ์ € FindBugs๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ณ  ๊ทธ ๋‹ค์Œ PMD ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ๋งˆ์ง€๋ง‰์— CheckStyle์„ ์‚ฌ์šฉํ•˜์‹ค ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฑด ๋‹ค๋ฅธ ๋ถ„์ด ํ•˜์‹  ๋ง์”€์ด๊ณ ์š”....์ „ CheckStyle๋งŒ ์ž ๊น ์จ๋ดค๋Š”๋ฐ์š”, CheckStyle์€ ๋ญ๋ž„๊นŒ ํšŒ์‚ฌ ๋‚ด๋ถ€์˜ ์ฝ”๋”ฉ ์ •์ฑ…์„ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๋งŒํ•œ ๊ทธ๋Ÿฐ ํˆด์ด๋”๊ตฐ์š”. ๋Œ€์‹  ๋ฃฐ์„ ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ์ฃผ๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด ์ข€ ์‹ซ์–ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”.

 

์•„๋ž˜ ๋งํฌ๋Š” FindBugs ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•œ ๋ฉ”๋ฆด๋žœ๋“œ ์ฃผ๋ฆฝ๋Œ€ ๊ต์ˆ˜๋‹˜์˜ 1์‹œ๊ฐ„ ๋ถ„๋Ÿ‰์งœ๋ฆฌ ์„ธ๋ฏธ๋‚˜์ž…๋‹ˆ๋‹ค.

๊ด€์‹ฌ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ๋ณด์‹œ๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™๋„ค์š”. ์ฐธ๊ณ ๋กœ ์–ธ์–ด๋Š” ์˜์–ด์ž…๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=8eZ8YWVl-2s

 

์ด์ƒ ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ์ฆํ”„ํ•˜์„ธ์š”~~ ^-^

 

 

 

 

 

 

INVISIBLE๊ณผ GONE์˜ ์ฐจ์ด์ ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.


INVISIBLE:

This view is invisible, but it still takes up space for layout purposes.

GONE:

This view is invisible, and it doesn't take any space for layout purposes.


์ด๋ฒˆ์—๋Š” ์ด์ „ ์‹œ๊ฐ„์— ๋งŒ๋“  writeClass()๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ๋ณ€ํ˜•์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ˜น์‹œ๋‚˜ "ํด๋ž˜์Šค ์ƒ์„ฑํ•˜๊ธฐ" ์ฑ•ํ„ฐ๋ฅผ ๊ฑด๋„ˆ๋›ฐ์‹  ๋ถ„๋“ค์„ ์œ„ํ•ด์„œ ์ €~~~~ ์•„๋ž˜์ชฝ์— writeClass() ๋ฉ”์†Œ๋“œ ์†Œ์Šค๋ฅผ ์˜ฌ๋ ค๋†“๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์ž ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”...


๋ณ€ํ˜•ํ•˜๋Š”๊ฑฐ๋Š” ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ClassVisitor๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ œ์ผ ์ฒซ๋ฒˆ์งธ ์‹œ๊ฐ„์— MyClassVisitor๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์ด๊ฑธ ์ด์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


ํฐ ๊ทธ๋ฆผ๋ถ€ํ„ฐ ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”?? ์ˆœ์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ClassWriter ์ƒ์„ฑ

2. ClassWriter๋ฅผ ์ด์šฉํ•˜์—ฌ ClassVisitor ์ƒ์„ฑ ( ClassWriter๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์คŒ )

3. ClassReader๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณ€ํ˜•ํ•˜๊ณ ์žํ•˜๋Š” ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ฝ์–ด๋“ค์ž„

4. cr.accept( ClassVisitor, int ) ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ๋ณ€ํ˜•


์‹ค์งˆ์ ์œผ๋กœ ๋ณ€ํ˜•์„ ํ•˜๋Š” ๋…€์„์€ ๋ฐ”๋กœ ์ด ClassVisitor๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ๋„˜์–ด๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ž, ๊ทธ๋Ÿผ ์šฐ์„  ํด๋ž˜์Šค๋ฅผ ๋ณ€ํ˜•ํ•˜๊ธฐ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ฃ .

private byte[] transformClass(){
        ClassWriter cw = new ClassWriter(0);
        ClassVisitor cv = new MyClassVisitor(Opcodes.ASM5, cw){};
        ClassReader cr = new ClassReader(writeClass());
        cr.accept(cv, 0);
        return cw.toByteArray();
}


์—ฌ๊ธฐ์„œ writeClass()์˜ ์†Œ์Šค๋Š” ์ด ํฌ์ŠคํŠธ ํ•˜๋‹จ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์†Œ์Šค์„ค๋ช…์„ ๋“œ๋ฆฌ์ž๋ฉด ์šฐ์„  cw๋ฅผ ๋งŒ๋“ค๊ณ  cv๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ธ์ž๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธฐ์กด์— ๋งŒ๋“ค์—ˆ๋˜ MyClassVisitor์—๋Š” ์œ„ ์†Œ์Šค์—์„œ ์‚ฌ์šฉํ•œ ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

MyClassVisitorํด๋ž˜์Šค์— ์•„๋ž˜ ์ƒ์„ฑ์ž๋ฅผ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.


public MyClassVisitor(int version, ClassWriter cw) {
        super(version, cw);
}


๋‹ค์‹œ ์†Œ์Šค์„ค๋ช…์œผ๋กœ ๋„˜์–ด์™€์„œ....

์ด๋ ‡๊ฒŒ cv๋ฅผ ์ƒ์„ฑ์„ ํ–ˆ์œผ๋ฉด ์ด์ œ ๋ณ€ํ˜•ํ•  ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  cr์˜ accept()๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฉ๋ฌธ(?)ํ•˜๋ฉด์„œ ๋ณ€ํ™˜์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜์ด ๋œ ํด๋ž˜์Šค ์ •๋ณด๋Š” cw์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๋ญ”๊ฐ€ ๊ฐ„๋‹จํ•œ๊ฒƒ ๊ฐ™์œผ๋ฉด์„œ๋„ ์–ด์ง€๋Ÿฌ์šด๊ฒƒ ๊ฐ™์ฃ ??


์ž, ๊ทธ๋Ÿผ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ด์•ผ ํ•˜๊ฒ ์ฃ ..

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์—ˆ๋˜ MyClassVisitor์˜ visit() ๋ฉ”์†Œ๋“œ๋ฅผ ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”?


@Override
    public void visit(int version, int access, String name,
            String signature, String superName, String[] interfaces) {
        name = "BCItest/Modified";
        super.visit(version, access, name, signature, superName, interfaces);
        System.out.println(name + " extends " + superName + " {");
}


์ž, ์œ„์—์„œ ์˜ค๋ Œ์ง€์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„์ด ์ถ”๊ฐ€๋œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ญ˜ ํ• ๊ฑด์ง€ ์ง์ž‘์ด ๊ฐ€์‹œ๋‚˜์š”?

์ž ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ์ง€๋‚œ ์‹œ๊ฐ„์— ํ–ˆ๋˜ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ์†Œ์Šค๋ฅผ ์กฐ๊ธˆ๋งŒ ์ˆ˜์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


// ๊ธฐ์กด ํ…Œ์ŠคํŠธ ์†Œ์Šค

Class c = new MyClassLoader().defineClass("BCItest.Comparable", writeClass());
System.out.println(c.getName());


// ์ˆ˜์ •ํ•œ ํ…Œ์ŠคํŠธ ์†Œ์Šค

Class c = new MyClassLoader().defineClass("BCItest.Comparable", transformClass());
System.out.println(c.getName());


๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์€ ์˜ค๋ Œ์ง€์ƒ‰์œผ๋กœ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์‹คํ–‰์„ ํ•˜๋ฉด ๋ญ๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”?


ClassLoader๋กœ ์ฝ์–ด์˜ค๋Š” ๊ณผ์ •์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

java.lang.NoClassDefFoundError: BCItest/Comparable (wrong name: BCItest/Modified)


์ž....์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค๋กœ๋”๋ฅผ ์ด์šฉํ•ด์„œ ๋กœ๋“œํ•˜๋ ค๊ณ ํ•œ ํด๋ž˜์Šค๋ช…์€ Comparable์ด์—ˆ๋Š”๋ฐ transformClass()์—์„œ ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค๋Š” Modified์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ฒˆ์—๋Š” BCItest.Modified๋ฅผ ์ฝ์–ด์˜ค๋„๋ก ํ•ด๋ด…์‹œ๋‹ค.


Class c = new MyClassLoader().defineClass("BCItest.Modified", transformClass());
 

์œ„ ์ฒ˜๋Ÿผ defineClass() ๋ฉ”์†Œ๋“œ์— ๋“ค์–ด๊ฐ€๋Š” ์ธ์ž๋ฅผ ๋ฐ”๊ฟ”์ฃผ์„ธ์š”.


์ด์ œ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด๋ฉด BCItest.Modified ๋ผ๊ณ  ์ถœ๋ ฅ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์„๊ฒ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ง€๋‚œ๋ฒˆ์— ํ–ˆ๋˜ MyClassVisitor๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๋ฉด ํด๋ž˜์Šค ๊ตฌ์กฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ๋„ ๋ณด์‹ค ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


์–ด๋ ต์ง€ ์•Š์ฃ ?


์ž ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ BCI์˜ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ชจ๋‘ ์ตํžŒ ์…ˆ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ˆ˜์ • ๊นŒ์ง€ ํ–ˆ์œผ๋‹ˆ๊นŒ์š”.


ASM์„ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด์˜ค๊ณ , ์ƒ์„ฑ ๋ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด์•˜๋Š”๋ฐ์š”


์ œ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์•ฝํ•ด์„œ ์ฒซ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ํ•œ ๋‚ด์šฉ์„ ์†Œ์Šค๋ฅผ ์ฒจ๋ถ€ํ–ˆ์œผ๋‹ˆ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด์„œ ์ฒœ์ฒœํžˆ ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•ด๋ณด์„ธ์š” ^_^


๋‹ค์Œ์‹œ๊ฐ„์—๋Š” ์ˆ˜์ •ํ• ๋•Œ ์ตœ์ ํ™” ๊ด€๋ จ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿผ ์—ฌ๋Ÿฌ๋ถ„ ์•ˆ๋…€~์—‰~









์ถœ์ฒ˜ : ASM 4 ๊ฐ€์ด๋“œ ๋ฌธ์„œ






-----------------writeClass()-----------------------

BCItest ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์†Œ์Šค๊ฐ€ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


private byte[] writeClass(){
        ClassWriter cw = new ClassWriter(0);
        cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
                "BCItest/Comparable", null, "java/lang/Object",
                null);
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "LESS", "I",
        null, new Integer(-1)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "EQUAL", "I",
        null, new Integer(0)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "GREATER", "I",
        null, new Integer(1)).visitEnd();
        cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo",
        "(Ljava/lang/Object;)I", null, null).visitEnd();
        cw.visitEnd();

        return cw.toByteArray();
}

์˜ค๋Š˜์€ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋Š” ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์™€๋ดค์Šต๋‹ˆ๋‹ค.


ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ• ๋•Œ๋Š” ClassWriter ์ปดํฌ๋„ŒํŠธ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


์ž, ์•„๋ž˜์™€ ๊ฐ™์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ClassWriter๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


:: ์ƒ์„ฑํ•˜๋ ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค

package BCItest;
public interface Comparable extends Mesurable {
    int LESS = -1;
    int EQUAL = 0;
    int GREATER = 1;
    int compareTo(Object o);
}


-- ์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ ์†Œ์Šค

private byte[] writeClass(){
        ClassWriter cw = new ClassWriter(0);
        cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE,
        "BCItest/Comparable", null, "java/lang/Object",
        new String[] { "BCItest/Mesurable" });
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "LESS", "I",
        null, new Integer(-1)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "EQUAL", "I",
        null, new Integer(0)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC + Opcodes.ACC_FINAL + Opcodes.ACC_STATIC, "GREATER", "I",
        null, new Integer(1)).visitEnd();
        cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_ABSTRACT, "compareTo",
        "(Ljava/lang/Object;)I", null, null).visitEnd();
        cw.visitEnd();

        return cw.toByteArray();
}


๊ฐ„ ๋‹จํ•˜๊ฒŒ ์†Œ์Šค๋ฅผ ํ›‘์–ด๋ณผ๊นŒ์š”?? ์šฐ์„  ClassWriter ( ์ดํ•˜ cw ) ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  visit, visitField, visitMethod ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๋’ค์— ๋งˆ์ง€๋ง‰์œผ๋กœ visitEnd๋ฅผ ํ˜ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์†Œ๋“œ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ACC_XXX๋ผ๋Š” ์ƒ์ˆ˜๋“ค์€ ASM์— ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด์žˆ๋Š” Opcodes ๋“ค์ž…๋‹ˆ๋‹ค. Opcodes ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ•„ ๋“œ ์„ ์–ธ๋ถ€๋ฅผ ๋ณด์‹œ๋ฉด ์ฒซ๋ฒˆ์งธ ํ•„๋“œ๊ฐ€ int LESS ๋ผ๋Š” ํ•„๋“œ์ฃ . ์šฐ์„  ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์„ ์–ธ๋˜์–ด์žˆ๋Š” int๋ผ์„œ visitField๋ฉ”์†Œ๋“œ์—์„œ public, final, static์ด๋ผ๋Š” ์ƒ์ˆ˜๊ฐ’์„ ์ฃผ๊ณ  ๊ทธ ๋‹ค์Œ์— ํ•„๋“œ๋ช…(LESS)๊ณผ ํ•„๋“œ ํƒ€์ž…(I)์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์— null์€ generic๊ด€๋ จ ํ•„๋“œ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ํ•ด๋‹น ํ•„๋“œ์— ํ• ๋‹นํ•  ๊ฐ’์ž…๋‹ˆ๋‹ค. ์œ„ ์˜ˆ์ œ์—์„œ๋Š” new Integer(-1)์ด์ฃ . 


๊ทธ๋ฆฌ๊ณ  cw๋ฅผ ๋ฐ”์ดํŠธํ˜•ํƒœ๋กœ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ๋ฐ”์ดํŠธ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ์„ฑ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ๊นŒ์š”??


์šฐ์„  ํด๋ž˜์Šค๋กœ๋”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด MyClassLoader ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

class MyClassLoader extends ClassLoader {
    public Class defineClass(String name, byte[] b) {
        return defineClass(name, b, 0, b.length);
    }   
}


๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์ฒ˜๋Ÿผ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.


Class c = new MyClassLoader().defineClass("BCItest.Comparable", writeClass());
System.out.println(c.getName());


๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด BCItest.Comparable ์ด๋ผ๊ณ  ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ์ด ๋ ๊ฒ๋‹ˆ๋‹ค.

์—ฌ ๊ธฐ์„œ ์ž ๊น!!! ์ œ๊ฐ€ ์‹ค์Šตํ•ด๋ณธ ๊ฒฐ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Mesurable์„ ์ƒ์†ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— Measurableํด๋ž˜์Šค๊ฐ€ ์—†๋‹ค๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ 1. Measurable์„ ์ƒ์„ฑํ•ด ์ฃผ์‹œ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด 2. writeClass()์˜ cw.visit() ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž์ธ new String[] { " .... "} ๋ฅผ null ๋กœ ๋ฐ”๊ฟ”์ฃผ์‹œ๋ฉด ์‹คํ–‰์ด ์ž˜ ๋ ๊ฒ๋‹ˆ๋‹ค.



๊ทธ๋Ÿผ ๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” ํด๋ž˜์Šค ๋ณ€ํ™˜์— ๋Œ€ํ•ด์„œ ์˜ฌ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.







์ถœ์ฒ˜ : ASM ๊ฐ€์ด๋“œ





BCI ( Byte Code Instrumentation )์„ ์œ„ํ•œ ASM 5.0 ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

ASM์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž๋ฉ”๋‰ด์–ผ ๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€์ด๋“œ๋Š” http://asm.ow2.org/index.html ์ด๊ณณ์—์„œ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ ๊ทธ ์ฒซ ์‹œ๊ฐ„. ์‚ฌ์šฉ์ž ๋ฉ”๋‰ด์–ผ์„ ์ฝ์–ด๊ฐ€๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ์กฐ๊ธˆ์”ฉ ์ •๋ฆฌํ•ด์„œ ๋ธ”๋กœ๊ทธ์— ์˜ฌ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ํด๋ž˜์Šค ํŒŒ์ผ ์ฝ์–ด์„œ ์ •๋ณด ์–ป์–ด์˜ค๋Š” ๋ถ€๋ถ„๋งŒ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  ์ดํด๋ฆฝ์Šค์— ASM 5.0 ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.  

 

http://forge.ow2.org/project/showfiles.php?group_id=23

 

์œ„ ๋งํฌ์— ๊ฐ€์‹œ๋ฉด ๋ฒ„์ „๋ณ„๋กœ zip ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.( ๋งํฌ๊ฐ€ ๊นจ์งˆ ๊ฒƒ์„ ์—ผ๋ คํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „ 5.0.3์„ ์ฒจ๋ถ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค )

 

๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ zipํŒŒ์ผ์„ ์••์ถ•ํ•ด์ œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ œ ์ดํด๋ฆฝ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ํ”„๋กœ์ ํŠธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ๋งŒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

configure build pathํ•˜์…”์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ค์น˜ ์™„๋ฃŒ!

 

์ž ์ด์ œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋‹ˆ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ•˜์ฃ .

 

BCITestํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฐ‘์— ์„ธ ๊ฐœ์˜ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

BCITest.java
HelloWorld.java
MyClassVisitor.java

 

// BCITest.java ์†Œ์Šค ( JUnit Test๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค ) 


package BCItest;

import java.io.IOException;
import org.junit.Test;
import org.objectweb.asm.ClassReader;

public class BCITest {
    @Test
    public void test() throws IOException {
        MyClassVisitor cv = new MyClassVisitor(327680);    // ASM5 = 327680
        ClassReader cr = new ClassReader("BCITest.HelloWorld");       // ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ X ( bcitest.helloworld ๋ผ๊ณ ํ•ด๋„ ์‹คํ–‰๋จ )
        cr.accept(cv, 2);
    }

 

ํ…Œ์ŠคํŠธ ํ•ด๋ณด์‹ค ๋•Œ์—๋Š” BCITest.HelloWorld ๋Œ€์‹ ์— ๋‹ค๋ฅธ ์ž„์˜์˜ ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด java.lang.String์ด๋ผ๋“ ๊ฐ€ java.lang.Exception์ด๋ผ๋“ ๊ฐ€ ํ•˜๋Š” ํด๋ž˜์Šค๋“ค ๋ง์ด์ฃ .

 

// HelloWorld.java ์†Œ์Šค

 

package BCItest;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!!");
    }
}

 

// MyClassVisitor.java ์†Œ์Šค

package BCItest;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.TypePath;

public class MyClassVisitor extends ClassVisitor {

    public MyClassVisitor(int arg0) {
        super(arg0);
    }
    @Override
    public void visit(int version, int access, String name,
            String signature, String superName, String[] interfaces) {
        super.visit(version, access, name, signature, superName, interfaces);
        System.out.println(name + " extends " + superName + " {");
    }
    @Override
    public void visitEnd() {
        super.visitEnd();
        System.out.println("}");
    }
    @Override
    public FieldVisitor visitField(int access, String name, String desc,
            String signature, Object value) {
        System.out.println(" " + desc + " " + name);
        return super.visitField(access, name, desc, signature, value);
    }
    @Override
    public MethodVisitor visitMethod(int access, String name,
            String desc, String signature, String[] exceptions) {
        System.out.println(" " + name + desc);
        return super.visitMethod(access, name, desc, signature, exceptions);
    }
}
 

์œ„์—์„œ MyClassVisitor๋Š” ClassVisitor๋ฅผ ์ƒ์†ํ•œ ๋’ค ๋ช‡๋ช‡ ๋ฉ”์†Œ๋“œ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  ์ œ๊ฐ€ ์ œ๊ณตํ•ด๋“œ๋ฆฐ ์†Œ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

BCItest/HelloWorld extends java/lang/Object {
 <init>()V
 main([Ljava/lang/String;)V

 

์—ฌ๊ธฐ์„œ <init>์€ ์ƒ์„ฑ์ž๋ฅผ ๋งํ•˜๊ณ  ๋งˆ์ง€๋ง‰์˜ V๋Š” void๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.  

 

์–ด๋–ค๊ฐ€์š”? ์–ด๋ ต์ง€ ์•Š์ฃ ?   

 

HelloWorld ํด๋ž˜์Šค์— ๋ฉ”์†Œ๋“œ๋ฅผ ๋” ๋„ฃ์–ด๋ณด๊ณ  ( ๋ฆฌํ„ด ํƒ€์ž…์ด๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜, ์ข…๋ฅ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„œ ) ํ…Œ์ŠคํŠธํ•ด๋ณด์„ธ์š”~ 


์ฐธ๊ณ ๋กœ ์•„๋ž˜๋Š” Type Descriptor ์™€ Method descriptor ์ž…๋‹ˆ๋‹ค.  

 

๋ญ๊ฐ€ ๋ญ˜ ์˜๋ฏธํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๋Š” ๊ฑฐ๋‹ˆ๊นŒ ์ด๊ฑฐ๋Š” ์™ธ์šฐ์‹œ๋Š”๊ฒŒ ์ข‹์„๊ฑฐ์—์š”~







์ฐธ๊ณ ๋กœ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด๋“ค์ด๋Š” ๋ฐฉ๋ฒ•์€ BCITestํด๋ž˜์Šค์—์„œ ClassReader์ƒ์„ฑํ•  ๋•Œ ์ด๋ฆ„์„ ์ฃผ๋Š” ๋ฐฉ๋ฒ• ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ ์šฉ์ž ๋ฉ”๋‰ด์–ผ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…์ด ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„, ๊ฐ’, byte array, input stream์„ ์ด์šฉํ•ด์„œ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ input stream์„ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ์ฝ์–ด๋“ค์ผ ๋•Œ๋Š” ํด๋ž˜์Šค ๋กœ๋”์˜ getResourceAsStream ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์ œ๊ฐ€ ๋ฐ”๋กœ ๋ฐ‘์— ๋‚˜์™€์žˆ์ฃ ?


The class that must be read can be specified by name, as above, or by value, as a byte array or as an InputStream. An input stream to read the content of a class can be obtained with the ClassLoaderโ€™s getResourceAsStream method with:

 

cl.getResourceAsStream(classname.replace(โ€™.โ€™, โ€™/โ€™) + ".class");

 

์ž, ํด๋ž˜์Šค ํŒŒ์ผ ์ฝ๊ธฐ๋Š” ์ด์ฏค์—์„œ ๋๋‚ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…์ด ๊ธธ๋ฉด ๋จธ๋ฆฌ๋งŒ ์•„ํ”„์ฃ .

 

๋‹ค์Œ ์‹œ๊ฐ„์—๋Š” ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ์ฝ๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค~

 

๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์—ฌ๊ธฐ์„œ ์ด๋งŒ~ 

 

 ์ถœ์ฒ˜ : ASM 4 ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ ( ํ…Œ์ŠคํŠธ๋Š” ASM 5 ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. )






์•ˆ๋…•ํ•˜์„ธ์š”, ์กฐ๊ธˆ์ „์— ๊น€ํ”„(GIMP) ์ด๋ฏธ์ง€ํˆด์„ ์†Œ๊ฐœํ•ด ๋“œ๋ ธ์—ˆ๋Š”๋ฐ์š”


์ž ๊น ์จ๋ดค๋”๋‹ˆ ์ด๊ฒŒ ๋ฒกํ„ฐ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆฌ๋Š” ํˆด์€ ์•„๋‹Œ๊ฒƒ ๊ฐ™์•„์„œ

๋ฒกํ„ฐ์ด๋ฏธ์ง€ ํˆด์„ ๋‹ค์‹œ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์•„๋‚ธ ๋”ฐ๋ˆํ•œ ๋ฒกํ„ฐ์ด๋ฏธ์ง€ ํˆด์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


๊ทธ ์ด๋ฆ„ํ•˜์•ผ Inkscape ์ž…๋‹ˆ๋‹ค.


์ด ์—ญ์‹œ ์œˆ๋„์šฐ, ๋งฅ, ๋ฆฌ๋ˆ…์Šค์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํˆด์ž…๋‹ˆ๋‹ค.


์•„๋ž˜๋Š” ์ž‰ํฌ์Šค์ผ€์ดํ”„์˜ ํ™ˆํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.

๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์–ด์„œ ๋“ค์–ด๊ฐ€๋ฉด ๋ฐ”๋กœ ํ•œ๊ตญ์–ด๋กœ ๋œน๋‹ˆ๋‹ค.

(์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.)







์ƒ๋‹จ ๋ฉ”๋‰ด์—๋„ ์žˆ๊ณ  ์šฐ์ธก์—๋„ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์ด ์ž˜ ๋ณด์ด๋„ค์š”.

์ €๋Š” ์šฐ์ธก์— ์ƒˆ ๋ถ€๋ฆฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์Šต๋‹ˆ๋‹ค.



OS๋ณ„๋กœ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์ผ ์ขŒ์ธก์˜ ํŽญ๊ท„์ด ๋ฆฌ๋ˆ…์Šค์šฉ์ด๊ณ  ๊ฐ€์šด๋ฐ๊ฐ€ ์œˆ๋„์šฐ์šฉ ์ œ์ผ ์šฐ์ธก์ด ๋งฅ์šฉ์ž…๋‹ˆ๋‹ค.


์ „ ์ง€๊ธˆ ์œˆ๋„์šฐ ์ปดํ“จํ„ฐ ์•ž์— ์•‰์•„์žˆ์œผ๋‹ˆ ๊ฐ€์šด๋ฐ ์œˆ๋„์šฐ ๋กœ๊ณ  ๊ทธ๋ฆผ์„ ํด๋ฆญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.




์œˆ๋„์šฐ๋Š” ๋˜ 32๋น„ํŠธ์™€ 64๋น„ํŠธ๊ฐ€ ์žˆ์œผ๋‹ˆ ํ•œ๋ฒˆ ๋” ์„ ํƒ์„ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ปดํ“จํ„ฐ๋Š” 64๋น„ํŠธ์ด๋ฏ€๋กœ 64๋น„ํŠธ์šฉ ์•„๋ž˜์ชฝ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•ด์„œ ์„ค์น˜ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ ์‹คํ–‰์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.



์…‹์—…ํ™”๋ฉด์€ ๋‹ค๊ตญ์–ด์ฒ˜๋ฆฌ๊ฐ€ ์•ˆ๋˜์žˆ๋„ค์š”.



๋ผ์ด์„ผ์Šค ๋™์˜์— ์ฒดํฌ๋ฅผ ํ•˜๊ณ  ๋‹ค์Œ~~




๋ญ ๊ธฐ๋ณธ์„ค์ •์œผ๋กœ ์„ค์น˜ํ• ๊ฑฐ๋ƒ ์•Œ์•„์„œ ์„ ํƒํ• ๊ฑฐ์•ผ ์ „๋ถ€ ๋‹ค ํ• ๊ฑฐ๋ƒ ๋ฌผ์–ด๋ณด๋Š” ํ™”๋ฉด์€ ๋งŽ์ด๋“ค ๋ณด์…จ์ฃ ? ๊นŒ์ด๊บผ ๋Œ€์ถฉ ๊ทธ๋ƒฅ Typical๋กœ ์„ค์น˜ํ•ด๋ด…์‹œ๋‹ค.



Install ํด๋ฆญ! ํด๋ฆญ!




์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!!!! ์šฐ์™€!!!!!

์ด์ œ ๋‚˜๋„ ๊ฒŒ์ž„์ผ€๋ฆญํ„ฐ๋ฅผ ๋ฒกํ„ฐ์ด๋ฏธ์ง€๋กœ ๊ทธ๋ฆด์ˆ˜ ์žˆ๋‹ค!!!

ํฌํ† ์ƒต ์ผ๋Ÿฌ์ŠคํŠธ ํ•„์š”์—†๋‹ค!!! ์šฐํ•˜ํ•˜!!!


์ด์ƒ ์นœ์ ˆํ•œ ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค.


^-^ ใ…Žใ…Ž


์ข‹์€ํ•˜๋ฃจ ๋˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„~~



์•ˆ๋…•ํ•˜์„ธ์š” ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค~


์˜ค๋Š˜์€ ๋ฌด๋ฃŒ ์ด๋ฏธ์ง€ ํŽธ์ง‘ ํˆด์„ ์†Œ๊ฐœํ•ด ๋“œ๋ฆฌ๋ ค ํ•ฉ๋‹ˆ๋‹ค.


์ œ๊ฐ€ ์š”์ƒˆ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์„ ๋…ํ•™์œผ๋กœ ํ•˜๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.


๊ทผ๋ฐ ๊ฒŒ์ž„์ด๋ž€๊ฒŒ ๋ชจ๋“  ํŒŒํŠธ๊ฐ€ ๋‹ค ์ค‘์š”ํ•˜์ง€๋งŒ ๊ทธ ์ค‘์—์„œ๋„ ์‚ฌ๋žŒ๋“ค์˜ ์‹œ์„ ์„ ๋„๋Š” ๋ฉ‹์žˆ๋Š” ๊ทธ๋ž˜ํ”ฝ์ด ์•„๋ฌด๋ž˜๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜์ง€ ์•Š๋‚˜ ์‹ถ์Šต๋‹ˆ๋‹ค.


์ „ ๊ฐœ๋ฐœ์ž์ด์ง€ ๋””์ž์ด๋„ˆ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์˜ ์ฒซ์ธ์ƒ์ด ์ค‘์š”ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๊ฒŒ์ž„์˜ ์ฒซ์ธ์ƒ๋„ ์ค‘์š”ํ•œ๋ฐ ๊ทธ ์ฒซ์ธ์ƒ์€ ๋ฐ”๋กœ ์ด ๊ทธ๋ž˜ํ”ฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


์—ฌ๊ธฐ์„œ ๊ทธ๋ž˜ํ”ฝ์ด๋ผ๋Š”๊ฑด ๋ญ ํ•ด์ƒ๋„๊ฐ€ ์ข‹์€ 3D ๊ทธ๋ž˜ํ”ฝ ์ด๋Ÿฐ๊ฑธ ๋งํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ ์š” ๊ทธ๋ƒฅ 2D๋ผ๋„ ์ข€ ๋” ๊ท€์—ฝ๊ณ  ์ด์˜๊ณ  ๊น”๋”ํ•œ ๊ทธ๋Ÿฐ ๊ทธ๋ฆผ์„ ๋งํ•˜๋Š” ๊ฑฐ์—์š” ^-^


์„œ๋‘๊ฐ€ ์ข€ ๊ธธ์—ˆ๋„ค์š”.



์ œ๊ฐ€ ์ด๋ฒˆ์— ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๋Š” ํˆด์€ GNU ๋ผ์ด์„ผ์Šค๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” GIMP (GNU Image Manupulation Program) ๋ผ๋Š” ํˆด์ž…๋‹ˆ๋‹ค.


Mac, Windows, Linux์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ํˆด์ž…๋‹ˆ๋‹ค.


์•„๋ž˜๋Š” GIMP์˜ ํ™ˆํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค. ( ์•„๋ž˜ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜์‹œ๋ฉด ๊น€ํ”„ ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. )




์—ญ์‹œ Download ๋ฒ„ํŠผ์€ ๋ˆˆ์— ๋„๊ฒŒ ํ•ด๋†“์•˜๋„ค์š”. ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค~~ ๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ „ ์œˆ๋„์šฐ์—์„œ ํด๋ฆญํ•˜๋‹ˆ๊นŒ ์•„๋ž˜์ฒ˜๋Ÿผ for Windows ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๋„๋ก ๋‚˜์˜ค๋Š”๋ฐ ์•„๋งˆ ๋‹ค๋ฅธ OS ์“ฐ์‹œ๋Š” ๋ถ„๋“ค์€ ํ•ด๋‹น OS์šฉ GIMP ๋‹ค์šด๋กœ๋“œ ๋งํฌ๊ฐ€ ๋‚˜์˜ฌ๊ฒ๋‹ˆ๋‹ค.







์ž, ๊ทธ๋Ÿผ Download ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๋‘๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ ์ฃผํ™ฉ์ƒ‰์œผ๋กœ ๋œ ๋ฒ„ํŠผ์„ ์„ ํƒํ•˜์‹œ๋ฉด ๋˜์š”~


๋‹ค์šด๋ฐ›์•„์„œ ์„ค์น˜ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Setup ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๋ผ๊ณ  ๋‚˜์˜ค๋Š”๋ฐ ํ•œ๊ตญ์–ด๋Š” ์—†๋„ค์š”.


์ €๋Š” ์˜์–ด๋ฅผ ์ž˜ํ•˜๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ์˜์–ด ์„ ํƒํ•ฉ๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹






๊ทธ๋žฌ๋”๋‹ˆ ์•„๋ž˜์ฒ˜๋Ÿผ ์‹œ์›ํ•œ ๋ฐ”๋‹ค์†์—์„œ ์ˆจ๋ชป์‰ฌ๊ณ ์žˆ๋Š”๋ฐ ์›ƒ๊ณ ์žˆ๋Š” ๊ฒ€์€์—ฌ์šฐ๊ฐ™์€ ๋…€์„์ด ๋‚˜์˜ค๋„ค์š”.





๊ทธ๋ƒฅ Install ๋ฒ„ํŠผ ํด๋ฆญ! ํด๋ฆญ!


์•„๋ž˜์ฒ˜๋Ÿผ ์„ค์น˜๊ฐ€ ์‹œ์ž‘์ด ๋ฉ๋‹ˆ๋‹ค...





์•„๋ž˜๋Š” ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ํ™”๋ฉด์ด๊ตฌ์š”





์ด์ œ ์‹คํ–‰์‹œ์ผœ๋ด์•ผ๊ฒ ์ฃ ??




์…‹์—…๋•Œ์—๋Š” ์˜์–ด๋กœ๋งŒ ๋‚˜์™”๋Š”๋ฐ ์…‹์—…ํ•˜๋‹ˆ๊นŒ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค๊ตญ์–ด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋†จ๋Š”์ง€ ํ•œ๊ธ€๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.






๋ญ”๊ฐ€ ํฌํ† ์ƒต๊ณผ ๋น„์Šทํ•œ ๋ถ„์œ„๊ธฐ๊ฐ€ ์žˆ๋Š”๊ฒƒ ๊ฐ™๋„ค์š”.


์ด์ƒ ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค~~


์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.~ ^-^


ํ›„๋ฅ์ง€๊ทผํ•œ ์—ฌ๋ฆ„ ๊ฑด๊ฐ• ์กฐ์‹ฌํ•˜์‹œ๊ตฌ์š”~


๋ชจ๋‘ ์ฆํ”„ํ•˜์„ธ์š”~~~


-------------- updated -------------------

๊น€ํ”„ 2.4 ํ•œ๊ธ€ํŒ ๋ฉ”๋‰ด์–ผ ๋งํฌ ( GIMP Korean Manual )





์•ˆ๋…•ํ•˜์„ธ์š”~์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค~

 ๋ฐฉ๊ธˆ ์ „์— ํฌ์ŠคํŒ… ํ–ˆ์—ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋Š๊ณ  ๋˜ ํฌ์ŠคํŒ…ํ•˜๋„ค์š” ใ…Žใ…Ž


์ง€๋‚œ ์‹œ๊ฐ„์—๋Š” ๋ฐฐ๊ฒฝํ™”๋ฉด ๋„ฃ๊ณ  ๋•…๋„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์ผ€๋ฆญํ„ฐ๋„ ๋„ฃ์–ด์„œ ์›€์ง์—ฌ๋ดค์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜์žˆ์—ˆ์ฃ ? ๋ณดํ†ต ํ™”์‚ดํ‘œ๋ฅผ ๋ˆ„๋ฅด๊ณ ์žˆ์œผ๋ฉด ๊ณ„์† ์—ฐ์†์ ์œผ๋กœ ์›€์ง์—ฌ์ค˜์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡๊ฒŒ ๋˜์ง€ ์•Š์•˜๋˜ ๊ฑฐ์ฃ .


์ž, ๊ทธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.


์šฐ์„  ์ˆ˜์ •๋œ Player ์†Œ์Šค๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š” ~

public class Player extends Actor {

private Sprite characterSprite;

boolean leftMove;
boolean rightMove;

float x;

Player(){
characterSprite = new Sprite(new Texture("player.png"));
characterSprite.setBounds(Gdx.graphics.getWidth()/2-100, 100,
 
Gdx.graphics.getWidth()/10, Gdx.graphics.getHeight()/5);
}
public Sprite getCharacterSprite(){
return characterSprite;
}
public void updateMotion(){
if ( leftMove ){
x = characterSprite.getX() - 5;
characterSprite.setX(x);
}
if ( rightMove ){
x = characterSprite.getX() + 5;
characterSprite.setX(x);
}
}

public void setLeftMove(boolean t){
if ( rightMove && t ) rightMove = false;
leftMove = t;
}
public void setRightMove(boolean t){
if ( leftMove && t ) leftMove = false;
rightMove = t;
}
}

setLeftMove์™€ setRightMove ๊ทธ๋ฆฌ๊ณ  updateMotion์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒˆ๋กœ ์ƒ๊ฒผ๋„ค์š”.


๊ทธ๋Ÿผ ์ด๋ฒˆ์—” CharacterProcess์˜ ์†Œ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ๋ณผ๊นŒ์š”??

@Override
public boolean keyDown(int keycode) {
System.out.println("keycode : " + keycode);
switch(keycode){
case 21:
player.setLeftMove(true);
break;
case 22:
player.setRightMove(true);
break;
}
return true;
}

@Override
public boolean keyUp(int keycode) {

switch(keycode){
case 21:
player.setLeftMove(false);
break;
case 22:
player.setRightMove(false);
break;
}
return true;
}

๋„ค, ์œ„ ์ฒ˜๋Ÿผ keyUp ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•ด์คฌ๊ณ ์š” keyDown๋ฉ”์†Œ๋“œ๋Š” ๋ญ”๊ฐ€ ๋˜๊ฒŒ ๊ฐ„๋‹จํ•ด์กŒ๋„ค์š” ๊ทธ์ตธ? ^-^


์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•˜๋ฉด ํ‚ค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋Š” ๋๋‚œ๊ฒ๋‹ˆ๋‹ค. ์—? ์ด๊ฒŒ ๋ญ๋ƒ๊ตฌ์š”?

ํ•œ๋ฒˆ ์†Œ์Šค๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š” ^-^ ์ €๋Š” ์นœ์ ˆํ•œ ์ผ€์ด์น˜๋‹ˆ๊นŒ์š” ใ…Žใ…Žใ…Ž

์ž, ์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๋€ CharacterProcess์—์„œ์˜ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ํ•œ๋ฒˆ ๋ณด์‹œ์ฃ .

์™ผ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๊ฐ€ ๋ˆŒ๋ฆฌ๋ฉด

1. player.setLeftMove(true)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

2. setLeftMove(true)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์•„๋ž˜ ๋กœ์ง์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

 - ๋งŒ์•ฝ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์ค‘์ด์—ˆ๋‹ค๋ฉด rightMove๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

 - ๋ฌด์กฐ๊ฑด leftMove๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

3. ๋


์™ผ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉด 

1. player.setLeftMove(false)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

2. setLeftMove(false)๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์•„๋ž˜ ๋กœ์ง์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

 - if๋ฌธ์—์„œ false์™€ && ์กฐ๊ฑด์ด ๋งž๋ฌผ๋ฆฌ๋ฉด์„œ if๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 - ๋ฌด์กฐ๊ฑด leftMove๋ฅผ false๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.


์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ ํ‚ค๊ฐ€ ๋ˆŒ๋ฆฌ๊ฑฐ๋‚˜ ์˜ฌ๋ผ๊ฐ”์„ ๋•Œ๋„ ๋™์ผํ•œ ๋กœ์ง์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.


์ž, ์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ผ์€ ํ‚ค๊ฐ€ ๋ˆŒ๋ ธ์„ ๋•Œ ์ผ€๋ฆญํ„ฐ์˜ ์ด๋™์„ ๊ฒฐ์ •์ง“๋Š” boolean๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ๋งŒ ํ•˜๋Š” ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ขŒํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ  ์•„์ง ํ™”๋ฉด์— ๋ฟŒ๋ ค์ง€๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.


์ž ๊ทธ๋Ÿผ ๋ฉ”์ธ ํด๋ž˜์Šค์—์„œ๋Š” ๋ญ๊ฐ€ ์ˆ˜์ •์ด ๋๋Š”์ง€ ํ•œ๋ฒˆ ๋ณด์‹ค๊นŒ์š”?

    @Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.disableBlending();
batch.draw(background, 0, 0, 800, 480);
batch.enableBlending();
// let's draw ground image
batch.draw(groundTextureRegion, backgroundPos, 0, 800, 100);
if ( backgroundPos + 800 > 0 && backgroundPos + 800 < 800){
batch.draw(groundTextureRegion, backgroundPos + 800, 0, 800, 100);
}
// let's draw player
inputProcessor.getPlayer().getCharacterSprite().draw(batch);
batch.end();
updateScene();
inputProcessor.getPlayer().updateMotion();

}


์ž, ๋ฉ”์ธ ํด๋ž˜์Šค์—์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์€ render()๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์ค„์— inputProcessor.getPlayer().updateMotion() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๊ฒŒ ๋ฌด์Šจ ๋ฉ”์†Œ๋“œ์˜€๋Š”์ง€ ์œ„์—์„œ ๋ณด์…จ๋‚˜์š”?

๊ทธ๋ƒฅ ์ง€๋‚˜์นœ ๋ถ„๋“ค์„ ์œ„ํ•ด์„œ ์•„๋ž˜ ๋‹ค์‹œ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.


    public void updateMotion(){
if ( leftMove ){
x = characterSprite.getX() - 5;
characterSprite.setX(x);
}
if ( rightMove ){
x = characterSprite.getX() + 5;
characterSprite.setX(x);
}
}

์ด ๋ฉ”์†Œ๋“œ๋Š” ์œ„์—์„œ Playerํด๋ž˜์Šค์— ์ƒˆ๋กœ์ด ์ถ”๊ฐ€๋˜์—ˆ๋˜ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•˜๋Š” ์ผ์€ Player๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” leftMove์™€ rightMove ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์—๋”ฐ๋ผ ์ผ€๋ฆญํ„ฐ์˜ ์ขŒํ‘œ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ์ผ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ์ขŒํ‘œ๋งŒ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๋ฉ”์ธ ํด๋ž˜์Šค์—์„œ ์ด ์ผ€๋ฆญํ„ฐ๋ฅผ ๋ฟŒ๋ฆฌ๊ณ ์žˆ์ฃ .


์ด์ œ ์ด๋ ‡๊ฒŒ ์ˆ˜์ •๋œ ์†Œ์Šค๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”.


๋ฐฉํ–ฅํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ณ ์žˆ๋Š” ๋™์•ˆ ์ผ€๋ฆญํ„ฐ๊ฐ€ ๊ณ„์† ์›€์ง์ž…๋‹ˆ๋‹ค.


์•„, ๊ทธ๋ฆฌ๊ณ  ์ „์—๋Š” ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ ์ผ€๋ฆญํ„ฐ๊ฐ€ ์Šคํฌ๋ฆฐ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋„๋ก ํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์ˆ˜์ •ํ•˜๋ฉด์„œ ๊ทธ๋ถ€๋ถ„์ด ๋น ์กŒ๋„ค์š”.


ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€์ง€๋Š” ๋ชปํ•˜๋„๋ก ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ํ•œ๋ฒˆ ์กฐ๊ฑด์„ ๋„ฃ์–ด๋ณด์„ธ์š”~~~  ^-^ ํžˆํž›~ ์ˆ™์ œ์ž…๋‹ˆ๋‹ค~~~


๊ทธ๋ฆฌ๊ณ  ์ ํ”„๊ธฐ๋Šฅ์ด๋‚˜ ๋ญ ์ด๋Ÿฐ๊ฒƒ๋“ค์„ ๋„ฃ์œผ๋ฉด ์žฌ๋ฐŒ๊ฒ ์ฃ ? ใ…‹ใ…‹


๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์ด๋งŒ ์ค„์ด๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ณ„์† ์žฅ๋ง›๋น„๊ฐ€ ๋‚ด๋ฆฌ๋Š”๋ฐ ๊ณฐํŒก์ด ์กฐ์‹ฌํ•˜์‹œ๊ณ  ์ฆํ”„ํ•˜์„ธ์š”~~ ใ…‹ใ…‹


์ด์ƒ ์นœ์ ˆํ•œ ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค.






๊ทธ์ €๊ป˜ ๊ทธ๋ž˜ํ”ฝ ์ถœ๋ ฅํ•˜๊ธฐ 1ํŽธ์„ ํฌ์ŠคํŒ… ํ–ˆ์—ˆ๋Š”๋ฐ ์†Œ์Šค๊ฐ€ ์—†์—ˆ์ฃ ? ์–ด์ œ ์˜ฌ๋ฆฌ๋ ค ํ–ˆ๋Š”๋ฐ ์ผ์ด ์ข€ ๋ฐ”๋น ์„œ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค.

 

์ž!!!!

 

์˜ค๋Š˜์€ ์ œ๊ฐ€ ๋งŒ๋“  ์†Œ์Šค์™€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ชจ๋‘ ๊ณต์œ ํ•  ์˜ˆ์ •์ด๋‹ˆ ์ž˜ ๋”ฐ๋ผ์™€๋งŒ ์ฃผ์‹ ๋‹ค๋ฉด ์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ๋ฉ‹์ง„ ๊ฒŒ์ž„์„ ๋งŒ๋“œ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ใ…‹ใ…‹

( ์ €๋„ ์ฒ˜์Œ์ธ๋ฐ ์ด๋Ÿฐ ๋ง์„ ํ•˜๊ณ ์žˆ๋„ค์š” ใ…‹ใ…‹ใ…‹)

 

์ €์™€ ๊ฐ™์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  libGDX๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ์œผ๋ฉฐ ์ด๊ณณ์˜ ์„ค์ •(assets)์„ ๋˜‘๊ฐ™์ด ํ•˜์…จ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํฐ์ด ์•„๋‹Œ ๋ฐ์Šคํฌํƒ‘์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ( ์•„์ง ํฐ์—์„œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋ชปํ•ด๋ดค์Šต๋‹ˆ๋‹ค. )

 

 

์งˆ๋ฌธ ์žˆ์œผ์‹œ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

 

๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ค๋Š˜ ๋ณด์‹œ๊ฒŒ๋  ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

๋•…์€ ์™ผ์ชฝ์œผ๋กœ ๊ณ„์† ์›€์ง์ด๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  ์ผ€๋ฆญํ„ฐ๋Š” ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

1. ์ถ”๊ฐ€๋œ ํŒŒ์ผ ๋ฐ ํด๋ž˜์Šค ( ์†Œ์Šค ์‹คํ–‰์— ํ•„์š”ํ•œ ์ถ”๊ฐ€๋œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ ์ฒจ๋ถ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. )

- carl-carlson.jpg๋Š” ์—†์–ด๋„ ๋˜๋Š” ํŒŒ์ผ์ธ๋ฐ ๋“ค์–ด๊ฐ€์žˆ๋„ค์š” ใ…ˆใ……;;;;

 

 

 

2. ์ฒจ๋ถ€๋œ ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•„ ํ•ด๋‹น ์œ„์น˜ ( android/assets )์— ๋„ฃ์–ด์ฃผ์„ธ์š”.

3. core์— ์žˆ๋Š” ์†Œ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์šฐ์„  Player ์ž…๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

์ž, ํ”Œ๋ ˆ์ด์–ด๋Š” ๊ฒŒ์ž„์† ์ฃผ์ธ๊ณต ์ผ€๋ฆญํ„ฐ์ž…๋‹ˆ๋‹ค. Sprite๋ฅผ ์ด์šฉํ•ด์„œ ๋ฟŒ๋ ค์ค„๊ฑฐ๊ตฌ์š” setBounds๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ผ€๋ฆญํ„ฐ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ง€์ •ํ•ด์คฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€์—์„œ characterSprite๋ฅผ ๋ถˆ๋Ÿฌ์“ธ ์ˆ˜ ์žˆ๋„๋ก getter๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•ด์คฌ์ฃ .

 

๋‹ค์Œ์€ CharacterProcessor์ž…๋‹ˆ๋‹ค.

 

 

CharacterProcessor๊ฐ€ InputProcessor๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๊ทธ ์•ˆ์— ๊ฐ์ข… ๋ฉ”์†Œ๋“œ๋“ค์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์•ผํ•˜๋Š”๋ฐ ์ €๋Š” keyDown๋ฉ”์†Œ๋“œ๋งŒ ๊ตฌํ˜„์„ ํ–ˆ๊ณ  ๋‚˜๋จธ์ง€ ๋ฉ”์†Œ๋“œ๋“ค์€ ๊ธฐ๋ณธ์œผ๋กœ ๋†”๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ผ๋‹จ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ๋“ค๊ณ ์žˆ๊ณ  ๊ทธ ํ”Œ๋ ˆ์ด์–ด์—๋Œ€ํ•œ getter์ธ getPlayer()๋ฅผ ๋งŒ๋“ค์–ด์คฌ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๋ฐ›์•„์„œ ์ผ€๋ฆญํ„ฐ๋ฅผ ์›€์ง์ด๊ธฐ์œ„ํ•ด keyDown๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ keycode 21์€ ์™ผ์ชฝ, 22๋ฅผ ์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

์™ผ์ชฝํ™”์‚ดํ‘œ๊ฐ€ ๋ˆŒ๋ฆฌ๋ฉด ์ขŒ์ธก์œผ๋กœ ์ด๋™ํ•˜๋Š”๋ฐ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์˜ ๊ฐ€์žฅ ์ขŒ์ธก๊นŒ์ง€ ๋„๋‹ฌํ•˜๋ฉด ๋”์ด์ƒ ์›€์ง์ด์ง€ ์•Š๋„๋ก if ์กฐ๊ฑด์„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š”๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

์ž, ์ด์ œ ๋ฉ”์ธํด๋ž˜์Šค์ธ MyGdxGame ํด๋ž˜์Šค๋ฅผ ๋ณด์‹ค๊นŒ์š”?

public class MyGdxGame extends ApplicationAdapter {
    SpriteBatch batch;
    Texture background;
    Texture terrain;
    TextureRegion groundTextureRegion;
    float backgroundPos = 0;
    CharacterProcessor inputProcessor;

    @Override
    public void create () {
        batch = new SpriteBatch();
        background = new Texture("sky2.jpg");
        terrain = new Texture("grey_stone_1.png");
        terrain.setWrap(Texture.TextureWrap.Repeat, Texture.TextureWrap.Repeat);
        groundTextureRegion = new TextureRegion(terrain);
        inputProcessor = new CharacterProcessor();
        Gdx.input.setInputProcessor(inputProcessor);
    }
    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.disableBlending();
        batch.draw(background, 0, 0, 800, 480);
        batch.enableBlending();
        
        // let's draw ground image
        batch.draw(groundTextureRegion, backgroundPos, 0, 800, 100);
        if ( backgroundPos + 800 > 0 && backgroundPos + 800 < 800){
            batch.draw(groundTextureRegion, backgroundPos + 800, 0, 800, 100);
        }

        // let's draw player
        inputProcessor.getPlayer().getCharacterSprite().draw(batch);

        batch.end();

        updateScene();
    }
    private void updateScene(){
        float deltaTime = Gdx.graphics.getDeltaTime();
        backgroundPos -= 200 * deltaTime;
        if ( backgroundPos <= -800 ){
            backgroundPos = 0;
        }
    }
}

 

 

์šฐ์„  create()์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

render()์—์„œ๋Š” ๋ฟŒ๋ ค์ฃผ๋Š” ๊ฒƒ์„ ๋‹ด๋‹นํ•˜๋Š”๋ฐ ๊ฒŒ์ž„์ด ์‹คํ–‰๋˜๋Š”๋™์•ˆ ๋Š์ž„์—†์ด ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ธ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

enableBlending์œผ๋กœ ๋ฐฐ๊ฒฝ(sky2.jpg)์œ„์— ๋•…(grey_stone_1.png)๊ณผ ์ผ€๋ฆญํ„ฐ(player.png)๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋•…์„ ๊ทธ๋ฆด๋•Œ๋Š” batch.draw()์—์„œ TextureRegion์„ ์ด์šฉํ–ˆ๊ณ , ์ผ€๋ฆญํ„ฐ๋Š” Sprite.draw๋ฅผ ์ด์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋•…์„ ๊ทธ๋ฆด๋•Œ ๋•…์ด ์ขŒ์ธก์œผ๋กœ ๊ณ„์† ์ด๋™ํ•˜๋ฉด์„œ ๋งˆ์น˜ ์ผ€๋ฆญํ„ฐ๊ฐ€ ์šฐ์ธก์œผ๋กœ ์ด๋™ํ•˜๋Š”๊ฒƒ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

updateScene()์—์„œ ๊ทธ ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋„๋ก backgroundPos ( ๋•… ๊ทธ๋ฆผ์ด ๋ฟŒ๋ ค์งˆ ์œ„์น˜ )๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ž, ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”์‚ดํ‘œ๋ฅผ ๊ณ„์† ๋ˆ„๋ฅด๊ณ  ์žˆ์–ด๋„ ํ•œ๋ฒˆ ๋ฐ–์— ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ด๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ์ฆํ”„ํ•˜์‹œ๊ธธ ~ ^-^

 

์ง€๊ธˆ๊นŒ์ง€ libGDX๋ฅผ ๋…ํ•™ํ•˜๊ณ ์žˆ๋Š” ์ผ€์ด์น˜์˜€์Šต๋‹ˆ๋‹ค~

 

P.S : ๋„์›€์ด ๋˜์…จ์œผ๋ฉด ๋Œ“๊ธ€ ํ•˜๋‚˜ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ^-^

 

 

 

 

 

 

[[ ์›๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ฒจ๋ถ€ ]]

 

 

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์˜ค๋Š˜๋„ ์–ด๊น€์—†์ด ๊ฟ€ํŒ์„ ๋“ค๊ณ ์˜จ ์ผ€์ด์น˜์ž…๋‹ˆ๋‹ค ^-^ ใ…Žใ…Ž

 

์˜ค๋Š˜์€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ description์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ดํด๋ฆฝ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ ์œ„์— ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ ค๋†“์œผ๋ฉด ๋ฉ”์†Œ๋“œ์—๋Œ€ํ•œ ์„ค๋ช…์ด ๋‚˜์˜ค๋Š”๋ฐ์š”

 

์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ ‡์ง€๊ฐ€ ์•Š๋”๊ตฐ์š”. ใ…œใ…œ

 

๊ตฌ๊ธ€๋งํ•˜๋ฉด ๋‚˜์˜ค๊ธฐ๋Š” ํ•˜๋Š”๋ฐ 2014๋…„๋„ ๋ฒ„์ „๊ณผ ์ตœ๊ทผ ์—†๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์ด ๋˜ ์กฐ๊ธˆ ๋‹ค๋ฅด๋”๊ตฐ์š”.

 

์ž, ์šฐ์„  ๋ฉ”์†Œ๋“œ ์„ค๋ช…์„ ๋ณด๋Š” ๋ฐฉ๋ฒ• ๋ช‡ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

1. description์„ ๋ณด๊ณ ์žํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ช…์— ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•˜๋„๋ก ๋งˆ์šฐ์Šค๋กœ ํด๋ฆญํ•˜๊ณ  Ctrl + Q ( Windows )๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

 

์•„๋ž˜๋Š” Texture์—๋‹ค๊ฐ€ ์ปค์„œ๊ฐ€ ๊นœ๋ฐ•์ด๋„๋ก ํ•œ ๋’ค Ctrl + Q ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋‚˜์˜ค๋Š” ํŒ์—…์ž…๋‹ˆ๋‹ค.

 

 

 

 

2. ์ดํด๋ฆฝ์Šค์ฒ˜๋Ÿผ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ ค๋งŒ ๋†”๋„ ์ž๋™์œผ๋กœ ๋ฉ”์†Œ๋“œ ๋””์Šคํฌ๋ฆฝ์…˜์„ ๋„์šฐ๋ ค๋ฉด

File >> Setting >> Editor >> General >> Other >> Show quick doc on mouse move ์— ์ฒดํฌ๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

3. ์„ธ๋ฒˆ ์งธ๋Š” ์ˆ˜๋™์œผ๋กœ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

IntelliJ์˜ bin๋””๋ ‰ํ† ๋ฆฌ์— ๋ณด์‹œ๋ฉด idea.properties๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— auto.show.quick.doc=true ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

 

์ด ์„ธ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ง์ ‘ ๊ฒ€์ฆ ํ•ด๋ณด์ง„ ์•Š์•˜๊ณ  ๊ตฌ๊ธ€๋ง์—์„œ ๋‚˜์˜จ ์–˜๊ธฐ๋ฅผ ๊ทธ๋ƒฅ ๋ง๋ถ™์ธ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ, ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๊ถ‚์ด ์ด ๋ฐฉ๋ฒ•์„ ์“ธ ์ด์œ ๋Š” ์—†๊ฒ ์ฃ ? ใ…‹

 

 

์ž~ ๊ทธ๋Ÿผ ์˜ค๋Š˜๋„ ์ฆํ”„~~

 

 

 

 

libGdx ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์งํ›„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ๋ฒ„์ „์€ ํ…Œ์ŠคํŒ…์ด ์›ํ™œํžˆ ์ง„ํ–‰์ด ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ฐ์Šคํฌํƒ‘ ๋ฒ„์ „์œผ๋กœ ํ…Œ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

    Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: badlogic.jpg
        at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
        at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92)
        at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:88)
        at com.mygdx.game.MyGdxGame.create(MyGdxGame.java:18)
        at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
        at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
    Caused by: com.badlogic.gdx.utils.GdxRuntimeException: File not found: badlogic.jpg (Internal)
        at com.badlogic.gdx.files.FileHandle.read(FileHandle.java:136)
        at com.badlogic.gdx.files.FileHandle.readBytes(FileHandle.java:222)
        at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137)
        ... 7 more

    Process finished with exit code 0

 

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

1. ์ดํด๋ฆฝ์Šค ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ

Run => Run Configurations.. => DesktopLauncher ์˜ Arguments ํƒญ => Working Directory => Others then browse to yourproject-android/assets/ and click Apply => Run

 

 

 

 

 

 

 

2. ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์˜ ๊ฒฝ์šฐ

 

  1. Run -> Edit Configurations

  2. "Working Directory:" ๋ฅผ ๊ฐ€๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ํ”„๋กœ์ ํŠธ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์„ค์ •๋˜์–ด์žˆ๋Š”๋ฐ => "android/assets" ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ๋“ค์–ด๊ฐ€๋„๋ก ์„ค์ •

     

 

 

 

 

์ด์ œ ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด์‹œ๋ฉด ์ž˜ ๋ ๊ฒ๋‹ˆ๋‹ค.

 

 

์ฆํ”„~

 

 

 

 

- ์ด๊ฑด ์ œ๊ฐ€ LibGDX Game Development Essentials ๋ผ๋Š” ์ฑ…์„ ๋ณด๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์œผ๋กœ ์ œ๊ฐ€ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๋ง์”€๋“œ๋ฆฌ๋ฉฐ, ํ˜น์—ฌ๋‚˜ ์ œ๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ•œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์ €์—๊ฒŒ ์ง€์‹์„ ์ข€ ๋‚˜๋ˆ„์–ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ^-^



์˜ค๋Š˜์€ Displaying graphics์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…์„ ํ•˜๋ คํ•ฉ๋‹ˆ๋‹ค.

์ผ ๋‹จ Texture๊ฐ€ ๋ญ”์ง€์— ๋Œ€ํ•ด์„œ ์ดํ•ด๋ฅผ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. Texture๋ž€ GPU๋กœ ์ด๋ฏธ์ง€๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋‹จ์œ„(?)๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๊ฒŒ expensive process๋ผ์„œ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ–ˆ๋Š”๋ฐ ๊ทธ๋ž˜์„œ ๋‚˜์˜จ๊ฒƒ์ด SpriteBatch์ž…๋‹ˆ๋‹ค.


SpriteBatch ํด๋ž˜์Šค๋Š”์œ„์น˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ ์ข€๋” ํšจ์œจ์ ์œผ๋กœ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋™์ผํ•œ Texture๋ฅผ ์—ฌ๋Ÿฌ๊ตฐ๋ฐ์— ๋ฟŒ๋ ค์ค˜์•ผํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ Texture๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ๋˜๋ฉด ๋น„ํšจ์œจ์ ์ธ๋ฐ์š” ์ด๋Ÿด ๋•Œ๋Š” texture packing๊ณผ์ •์„ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜์˜ ํฐ ์ด๋ฏธ์ง€๋กœ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


TextureRegion์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. TextureRegion์€ Texture์˜ ์กฐ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. Texture์˜ ์ผ๋ถ€๋ฅผ ๋–ผ์–ด๋‚ธ ๊ฒƒ์ด์ฃ . ์˜ˆ๋ฅผ๋“ค์–ด, ์ผ๋ฐ˜์ ์ธ ๋ฒฝ์ง€๋Š” ๋ฌด๋Šฌ๊ฐ€ ๋ฐ˜๋ณต์ด ๋˜์ฃ ? ์ด ๋ฐ˜๋ณต๋˜๋Š” ๋ฌด๋Šฌ๋ฅผ TextureRegion์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ Sprite ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Spriteํด๋ž˜์Šค๋Š” Texture์™€ ์œ„์น˜ ์ •๋ณด, ์‚ฌ์ด์ฆˆ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ํ•ฉ์ณ๋†“์€ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ™”๋ฉด์— ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ๋•Œ draw์ฝ”๋“œ๋‚ด์— ์œ„์น˜์ •๋ณด๋‚˜ ์‚ฌ์ด์ฆˆ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Spriteํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


์ž, ๊ทธ๋Ÿผ ์ด ์„ธ๊ฐ€์ง€๋ฅผ ์–ด๋–ค ๊ฒฝ์šฐ์— ์จ์•ผ ํ• ๊นŒ์š”?


์ผ๋‹จ ๊ฐ„๋‹จํ•œ ๊ฒŒ์ž„์„ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.


์šฐ ์„  ๋ฐฐ๊ฒฝ(1)์ด ์žˆ๊ณ  ๊ทธ ์œ„์— ๊ทธ๋ ค์ง€๋Š” ์—ฌ๋Ÿฌ ์žฅ์• ๋ฌผ๋“ค(2)์ด ์žˆ๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฐ๊ฒฝ์ด ์›€์ง์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ๊ฒŒ์ž„์ง„ํ–‰ ๋‚ด๋‚ด ์Šคํฌ๋กค๋ง์ด ๋˜๋Š” ๊ตฌ๋ฆ„๋ฐฐ๊ฒฝ์ด๋‚˜ ๋•…์ด ์›€์ง์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„(3)์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ฃ .


1๋ฒˆ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ๊ณ ์ •ํ•ด๋†“์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Texture๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ณ„์† ์›€์ง์—ฌ์•ผ๋˜๋Š” ์•„์ดํ…œ๋“ค์ด๋ผ Sprite๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

3๋ฒˆ์˜ ๊ฒฝ์šฐ์—๋Š” TextureRegion์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ณด์ด์ง€ ์•Š๋Š” ์Šคํฌ๋กค๋ง ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .


์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด์ž๋ฉด ๊ทธ๋ž˜ํ”ฝ ์ถœ๋ ฅํ•˜๊ธฐ์—๋Š” ์„ธ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.


1. SpriteBatch

2. TextureRegion

3. Sprite


์•„์ง ์ €๋„ ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ณด์งˆ ์•Š์•„์„œ ์–ด๋–ค ๊ฒฝ์šฐ์— ์ด๋ ‡๊ฒŒ ์จ์•ผํ•œ๋‹ค๋ผ๊ณ  ๋”ฑ ์ž˜๋ผ์„œ ๋งํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ง€๊ธˆ ๋‹น์žฅ์€ ์œ„์— ์ž ๊น ์„ค๋ช…๋“œ๋ฆฐ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.



( ์กฐ๋งŒ๊ฐ„ ๊ฐ„๋žตํ•œ ์†Œ์Šค๊นŒ์ง€ ์˜ฌ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. )



์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ : ์ƒˆ๋กœ์šด apk์˜ ๋ฒ„์ „ ์ฝ”๋“œ(1)๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.


ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : 

AndroidManifest.xml ํŒŒ์ผ์—์„œ 


android:versionCode=""

android:versionName=""


๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ ๋กœ ๋ฒ„์ „ ์ฝ”๋“œ๋Š” ๋ช‡ ๋ฒˆ์งธ ์—…๋ฐ์ดํŠธ์ธ์ง€๋ฅผ ํ‘œ์‹œํ•ด์ฃผ์‹œ๋ฉด๋˜๊ณ  ๋ฒ„์ „ ๋„ค์ž„์—๋Š” ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.


๊ตฌ๊ธ€๋ง ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์œ„์™€๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜์‹  ๊ฒƒ ๊ฐ™์€๋ฐ ์•„๋งˆ๋„ ์ดํด๋ฆฝ์Šค์—์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ ํ•˜์‹œ๋˜ ๋ถ„๋“ค์ด ์˜ฌ๋ฆฐ ๊ธ€์ธ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์ €๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋กœ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ ์žˆ๋Š”๋ฐ ํŠน๋ณ„ํžˆ ์„ธํŒ…์„ ๋ฐ”๊พผ๊ฒŒ ์—†๋Š”๋ฐ manifestํŒŒ์ผ์— ์œ„์™€๊ฐ™์€ ์„ค์ •์ด ์—†๊ธธ๋ž˜ ๊ทธ๋ƒฅ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด๋ณด๋ คํ–ˆ๋”๋‹ˆ warning์ด ๋–ด๋Š”๋ฐ ๊ทธ๋ž˜๋“ค ๋นŒ๋“œ์—์„œ ๊ฐ’์„ ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋‚˜์˜ค๋”๊ตฐ์š”.


๋งŒ์•ฝ manifestํŒŒ์ผ์— ์ €๋Ÿฐ ์„ค์ •์ด ์—†๋‹ค๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์ขŒ์ธก ํŒจํ‚ค์ง€ ์ต์Šคํ”Œ๋กœ๋Ÿฌ ์ฐฝ์—์„œ ํŠธ๋ฆฌ ํ‘œ์‹œ ๋ฐฉ๋ฒ•์„ Android๋กœ ์„ ํƒ์„ ํ•ด์ฃผ์‹œ๋ฉด build.gradle ( Module:app )์„ ์—ด์–ด๋ณด์‹œ๋ฉด versionCode์™€ versionName ์„ค์ •ํ•˜๋Š” ๊ณณ์ด ๋ณด์ด์‹ค ๊ฒ๋‹ˆ๋‹ค.


์•„๋ž˜ ์‚ฌ์ง„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.






๊ทธ๋Ÿผ ์ฆํ”„ํ•˜์„ธ์š”~ ^-^



๋งจ๋‚  ๊นŒ๋จน์–ด์„œ ์•„์˜ˆ ํฌ์ŠคํŒ…ํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๋˜ ๊นŒ๋จน์„๊นŒ๋ด ใ…œใ…œ


Mac์—์„œ ์Šคํฌ๋ฆฐ์ƒท ์ฐ๋Š” ๋‹จ์ถ•ํ‚ค์ž…๋‹ˆ๋‹ค.


command + shift + 3 : ์ „์ฒดํ™”๋ฉด์„ ์Šคํฌ๋ฆฐ์ƒท 

command + shift + 4 + sapce + windowํด๋ฆญ : ์„ ํƒํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜์—ญ์„ ์Šคํฌ๋ฆฐ์ƒท
command + shift + 4 + ๋งˆ์šฐ์Šค๋กœ์˜์—ญ์ง€์ • : ๋งˆ์šฐ์Šค๋กœ์ง€์ •ํ•œ ์˜์—ญ๋งŒ ์Šคํฌ๋ฆฐ์ƒท



์•ˆ๋…•ํ•˜์„ธ์š”~


libGdx ์ฝ”๋„ˆ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋งˆ๋ จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ด๋ฒˆ์— libGdx๋ฅผ ์ด์šฉํ•œ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•  ์˜ˆ์ •์ด๋ผ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ƒ๊ธด libGdx๊ด€๋ จ ์˜ค๋ฅ˜๋‚˜ ํŒ์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฒŒ์‹œํŒ์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ^-^


libGDX๊ฐ€ ๋ญ๋ƒ? ๊ตญ๋‚ด์—์„œ๋Š” Cocos ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ ์™ธ๊ตญ์—์„œ๋Š” libGDX ์‚ฌ์šฉ์ž๋“ค๋„ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์— ์ต์ˆ™ํ•˜์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”๊ธฐ๋ฐ˜์ด๊ตฌ์š”, Cocos2d-x ์ฒ˜๋Ÿผ CrossPlatform ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์†Œ์Šค๋งŒ ๊ฐœ๋ฐœํ•ด์„œ ๋ฐ์Šคํฌํƒ‘์—์„œ๋„ ํ…Œ์ŠคํŠธํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ๊ณ  ์•ˆ๋“œ๋กœ์ด๋“œ, iOS, HTML๋กœ๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด๋ฃŒ ๊ฐœ๋ฐœ ํˆด ์น˜๊ณ ๋Š” ์ƒ๋‹นํžˆ ์ข‹์€ ํˆด์ด๋ผ๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.


์ž~ ์˜ค๋Š˜์€ libGdx ์„ค์น˜ํ•˜๋Š” ๊ฒƒ ๋ถ€ํ„ฐ ํ•ด๋ณด๋„๋ก ํ•˜์ฃ ~


๊ทธ ์ „์— ์ œ ํ™˜๊ฒฝ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.





๊ทธ๋ฆฌ๊ณ  ์ดํด๋ฆฝ์Šค๋Š” ๋ฒ„๋ฆฌ๊ณ  ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


์ž, ์šฐ์„  libGdx ์‚ฌ์ดํŠธ๋กœ ๊ฐ€์„œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋ฐ›์•„์•ผ ๊ฒ ์ฃ ?


http://libgdx.badlogicgames.com/download.html


์œ„ ๋งํฌ๋ฅผ ๋”ฐ๋ผ๊ฐ€์‹œ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹ค์šด๋กœ๋“œ ๋งํฌ๊ฐ€ ํผ์ง€๋ง‰ํ•˜๊ฒŒ ๋ณด์ด์‹ค๊ฒ๋‹ˆ๋‹ค.






๋‹ค์šด๋กœ๋“œ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์‹œ๋ฉด gdx-setup.jar ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ด์ œ ๋‹ค์šด๋กœ๋“œํ•œ jar ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค์„ธ์š”.


ํ˜น์‹œ ์‹œ์Šคํ…œ ๋ณด์•ˆ ์„ค์ •์— ํ™•์ธ๋œ ๊ฒŒ์‹œ์ž๊ฐ€ ๋งŒ๋“  ์•ฑ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด๋†“์œผ์…จ๋‹ค๋ฉด ์‹คํ–‰์ด ์•ˆ๋  ๊ฒ๋‹ˆ๋‹ค.


๊ทธ๋Ÿด๊ฒฝ์šฐ์—๋Š” ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ด์–ด์„œ ์ง์ ‘ 


java -jar gdx-setup.jar 


๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์‹œ๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์„ค์ • > ๋ณด์•ˆ ๋ฐ ๊ฐœ์ธ์ •๋ณด์— ๊ฐ€์‹œ๋ฉด ๊ฐ•์ œ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์ด ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๊ฑธ ๋ˆŒ๋Ÿฌ์ฃผ์‹œ๋ฉด ๋˜์š”.


์ž, ์…‹์—… ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰์ด ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ฌ๊ฒ๋‹ˆ๋‹ค.



Name ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ช…์„ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋˜๊ณ  ํŒจํ‚ค์ง€๋Š” ๋ญ ์•ˆ๋“œ๋กœ์ด๋“œ ํŒจํ‚ค์ง€ ๋„ฃ๋“ฏ์ด ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ํด๋ž˜์Šค๋Š” ์ž๋ฐ” ํด๋ž˜์Šค ํŒŒ์ผ ๋ช…์„ ๋งํ•˜๋Š”๊ฑฐ๊ณ (์•ฑ ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋ฉ”์ธ ํด๋ž˜์Šค ํŒŒ์ผ ์ด๋ฆ„ ๋„ฃ์–ด์ฃผ์‹œ๋Š”๊ฑฐ๋‹ˆ๊นŒ์š” )

Destination์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์„ค์น˜๋  ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ์ธ๋ฐ ์ €๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์•ˆ์— ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

Android Sdk ๊ฒฝ๋กœ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜์‹  ๋ถ„๋“ค์ด๋ฉด ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์ฒ˜์Œ ์‹คํ–ˆํ•˜์ž๋งˆ์ž ์„ค์ •๋ฉ”๋‰ด๋กœ ๋“ค์–ด๊ฐ€์‹œ๋ฉด ์ฐพ์œผ์‹ค ์ˆ˜ ์žˆ๊ณ ์š” ์•„๋‹ˆ๋ฉด ํ„ฐ๋ฏธ๋„ ์ฐฝ์—์„œ find ๋ช…๋ น์–ด๋กœ ์ฐพ์œผ์‹ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด find / -name android ๋ญ ์ด๋ ‡๊ฒŒ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


LibGDX Version์€ ๊ทธ๋Œ€๋กœ ๋†”๋‘์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ‘์— Sub Projects๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ๋‹ค ์„ ํƒ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ €๋Š”  html์„ ํ•ด์ œ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ํ•„์š”์—†์œผ๋‹ˆ๊นŒ์š”.

๋ฐ์Šคํฌํƒ‘์€ ํ˜น์—ฌ๋‚˜ ํฐ์—†์ด ๋ฐํƒ‘์—์„œ ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ ๊ทธ๋ƒฅ ๋„ฃ์–ด๋ดค์Šต๋‹ˆ๋‹ค.


Extensions ์— ์žˆ๋Š” ๊ฒƒ์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Box2d๊ฐ€ ์„ ํƒ๋˜์–ด์ ธ์žˆ๊ตฌ์š” ์ €๋Š” Tools์™€ Ai๋ฅผ ์ถ”๊ฐ€๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์— ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ ค๋†“์œผ๋ฉด ์ด๊ฒŒ ์–ด๋–ค ๊ฒƒ๋“ค์ธ์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…์„ ํ•ด์ฃผ๋‹ˆ๊นŒ ์—ฌ๋Ÿฌ๋ถ„๋“ค๋„ ํ•„์š”ํ• ๊ฒƒ ๊ฐ™์•„ ์‹ถ์€๊ฒŒ ์žˆ์œผ๋ฉด ์ฒดํฌํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ž, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ‘์—  "Show Third Party Extensions"๋ผ๊ณ  ๋ฒ„ํŠผ์ด ํ•˜๋‚˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฑธ ๋ˆ„๋ฅด์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒ์—…์ฐฝ์ด ํ•˜๋‚˜ ๋œน๋‹ˆ๋‹ค.




๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋˜์–ด์žˆ๋Š”๋ฐ ์ €๋Š” ๊ทธ๋ƒฅ ๋‹ค ์„ ํƒํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ํ•„์š”ํ• ๊นŒํ•ด์„œ ๋ง์ด์ฃ  ใ…‹ ๊ทธ๋ฆฌ๊ณ  Save.


๋‹ค์‹œ ์›๋ž˜ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์™€์„œ ์ด์ œ Generate ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์‹œ๋ฉด ๊ฐ์ข… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ๋นŒ๋“œํˆด ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ ํŒ์—…์ฐฝ์ด ๋œฐ ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ๊ทธ๋ƒฅ Yes, Yes ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ^-^


์ €๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์•ฝ 8๋ถ„์ •๋„ ๊ฑธ๋ ธ๋„ค์š”. ์‚ฌ์‹ค ์ด๊ฒƒ๋„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•œ๊ฒ๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋กœ๋ณดvm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋ฐ›๋‹ค๊ฐ€ ์‹œ๊ฐ„ ์—„์ฒญ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋ฌด์Šจ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๋ฐ ๋ญ ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ผ๊ณ ๋Š” ์œ„์— ์ฒดํฌ๋ฐ•์Šค ์„ค์ •ํ•˜๋Š” ๊ฒƒ ๋ฟ์ธ๋ฐ ๊ตฌ๊ธ€๋งํ•ด๋„ ๋‹ต์€ ์•ˆ๋‚˜์˜ค๊ณ ....๊ทธ๋ƒฅ ์—ฌ๋Ÿฌ๋ฒˆ ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ๊ฐ„์‹ ํžˆ ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


์ž, ์ด๋ ‡๊ฒŒ ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‹ค๋ฉด ์ด์ œ ๋นŒ๋“œ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ์—ด์–ด์„œ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์•„๋ž˜๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ์‹คํ–‰์‹œํ‚ค์‹œ๊ณ  Import project๋ฅผ ์„ ํƒ์„ ํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  libGdx์„ค์น˜ํ•  ๋•Œ ์ฃผ์—ˆ๋˜ Destination ๊ฒฝ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•ด์ฃผ์‹œ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋นŒ๋“œ๋ฅผ ๋˜ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.


์ €๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ๊ณผ์ •๋„ ๊ฝค๋‚˜ ์˜ค๋ž˜๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด๊ฑฐ ๋ญ ๋ฐ”๋กœ๋ฐ”๋กœ ๋˜๋Š”๊ฒŒ ์—†๋”๊ตฐ์š”. ์—ฌ๋Ÿฌ๋ถ„๋“ค์€ ํ•œ๋ฒˆ์— ์„ฑ๊ณตํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.


 



์ž, ๋นŒ๋“œ๋ฅผ ๋งˆ์น˜๋ฉด ํ”„๋กœ์ ํŠธ ํ™”๋ฉด์ด ๋œน๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์‹คํ–‰์„ ์‹œํ‚ค์‹œ๋ฉด ์œ ๋ช…ํ•œ ๋ฐฐ๋“œ๋กœ์ง ์ดˆ๊ธฐํ™”๋ฉด์ด ๋œฐ๊ฒ๋‹ˆ๋‹ค.


์ž, ์ด์ƒ์œผ๋กœ libGdx ์„ค์น˜ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.


๋ชจ๋‘ ์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”~

์•ˆ๋…•ํ•˜์„ธ์š”~


์˜ค๋Š˜์€ ๋ฌด๋ฃŒ ์‚ฌ์šด๋“œ ์—๋””ํ„ฐ๋ฅผ ํ•˜๋‚˜ ์†Œ๊ฐœํ•  ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.


๋ญ ์ €๋„ ํ•„์š”ํ•ด์„œ ๋‹ค์šด๋ฐ›์•„์„œ ์ž ๊น ์จ๋ณธ๊ฑฐ ๋ง๊ณ ๋Š” ์•„๋Š”๊ฒŒ ์—†์–ด์„œ ์žฅํ™ฉํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆด๊ฑด ์—†๊ณ ์š”


์ง์ ‘ ๋‹ค์šด ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•ด๋ณด์‹œ๋ฉด ๋ ๊ฒƒ ๊ฐ™์•„์š”~


์œˆ๋„์šฐ(Windows), ๋งฅ(Mac), ๋ฆฌ๋ˆ…์Šค(Linux)๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋ฌด๋ฃŒ, ์˜คํ”ˆ ์†Œ์Šค, ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค.


์•„๋ž˜ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋กœ ๊ฐ€์‹œ๋ฉด Download ๋งํฌ๊ฐ€ ์—„์ฒญ ์ปค๋‹ค๋ž—๊ฒŒ ์žˆ์–ด์š”.


๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ : http://web.audacityteam.org/


7์›” 22์ผ ํ˜„์žฌ 15๋…„ 7์›” 15์ผ์ž ์ตœ์‹  ๋ฒ„์ „์ด ์˜ฌ๋ผ์™€ ์žˆ๋„ค์š”.







Jboss AS 7 ์—์„œ module.xml ์„ค์ •์„ ์œ„ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ์ ์–ด๋†“์€ ์ข‹์€ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„์„œ ํฌ์ŠคํŒ… ํ•ด๋ด…๋‹ˆ๋‹ค.

์˜๋ฌธ์ด๊ธดํ•˜์ง€๋งŒ ์–ด๋ ค์šด ๋ง์€ ์—†์œผ๋‹ˆ ํ•œ๋ฒˆ ์ฝ์–ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค ^-^ 



Full module.xml example with comments 


    <?xml version="1.0" encoding="UTF-8"?> 
     
    <module xmlns="urn:jboss:module:1.1" name="org.jboss.msc"> 
     
        <!-- Main class to use when launched as a standalone jar. --> 
        <main-class name="org.jboss.msc.Version"/> 
     
        <!-- Properties readable through Modules API. Not to be confused with Java system properties. --> 
        <properties> 
            <!-- jboss.api=private means that the module is not part of the JBoss AS 7 public API - basically saying, "Don't use it's packages in your apps." --> 
            <property name="jboss.api" value="private"/> 
        </properties> 
     
        <resources> 
            <!-- Basically, list of jars to load classes and resources from. --> 
            <resource-root path="jboss-msc-1.0.1.GA.jar"/> 
            ... 
        </resources> 
     
        <dependencies> 
     
            <!--  Export paths and packages from the class loader which loaded JBoss Modules (usually the system's application CL). --> 
            <system export="true"> 
                <!-- List of exported paths. Mandatory. --> 
                <paths> 
                   <path name="org/jboss/modules"/> 
                   <path name="org/jboss/modules/log"/> 
                </paths> 
                <!-- Optional limitation of what's exported. --> 
                <exports> 
                     <include path="META-INF/"/> 
                </exports> 
            </system> 
     
            <!-- Dependencies on other modules. Classloader of this module will have their classes visible. --> 
            <module name="javax.api"/> 
            <module name="org.jboss.logging"/> 
     
            <!-- services="import/export/none" controls whether services defined in META-INF/services are also visible to/from this module. 
                   I.e. services="export" will make the services of this module visible to the dependency. Import will do the other way around. 
                   Defaults to "none". --> 
            <!-- export="true" controls whether own exports of this dependency are visible. --> 
            <module name="org.jboss.ws.native.jbossws-native-core" services="export" export="true"> 
                <!-- You can limit what packages in dependency modules are allowed  
                       to be seen from this module's point of view (import), or vice versa (export). 
                       By default, all are imported/exported. When you specify <imports> or <exports>, only those listed are. --> 
                <imports> 
                   <include path="META-INF"/> 
                   <include path="dtd"/> 
                   <include path="schema"/> 
                   <exclude-set> 
                       <path name="org.jboss.example.tests"/> 
                   </exclude-set> 
                </imports> 
                <exports> 
                    <include path="META-INF"/> 
                    <include path="dtd"/> 
                    <include path="schema"/> 
                </exports> 
            </module> 
     
            <!-- Optional deps --> 
            <module name="javax.inject.api" optional="true"/> 
        </dependencies> 
    </module> 


- See more at: https://developer.jboss.org/people/ozizka/blog/2012/11/12/about-modulexml-in-jboss-as-7#sthash.oZ0bLEzI.dpuf



์ถœ์ฒ˜ : https://developer.jboss.org/people/ozizka/blog/2012/11/12/about-modulexml-in-jboss-as-7