Skip to content

Latest commit

ย 

History

History
1335 lines (1194 loc) ยท 80.4 KB

java.md

File metadata and controls

1335 lines (1194 loc) ยท 80.4 KB

7. Java

๐Ÿ“– Contents


java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Java SE์™€ Java EE ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฐจ์ด

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์™€ c/c++์˜ ์ฐจ์ด์ 

  • java์™€ c/c++์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์‹คํ–‰ ํ™˜๊ฒฝ์ด๋‹ค.
  • java์—์„œ์˜ ๊ฐœ๋ฐœ: ์ปดํŒŒ์ผ ํ˜น์€ ์ปดํŒŒ์ผ + jar์••์ถ•
    • ์ž๋ฐ”๋Š” ๋งํฌ ๊ณผ์ •์ด ์—†์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ฐ”๋กœ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ
  • c/c++์—์„œ์˜ ๊ฐœ๋ฐœ: ์ปดํŒŒ์ผ + ๋งํฌ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java ์–ธ์–ด์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ 
    • ์šด์˜์ฒด์ œ์— ๋…๋ฆฝ์ ์ด๋‹ค.
      • JVM์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน์ • ์šด์˜์ฒด์ œ์— ์ข…์†๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๋‹ค.
      • ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์–ธ์–ด์  ์ง€์›์„ ํ•˜๊ณ ์žˆ๋‹ค. (์บก์Šํ™”, ์ƒ์†, ์ถ”์ƒํ™”, ๋‹คํ˜•์„ฑ ๋“ฑ)
      • ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ํŠน์„ฑ์ƒ ๋น„๊ต์  ์ดํ•ดํ•˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค.
    • ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.
      • JVM์—์„œ Garbage Collector๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฐ๋ชฌ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด GC(Garbage Collection)๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. GC๋กœ ์ธํ•ด ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†์œผ๋ฉฐ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฐธ๊ณ )
    • ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค.
      • ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด OpenJDK๊ฐ€ ์˜คํ”ˆ์†Œ์Šค์ด๋‹ค. OracleJDK๋Š” ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ์„œ ์œ ๋ฃŒ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
        • OracleJDK์˜ ์œ ๋ฃŒํ™” ์ด์Šˆ๋Š” ๋‹ค์Œ์„ ์ฐธ๊ณ . (์ฐธ๊ณ )
      • ๋งŽ์€ Java ๊ฐœ๋ฐœ์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ƒํƒœ๊ณ„๊ฐ€ ์ž˜ ๊ตฌ์ถ•๋˜์–ด์žˆ๋‹ค. ๋•๋ถ„์— ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ’๋ถ€ํ•˜๋ฉฐ ์ž˜ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์งง์€ ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋‚ด์— ์•ˆ์ •์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ž๋ฐ”๋Š” ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐ ์ œ์–ด์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰๋˜๋Š” ์šด์˜์ฒด์ œ์— ์ƒ๊ด€์—†์ด ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋™์  ๋กœ๋”ฉ(Dynamic Loading)์„ ์ง€์›ํ•œ๋‹ค
      • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ , ๊ฐ ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ํด๋ž˜์Šค๋ฅผ ๋™์  ๋กœ๋”ฉํ•ด์„œ ์ƒ์„ฑํ•œ๋‹ค. ๋˜ํ•œ ์œ ์ง€๋ณด์ˆ˜ ์‹œ ํ•ด๋‹น ํด๋ž˜์Šค๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๊ณ  ๋น ๋ฅด๋‹ค.
  • ๋‹จ์ 
    • ๋น„๊ต์  ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.
      • ์ž๋ฐ”๋Š” ํ•œ ๋ฒˆ์˜ ์ปดํŒŒ์ผ๋ง์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„์–ด๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๊ณ  JVM์— ์˜ํ•ด ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญ๋˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์— C๋‚˜ C++์˜ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ์™„์ „ํ•œ ๊ธฐ๊ณ„์–ด๋ณด๋‹ค๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋“œ์›จ์–ด์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐ™์€ ๊ธฐ์ˆ  ์ ์šฉ์œผ๋กœ JVM์˜ ๊ธฐ๋Šฅ์ด ํ–ฅ์ƒ๋˜์–ด ์†๋„์˜ ๊ฒฉ์ฐจ๊ฐ€ ๋งŽ์ด ์ค„์–ด๋“ค์—ˆ๋‹ค.
    • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆํŽธํ•˜๋‹ค.
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ ์–ธ์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ ์ ‘๊ทผ ์ œ์–ด์ž์˜ ์ข…๋ฅ˜์™€ ํŠน์ง•

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…

  1. ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…(Primitive Data Type)
    • ๊ธฐ๋ณธ ํƒ€์ž…์˜ ์ข…๋ฅ˜๋Š” byte, short, char, int, float, double, boolean์ด ์žˆ๋‹ค.
      • ์ •์ˆ˜ํ˜• : byte, short, int, long
      • ์‹ค์ˆ˜ํ˜• : float, double
      • ๋…ผ๋ฆฌํ˜• : boolean(ture/false)
      • ๋ฌธ์žํ˜• : char
    • ๊ธฐ๋ณธ ํƒ€์ž…์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ๊ณ ์ •์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์˜ Stack ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
  2. ์ฐธ์กฐ ํƒ€์ž…(Reference Data Type)
    • ์ฐธ์กฐ ํƒ€์ž…์˜ ์ข…๋ฅ˜๋Š” class, array, interface, Enumeration์ด ์žˆ๋‹ค.
      • ๊ธฐ๋ณธํ˜•์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ์ฐธ์กฐํ˜•์ด๋‹ค.
      • new ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋œ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํƒ€์ž…์ด๋‹ค.
      • String, StringBuffer, List, ๊ฐœ์ธ์ด ๋งŒ๋“  ํด๋ž˜์Šค ๋“ฑ
      • String๊ณผ ๋ฐฐ์—ด์€ ์ฐธ์กฐ ํƒ€์ž…๊ณผ ๋‹ฌ๋ฆฌ new ์—†์ด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ํƒ€์ž…์ด ์•„๋‹Œ ์ฐธ์กฐ ํƒ€์ž…์ด๋‹ค.
    • ์ฐธ์กฐ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ€๋ณ€์ , ๋™์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” Heap ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.
    • ๋” ์ด์ƒ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๋•Œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ์˜ํ•ด ํŒŒ๊ดด๋œ๋‹ค.
    • ์ฐธ์กฐ ํƒ€์ž…์€ ๊ฐ’์ด ์ €์žฅ๋œ ๊ณณ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์œผ๋กœ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. (Call-By-Value)

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Wrapper class

ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์†Œ๋“œ์˜ ์ธ์ˆ˜๋กœ ๊ฐ์ฒด ํƒ€์ž…๋งŒ์ด ์š”๊ตฌ๋˜๋ฉด, ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค. ์ด๋•Œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ ํ›„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์ž๋ฐ”์—์„œ ์ œ๊ณตํ•˜๋Š” Wrapper class

๊ธฐ๋ณธ ํƒ€์ž… ๋ž˜ํผ ํด๋ž˜์Šค
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

์ด๋ ‡๊ฒŒ 8๊ฐœ์˜ ๊ธฐ๋ณธ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ํฌ์žฅํ•ด ์ฃผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ž˜ํผ ํด๋ž˜์Šค(Wrapper class)๋ผ๊ณ  ํ•œ๋‹ค. ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„, ํ•ด๋‹น ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค. ์ด๋Ÿฌํ•œ ๋ž˜ํผ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ java.lang ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์ œ๊ณต๋œ๋‹ค.

๋ฐ•์‹ฑ(Boxing), ์–ธ๋ฐ•์‹ฑ(Unboxing)

๋ž˜ํผ ํด๋ž˜์Šค(Wrapper class)๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ์„ ์œ„ํ•ด ์ •์˜๋œ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ, ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ๋‹จ์ง€, ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’๋งŒ์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ž˜ํผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ•์‹ฑ(Boxing), ๋ž˜ํผ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์„ ๋‹ค์‹œ ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋กœ ๊บผ๋‚ด๋Š” ๊ณผ์ •์„ ์–ธ๋ฐ•์‹ฑ(UnBoxing)์ด๋ผ๊ณ  ํ•œ๋‹ค.

์˜คํ†  ๋ฐ•์‹ฑ(AutoBoxing)๊ณผ ์˜คํ†  ์–ธ๋ฐ•์‹ฑ(AutoUnBoxing)

JDK 1.5๋ถ€ํ„ฐ๋Š” ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ์ž๋™ํ™”๋œ ๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์„ ์˜คํ†  ๋ฐ•์‹ฑ(AutoBoxing)๊ณผ ์˜คํ†  ์–ธ๋ฐ•์‹ฑ(AutoUnBoxing)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

Integer num = new Integer(17); // ๋ฐ•์‹ฑ
int n = num.intValue();        // ์–ธ๋ฐ•์‹ฑ
System.out.println(n); // ์ถœ๋ ฅ ๊ฐ’: 17


Character ch = 'X'; // Character ch = new Character('X'); : ์˜คํ† ๋ฐ•์‹ฑ
char c = ch;        // char c = ch.charValue();           : ์˜คํ† ์–ธ๋ฐ•์‹ฑ
System.out.println(c); // ์ถœ๋ ฅ ๊ฐ’: X
17
X

์˜คํ†  ๋ฐ•์‹ฑ์„ ์ด์šฉํ•˜๋ฉด new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ž๋™์œผ๋กœ Character ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ charValue() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„, ์˜คํ†  ์–ธ๋ฐ•์‹ฑ์„ ์ด์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์„ ๋ฐ”๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

public class Wrapper02 {
    public static void main(String[] args) {
        Integer num1 = new Integer(7); // ๋ฐ•์‹ฑ
        Integer num2 = new Integer(3); // ๋ฐ•์‹ฑ

        int int1 = num1.intValue();    // ์–ธ๋ฐ•์‹ฑ
        int int2 = num2.intValue();    // ์–ธ๋ฐ•์‹ฑ

        Integer result1 = num1 + num2; // 10 
        Integer result2 = int1 - int2; // 4
        int result3 = num1 * int2;     // 21
    }
}
public class Wrapper03 {
    public static void main(String[] args) {
      Integer num1 = new Integer(10);
      Integer num2 = new Integer(20);
      Integer num3 = new Integer(10);

      System.out.println(num1 < num2);       // true
      System.out.println(num1 == num3);      // false
      System.out.println(num1.equals(num3)); // true
    }
}

๋ž˜ํผ ํด๋ž˜์Šค์˜ ๋น„๊ต ์—ฐ์‚ฐ๋„ ์˜คํ† ์–ธ๋ฐ•์‹ฑ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•ด์ง€์ง€๋งŒ, ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์˜ ๋™๋“ฑ ์—ฌ๋ถ€ ํŒ๋‹จ์€ ๋น„๊ต ์—ฐ์‚ฐ์ž์ธ ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๋ž˜ํผ ํด๋ž˜์Šค๋„ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ๋‘ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‘ ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™๋“ฑ ์—ฐ์‚ฐ์ž(==)๋กœ ๋น„๊ตํ•˜๊ฒŒ ๋˜๋ฉด, ์–ธ์ œ๋‚˜ false ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๊ฐ’์˜ ๋™๋“ฑ ์—ฌ๋ถ€๋ฅผ ์ •ํ™•ํžˆ ํŒ๋‹จํ•˜๋ ค๋ฉด equals() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

OOP์˜ 4๊ฐ€์ง€ ํŠน์ง•

  1. ์ถ”์ƒํ™”(Abstraction)
    • ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ฌผ๋“ค์˜ ๊ณตํ†ต์ ์ธ ํŠน์ง•์„ ํŒŒ์•…ํ•ด์„œ ์ด๋ฅผ ํ•˜๋‚˜์˜ ๊ฐœ๋…(์ง‘ํ•ฉ)์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ
  2. ์บก์Šํ™”(Encapsulation)
    • ์ •๋ณด ์€๋‹‰(information hiding): ํ•„์š”๊ฐ€ ์—†๋Š” ์ •๋ณด๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•˜๋Š” ๊ฒƒ
    • ๋†’์€ ์‘์ง‘๋„, ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ์œ ์ง€ํ•˜์—ฌ ์œ ์—ฐํ•จ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€
  3. ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„(Inheritance, ์ƒ์†)
    • ์—ฌ๋Ÿฌ ๊ฐœ์ฒด๋“ค์ด ๊ฐ€์ง„ ๊ณตํ†ต๋œ ํŠน์„ฑ์„ ๋ถ€๊ฐ์‹œ์ผœ ํ•˜๋‚˜์˜ ๊ฐœ๋…์ด๋‚˜ ๋ฒ•์น™์œผ๋กœ ์„ฑ๋ฆฝ์‹œํ‚ค๋Š” ๊ณผ์ •
  4. ๋‹คํ˜•์„ฑ(Polymorphism)
    • ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ๊ฐ์ž์˜ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋Šฅ๋ ฅ
    • ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding), ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)

โซTop โ†ฉ๏ธBack โ„น๏ธHome

OOP์˜ 5๋Œ€ ์›์น™

"SOLID" ์›์น™

  • S: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP, Single Responsibility Principle)
    • ๊ฐ์ฒด๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • O: ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(OCP, Open Closed Principle)
    • ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • L: ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(LSP, Liskov Substitution Principle)
    • ์ผ๋ฐ˜ํ™” ๊ด€๊ณ„์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋ฉฐ, ์ž์‹ ํด๋ž˜์Šค๋Š” ์ตœ์†Œํ•œ ์ž์‹ ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ๊ฐ€๋Šฅํ•œ ํ–‰์œ„๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • I: ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(ISP, Interface Segregation Principle)
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ํŠนํ™”๋˜๋„๋ก ๋ถ„๋ฆฌ์‹œํ‚ค๋ผ๋Š” ์„ค๊ณ„ ์›์น™์ด๋‹ค.
  • D: ์˜์กด ์—ญ์ „ ์›์น™(DIP, Dependency Inversion Principle)
    • ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์„ ๋•Œ ๋ณ€ํ™”ํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ ๋˜๋Š” ์ž์ฃผ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋ณ€ํ™”ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ, ๊ฑฐ์˜ ๋ณ€ํ™”๊ฐ€ ์—†๋Š” ๊ฒƒ์— ์˜์กดํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฐจ์ด

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

โซTop โ†ฉ๏ธBack โ„น๏ธHome

๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€

  • ๊ฐ์ฒด(Object)
    • ํ˜„์‹ค์„ธ๊ณ„์˜ ์‹ค์ฒด ๋ฐ ๊ฐœ๋…์„ ๋ฐ˜์˜ํ•˜๋Š” ์ƒํƒœ(Status)์™€ ํ–‰์œ„(Behavior)๋ฅผ ์ •์˜ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ
  • ๊ฐ์ฒด์ง€ํ–ฅ(Object-Oriented) ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ๊ฐ์ž์˜ ์—ญํ• ์„ ์ง€๋‹Œ ๊ฐ์ฒด๋“ค๋ผ๋ฆฌ ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๊ฒƒ

๊ฐ์ฒด์ง€ํ–ฅ์˜ ์žฅ์ (๊ฐ•์ )

๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

  • ์‚ฌ๋žŒ์˜ ๊ด€์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ดํ•ดํ•˜๊ณ  ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ๊ฐ•ํ•œ ์‘์ง‘๋ ฅ(Strong Cohesion)๊ณผ ์•ฝํ•œ ๊ฒฐํ•ฉ๋ ฅ(Weak Coupling)์„ ๊ฐ€์ง„๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ, ์œตํ†ต์„ฑ์ด ๋†’๋‹ค.

์ด๋Ÿฌํ•œ ์žฅ์  ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์šฉ์ดํ•˜๊ณ  ์„ค๊ณ„๊ณผ ๋ถ„์„์ด ๋น„๊ต์  ์‰ฝ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋‹จ์ (ํ•œ๊ณ„)

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

๊ฐ์ฒด์ง€ํ–ฅ์  ์„ค๊ณ„์›์น™ SOLID

  • SRP(Single Responsibility Principle)๋‹จ์ผ ์ฑ…์ž„ ์›์น™
    • ํด๋ž˜์Šค๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ด์œ ์ด์–ด์•ผ ํ•œ๋‹ค.
  • OCP(Open-Closed Principle) : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™
    • ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • LSP(Liskov Substitution Principle) : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™
    • ์ƒ์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜์œ„ ํƒ€์ž…์˜ ๊ฐ์ฒด๋กœ ์น˜ํ™˜ํ•ด๋„ ์ƒ์œ„ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • ISP(Interface Segregation Principle) : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™
    • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • DIP(Dependency Inversion Principle) : ์˜์กด ์—ญ์ „ ์›์น™
    • ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์˜ ๊ตฌํ˜„์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

๊ฐ์ฒด์ง€ํ–ฅ์˜ ํŠน์ง•

  • ์ถ”์ƒํ™”
    • ๊ฐ์ฒด์—์„œ ๊ณตํ†ต๋œ ์†์„ฑ์ด๋‚˜ ๊ธฐ๋Šฅ์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ. ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ(๊ด€์‹ฌ ๋Œ€์ƒ์ด ์•„๋‹Œ ๊ฒƒ)์€ ๊ฐ์ถ”๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜๊ณ , ์ค‘์š”ํ•œ ๊ฒƒ(๊ด€์‹ฌ์žˆ๋Š” ๊ฒƒ)๋งŒ์„ ๊ฐ•์กฐํ•˜์—ฌ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ. ๊ด€์ ์— ๋”ฐ๋ผ ์ถ”์ƒํ™”์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ์—๋งŒ ์ง‘์ค‘ํ•จ์œผ๋กœ์จ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณต์žก๋„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์บก์Šํ™”
    • ๊ด€์‹ฌ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋†“๊ณ  ํŒจํ‚นํ•œ ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ์ด๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜๊ณ  ์™ธ๋ถ€์—์„œ ๋งˆ์Œ๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒํ•˜์˜€๋‹ค. ๊ณผ๊ฑฐ ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๊ฑฐ๋Œ€ํ•ด์งˆ์ˆ˜๋ก ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์› ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์บก์Šํ™”๋ฅผ ํ†ตํ•ด ์ด๋Ÿฐ ํ๋‹จ์„ ํ•ด๊ฒฐํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ์™ธ๋ถ€์—์„œ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ฐจ๋‹จํ•˜๋Š” ๊ฐœ๋…์„ ์ •๋ณด ์€๋‹‰ํ™”(Information Hiding)๋ผ๊ณ  ํ•˜๋ฉฐ ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์บก์Šํ™”๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ๋‹คํ˜•์„ฑ
    • ๊ฐ™์€ ์ฝ”๋“œ๋ผ ํ•˜๋”๋ผ๋„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์„ฑ์งˆ. Java์—์„œ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ Overriding๊ณผ Overloading์ด ์žˆ๋‹ค.
    • Overriding
      • ์ž„์˜์˜ ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๊ฑฐ๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ์ƒ์œ„ ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ์žฌ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค๋Š” ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ•์ œ๋œ๋‹ค.)
    • Overloading
      • ๋ฉ”์†Œ๋“œ์— ์ฃผ์–ด์ง„ ์ธ์ž(parameter)์— ๋”ฐ๋ผ ๋™์ž‘์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ์˜ ์ค‘๋ณต์ด ์ค„์–ด๋“ค๊ณ , ๊ฐ€๋…์„ฑ์ด ๋Š˜์–ด๋‚œ๋‹ค. ๋ฐ˜ํ™˜ ํ˜•(return type)์€ ๊ด€๊ณ„๊ฐ€ ์—†์ง€๋งŒ, ์ธ์ž์˜ ๊ฐœ์ˆ˜, ์ธ์ž์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์†
    • ๋ถ€๋ชจ์˜ ํ˜•์งˆ์„ ์ด์–ด๋ฐ›๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ, ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ๋”ํ•ด ์ƒˆ๋กœ์šด ์†์„ฑ๊ณผ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ผ ํ•˜๋”๋ผ๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)์„ ํ†ตํ•˜์—ฌ ์žฌ์ •์˜ํ•˜์—ฌ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†์‰ฝ๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ํด๋ž˜์Šค๋“ค์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•˜๋‹ค.
  • ํด๋ž˜์Šค(class)
    • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ƒํƒœ(field)์™€ ํ–‰์œ„(method)๋ฅผ ์ •์˜ํ•œ ํ‹€.
  • ๋ฉ”์‹œ์ง€
    • ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ตฌํ˜„๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐ์ฒด๋“ค๋ผ๋ฆฌ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ๋™์ž‘ํ•œ๋‹ค. ์ฝ”๋“œ์ ์œผ๋กœ๋Š” ์ž„์˜์˜ ๊ฐ์ฒด์—๊ฒŒ ์ธ์ž(parameter)๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ๋ฐ˜ํ™˜๊ฐ’(return value)์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ non-static ๋ฉค๋ฒ„์™€ static ๋ฉค๋ฒ„์˜ ์ฐจ์ด

  • non-static ๋ฉค๋ฒ„
    • ๊ณต๊ฐ„์  ํŠน์„ฑ: ๋ฉค๋ฒ„๋Š” ๊ฐ์ฒด๋งˆ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌํ•œ๋‹ค.
      • ์ธ์Šคํ„ด์Šค ๋ฉค๋ฒ„ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์‹œ๊ฐ„์  ํŠน์„ฑ: ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์— ๋ฉค๋ฒ„๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
      • ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธธ ๋•Œ ๋ฉค๋ฒ„๋„ ์ƒ์„ฑ๋œ๋‹ค.
      • ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ๋ฉค๋ฒ„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ๋ฉค๋ฒ„๋„ ์‚ฌ๋ผ์ง„๋‹ค.
    • ๊ณต์œ ์˜ ํŠน์„ฑ: ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.
      • ๋ฉค๋ฒ„๋Š” ๊ฐ์ฒด ๋‚ด์— ๊ฐ๊ฐ์˜ ๊ณต๊ฐ„์„ ์œ ์ง€ํ•œ๋‹ค.
  • static ๋ฉค๋ฒ„
    • ๊ณต๊ฐ„์  ํŠน์„ฑ: ๋ฉค๋ฒ„๋Š” ํด๋ž˜์Šค๋‹น ํ•˜๋‚˜๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
      • ๋ฉค๋ฒ„๋Š” ๊ฐ์ฒด ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ๊ณต๊ฐ„์— ์ƒ์„ฑ๋œ๋‹ค.
      • ํด๋ž˜์Šค ๋ฉค๋ฒ„ ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์‹œ๊ฐ„์  ํŠน์„ฑ: ํด๋ž˜์Šค ๋กœ๋”ฉ ์‹œ์— ๋ฉค๋ฒ„๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
      • ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „์— ์ด๋ฏธ ์ƒ์„ฑ๋œ๋‹ค.
      • ๊ฐ์ฒด๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „์—๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (์ฆ‰, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)
      • ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ ธ๋„ ๋ฉค๋ฒ„๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
      • ๋ฉค๋ฒ„๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ์‚ฌ๋ผ์ง„๋‹ค.
    • ๊ณต์œ ์˜ ํŠน์„ฑ: ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์— ์˜ํ•ด ๊ณต์œ ๋œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

โ“java์˜ main ๋ฉ”์„œ๋“œ๊ฐ€ static์ธ ์ด์œ 

  • static ํ‚ค์›Œ๋“œ
    • static ๋ฉค๋ฒ„๋Š” ํด๋ž˜์Šค ๋กœ๋”ฉ(ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘) ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋˜์–ด ์ธ์Šคํ„ดํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • main ๋ฉ”์„œ๋“œ๊ฐ€ static์ธ ์ด์œ 
    •   public static void main(String[] args){...}
    • ์œ„์™€ ๊ฐ™์€ ํ˜•์‹์€ java์—์„œ์˜ main() ๊ด€๋ก€์ด๋‹ค. ์œ„์™€ ๊ฐ™์€ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
    • JVM์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค์˜ main()์„ ํ˜ธ์ถœํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— static์ด์–ด์•ผ ํ•œ๋‹ค.
  • JVM๊ณผ static
    • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .java ์ฝ”๋“œ๋ฅผ .class(byte code)๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    • ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ .classํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(Runtime Data Area)์— ๋กœ๋“œํ•œ๋‹ค.
    • Runtime Data Area ์ค‘ Meathod Area(= Class area = Static area)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์˜์—ญ์— Class Variable์ด ์ €์žฅ๋˜๋Š”๋ฐ, static ๋ณ€์ˆ˜ ๋˜ํ•œ ์—ฌ๊ธฐ์— ํฌํ•จ๋œ๋‹ค.
    • JVM์€ Meathod Area์— ๋กœ๋“œ๋œ main()์„ ์‹คํ–‰ํ•œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ final ํ‚ค์›Œ๋“œ

  • final ํ‚ค์›Œ๋“œ
    • ๊ฐœ๋…: ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ๋˜๋Š” ํด๋ž˜์Šค๊ฐ€ '๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ'ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
    • ์›์‹œ(Primitive) ๋ณ€์ˆ˜์— ์ ์šฉ ์‹œ
      • ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ฐธ์กฐ(Reference) ๋ณ€์ˆ˜์— ์ ์šฉ ์‹œ
      • ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ํž™(heap) ๋‚ด์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋ฉ”์„œ๋“œ์— ์ ์šฉ ์‹œ
      • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์—†๋‹ค.
    • ํด๋ž˜์Šค์— ์ ์šฉ ์‹œ
      • ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.
  • finally ํ‚ค์›Œ๋“œ
    • ๊ฐœ๋…: try/catch ๋ธ”๋ก์ด ์ข…๋ฃŒ๋  ๋•Œ ํ•ญ์ƒ ์‹คํ–‰๋  ์ฝ”๋“œ ๋ธ”๋ก์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
    • finally๋Š” ์„ ํƒ์ ์œผ๋กœ try ํ˜น์€ catch ๋ธ”๋ก ๋’ค์— ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • finally ๋ธ”๋ก์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ•ญ์ƒ ์‹คํ–‰๋œ๋‹ค.
      • ๋‹จ, JVM์ด try ๋ธ”๋ก ์‹คํ–‰ ์ค‘์— ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•œ๋‹ค.
    • finally ๋ธ”๋ก์€ ์ข…์ข… ๋’ท๋งˆ๋ฌด๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
    • finally ๋ธ”๋ก์€ try์™€ catch ๋ธ”๋ก ๋‹ค์Œ๊ณผ, ํ†ต์ œ๊ถŒ์ด ์ด์ „์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€๊ธฐ ์ „ ์‚ฌ์ด์— ์‹คํ–‰๋œ๋‹ค.
  • finalize() ๋ฉ”์„œ๋“œ
    • ๊ฐœ๋…: ์“ฐ๋ ˆ๊ธฐ ์ˆ˜์ง‘๊ธฐ(GC, Garbage Collector)๊ฐ€ ๋” ์ด์ƒ์˜ ์ฐธ์กฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œํ•˜๊ฒ ๋‹ค๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ์ˆœ๊ฐ„ ํ˜ธ์ถœ๋œ๋‹ค.
    • Object ํด๋ž˜์Šค์˜ finalize() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ๋งž์ถค๋ณ„ GC๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • protected void finalize() throws Throwable { // ํŒŒ์ผ ๋‹ซ๊ธฐ, ์ž์› ๋ฐ˜ํ™˜ ๋“ฑ๋“ฑ }

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ ์ œ๋„ค๋ฆญ๊ณผ c++์˜ ํ…œํ”Œ๋ฆฟ์˜ ์ฐจ์ด

  • java์˜ ์ œ๋„ค๋ฆญ(Generic)
    • ๊ฐœ๋…: ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํƒ€์ž…์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ผ๋ฐ˜ํ™”๋œ ํƒ€์ž… ๋งค๊ฐœ ๋ณ€์ˆ˜(generic type)๋กœ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ธฐ๋ฒ•
    • ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•: ํƒ€์ž… ์ œ๊ฑฐ(type erasure)๋ผ๋Š” ๊ฐœ๋…์— ๊ทผ๊ฑฐํ•œ๋‹ค.
      • ์†Œ์Šค ์ฝ”๋“œ๋ฅผ JVM์ด ์ธ์‹ํ•˜๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒ€์ž…์„ ์ œ๊ฑฐํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
      • ์ œ๋„ค๋ฆญ์ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์—†๋‹ค. ๋‹จ์ง€ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ์˜ˆ์˜๊ฒŒ ํ•  ๋ฟ์ด๋‹ค.
      • ๊ทธ๋ž˜์„œ java์˜ ์ œ๋„ค๋ฆญ(Generic)์€ ๋•Œ๋กœ๋Š” ๋ฌธ๋ฒ•์  ์–‘๋…(syntactic sugar) ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
Vector<String> vector = new Vector<String>();
vector.add(new String("hello"));
String str = vector.get(0);

// ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ™˜
Vector vector = new Vector();
vector.add(new String("hello"));
String str = (String) vector.get(0);
  • c++์˜ ํ…œํ”Œ๋ฆฟ(Template)
    • ๊ฐœ๋…: ํ…œํ”Œ๋ฆฟ์€ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ํƒ€์ž…์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•
      • ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
    • ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•: ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๊ฐ๊ฐ์˜ ํƒ€์ž…์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด MyClass๊ฐ€ MyClass์™€ ์ •์  ๋ณ€์ˆ˜(static variable)๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      • ํ•˜์ง€๋งŒ java์—์„œ ์ •์  ๋ณ€์ˆ˜๋Š” ์ œ๋„ค๋ฆญ(Generic) ์ธ์ž๋กœ ์–ด๋–ค ํƒ€์ž…์„ ์ฃผ์—ˆ๋Š”์ง€์— ๊ด€๊ณ„์—†์ด MyClass๋กœ ๋งŒ๋“  ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.
      • ์ฆ‰, ํ…œํ”Œ๋ฆฟ์€ ์ข€ ๋” ์šฐ์•„ํ•œ ํ˜•ํƒœ์˜ ๋งคํฌ๋กœ ๋‹ค.
/** MyClass.h **/
template<class T> class MyClass {
  public:
    static int val;
    MyClass(int v) { val = v; }
};

/** MyClass.cpp **/
template<typename T>
int MyClass<T>::bar;
template class MyClass<Foo>;
template class MyClass<Bar>;

/** main.cpp **/
MyClass<Foo> * foo1 = new MyClass<Foo>(10);
MyClass<Foo> * foo2 = new MyClass<Foo>(15);
MyClass<Bar> * bar1 = new MyClass<Bar>(20);
MyClass<Bar> * bar2 = new MyClass<Bar>(35);
int f1 = foo1->val; // 15
int f2 = foo2->val; // 15
int b1 = bar1->val; // 35
int b2 = bar2->val; // 35
  • java์˜ ์ œ๋„ค๋ฆญ๊ณผ c++์˜ ํ…œํ”Œ๋ฆฟ์˜ ์ฐจ์ด
    1. List์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์œ ์—์„œ ๋™๋“ฑํ•œ ๊ฐœ๋…์œผ๋กœ ์ฐฉ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋‘ ์–ธ์–ด๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๋งŽ์ด ๋‹ค๋ฅด๋‹ค.
    2. c++์˜ Template์—๋Š” int์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋„˜๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ, java์˜ Generic์—์„œ๋Š” Integer์„ ๋Œ€์‹  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    3. c++์˜ Template์€ ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ํƒ€์ž…์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, java์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    4. java์—์„œ MyClass๋กœ ๋งŒ๋“  ๋ชจ๋“  ๊ฐ์ฒด๋Š” Generic ํƒ€์ž… ์ธ์ž๊ฐ€ ๋ฌด์—‡์ด๋ƒ์— ๊ด€๊ณ„์—†์ด ์ „๋ถ€ ๋™๋“ฑํ•œ ํƒ€์ž…์ด๋‹ค.(์‹คํ–‰ ์‹œ๊ฐ„์— ํƒ€์ž… ์ธ์ž ์ •๋ณด๋Š” ์‚ญ์ œ๋œ๋‹ค.)
      • c++์—์„œ๋Š” ๋‹ค๋ฅธ Template ํƒ€์ž… ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“  ๊ฐ์ฒด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ์ฒด์ด๋‹ค.
    5. java์˜ ๊ฒฝ์šฐ Generic ํƒ€์ž… ์ธ์ž๋ฅผ ํŠน์ •ํ•œ ํƒ€์ž…์ด ๋˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด CardDeck์„ Generic ํด๋ž˜์Šค๋กœ ์ •์˜ํ•  ๋•Œ CardGame์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
    6. java์—์„œ Generic ํƒ€์ž…์˜ ์ธ์ž๋Š” ์ •์  ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์—†๋‹ค.
      • ์™œ๋ƒํ•˜๋ฉด MyClass๋‚˜ MyClass๊ฐ€ ์ด ๋ฉ”์„œ๋“œ์™€ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      • c++ Template์€ ์ด ๋‘ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ Template ํƒ€์ž… ์ธ์ž๋ฅผ ์ •์  ๋ฉ”์„œ๋“œ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  • java์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection) ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

    • GC ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ํ•˜๋Š” ์ผ
      1. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
      2. ์‚ฌ์šฉ ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ ์ธ์‹
      3. ๋ฏธ์‚ฌ์šฉ ๋ฉ”๋ชจ๋ฆฌ ์ธ์‹
    • Stop the World
      • ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ GC ์‹คํ–‰ ์‹œ GC ์‹คํ–‰ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ๋ฉˆ์ถ”๊ณ , GC ์™„๋ฃŒ ํ›„ ๋‹ค์‹œ ์Šค๋ ˆ๋“œ๋“ค์„ ์‹คํ–‰ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
      • Stop the World๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์ด ๋ฉˆ์ถ”๋Š” ์ƒํƒœ
      • ์–ด๋–ค GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, Stop the World๋Š” ๋ถˆ๊ฐ€ํ”ผํ•˜๋ฉฐ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด GC ํŠœ๋‹์„ ์ง„ํ–‰

    jvmheap

    • ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ๋“ค๋ฅด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ Young ์˜์—ญ์— ํฌํ•จ๋˜๋Š” Eden, Survivor1, Survivor2์™€ Old ์˜์—ญ (Permanent ์˜์—ญ์€ Java 1.8 ๋ถ€ํ„ฐ ์ œ๊ฑฐ)
    • Young ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋Š” ๊ฐ ํ•˜์œ„ ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๋ฉด Miner GC๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ๋”์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์ œ๊ฑฐ
    • Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๋ฉด Major GC(Full GC)๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ๋”์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด ์ œ๊ฑฐ
    • ๋™์ž‘ ๊ณผ์ •
      • ๊ฐ์ฒด๋ฅผ ์ตœ์ดˆ ์ƒ์„ฑํ•˜๋ฉด Young ์˜์—ญ ์ค‘ Eden ์˜์—ญ์— ์œ„์น˜
      • Eden ์˜์—ญ์—์„œ Miner GC ๋ฐœ์ƒ ์‹œ, ์ฐธ์กฐ ์ค‘์ธ ๊ฐ์ฒด๋ผ๋ฉด Survivor1๋กœ ์ด๋™
      • Survivor1์—์„œ Miner GC ๋ฐœ์ƒ ์‹œ, ์ฐธ์กฐ ์ค‘์ธ ๊ฐ์ฒด๋ผ๋ฉด Survivor2๋กœ ์ด๋™
      • Survivor2์—์„œ Miner GC ๋ฐœ์ƒ ์‹œ, ์ฐธ์กฐ ์ค‘์ธ ๊ฐ์ฒด๋ผ๋ฉด ๋‹ค์‹œ Survivor1 ์˜์—ญ์œผ๋กœ ์ด๋™ (Survivor1 <--> 2 ๋ฐ˜๋ณต)
      • Survivor ์˜์—ญ์ด ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ Young ์˜์—ญ์—์„œ ์˜ค๋ž˜ ์‚ด์•„๋‚จ์€ ๊ฐ์ฒด๋Š” Old ์˜์—ญ์œผ๋กœ ์ด๋™
        • '์˜ค๋ž˜'์˜ ๊ธฐ์ค€์€ ๊ฐ์ฒด๋งˆ๋‹ค age bit๋ผ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์ด๋Š” Miner GC์—์„œ ์‚ด์•„๋‚จ์€ ํšŸ์ˆ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐ’
      • Old ์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๋Š” Major GC๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฐธ์กฐ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ณต๊ฐ„์ด ์œ ์ง€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ

java9์˜ default GC

G1GC
  • Garbage First Garbage Collector
  • Java 9, 10์˜ default GC
  • Java 7, 8์˜ default GC๋Š” ParallelGC
    • ํ™œ์„ฑํ™” ์˜ต์…˜ -XX:+UseG1GC
  • ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ GC
  • Stop the World ์ตœ์†Œํ™” ๋ชฉ์ (์‹ค์‹œ๊ฐ„ GC๋Š” ๋ถˆ๊ฐ€๋Šฅ)
  • ํ†ต๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉด์„œ GC ์ž‘์—…๋Ÿ‰ ์กฐ์ ˆ
  • G1์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ
    • Java heap์˜ 50% ์ด์ƒ์ด ๋ผ์ด๋ธŒ ๋ฐ์ดํ„ฐ์ผ ๋•Œ
    • GC๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๋•Œ(0.5์ดˆ ~ 1์ดˆ)
G1GC ํŠน์ง•
  • ๋‹ค๋ฅธ GC์™€ ๋‹ค๋ฅด๊ฒŒ ์ „์ฒด ํž™ ๊ณต๊ฐ„์„ ์ฒด์ŠคํŒ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌ
    • GC ๋ฐœ์ƒ ์‹œ, ์ „์ฒด ํž™์ด ์•„๋‹Œ ์ผ๋ถ€ ์˜์—ญ์—์„œ๋งŒ GC ์ˆ˜ํ–‰
    • ๋”ฐ๋ผ์„œ ํฐ ํž™ ํฌ๊ธฐ๋ฅผ ๊ฐ€์งˆ ๊ฒฝ์šฐ ์œ ๋ฆฌ
  • ์˜์—ญ์˜ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋ชฉ์ ์œผ๋กœ remember set์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ(set์€ ์ „์ฒด ํž™์˜ 5% ๋ฏธ๋งŒ ํฌ๊ธฐ)

g1gc

  • ํšŒ์ƒ‰ : ๋นˆ ์˜์—ญ / ๋นจ๊ฐ„์ƒ‰ : Eden ์˜์—ญ / ๋นจ๊ฐ„์ƒ‰ S : Survivor ์˜์—ญ / ํŒŒ๋ž€์ƒ‰ : Old ์˜์—ญ(ํŒŒ๋ž€์ƒ‰ H๋Š” ํฌ๊ธฐ๊ฐ€ ์ปค์„œ ์—ฌ๋Ÿฌ ์˜์—ญ ์ฐจ์ง€ํ•˜๋Š” ๊ฐ์ฒด)
  • Young๊ณผ Old ์˜์—ญ์˜ ๊ตฌ๋ถ„ ์—†์ด ์‚ฌ์šฉ
  • ๋น„์–ด์žˆ๋Š” ์˜์—ญ์— ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๊ฐ์ฒด ์œ„์น˜
  • STW ์‹œ๊ฐ„ ์ตœ์†Œํ™”๋ฅผ ์œ„ํ•ด ๋ณ‘๋ ฌ GC ์ž‘์—… ์ฒ˜๋ฆฌ(๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์‹ ๋งŒ์˜ ์˜์—ญ์„ ์žก๊ณ  ์ž‘์—…)
G1GC ๋™์ž‘ ๊ณผ์ •
  • Young ์˜์—ญ(Eden, Survivor)์—์„œ๋Š” Young GC๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉฐ Eden, Survivor ์˜์—ญ ์ด๋™
    • ์˜ฎ๊ธฐ๋ฉด์„œ ๋น„์›Œ์ง„ ์˜์—ญ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋นˆ ์˜์—ญ์œผ๋กœ ๋˜๋Œ๋ฆผ
  • Full GC ์ˆ˜ํ–‰ ๋‹จ๊ณ„
    • Initial Mark -> Root Region Scan -> Concurrent Mark -> Remark -> Cleanup -> Copy
    • Initial Mark
      • Old ์ง€์—ญ์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” Survivor ์˜์—ญ ํƒ์ƒ‰
      • STW ๋ฐœ์ƒ
    • Root Region Scan
      • ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ฐพ์€ ์˜์—ญ์— ๋Œ€ํ•œ GC ๋Œ€์ƒ ๊ฐ์ฒด ์Šค์บ”
    • Concurrent Mark
      • ์ „์ฒด ํž™ ์˜์—ญ ์Šค์บ”
      • GC ๋Œ€์ƒ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ์˜์—ญ์€ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ œ์™ธ
    • Remark
      • STW๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ตœ์ข…์œผ๋กœ GC ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•  ๊ฐ์ฒด ์‹๋ณ„
    • Cleanup
      • STW๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์ œ๊ฑฐํ•  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ง€์—ญ์—์„œ GC ์ˆ˜ํ–‰
      • ์™„๋ฃŒ ํ›„, ์™„์ „ํžˆ ๋น„์›Œ์ง„ ์˜์—ญ์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Freelist์— ์ถ”๊ฐ€
    • Copy
      • GC ๋Œ€์ƒ์ด์—ˆ์ง€๋งŒ Cleanup ๋‹จ๊ณ„์—์„œ ์™„์ „ํžˆ ๋น„์›Œ์ง€์ง€ ์•Š์€ ์ง€์—ญ์˜ ๋‚จ์€ ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ์˜์—ญ์— ๋ณต์‚ฌํ•˜์—ฌ ์กฐ๊ฐ ๋ชจ์Œ(Compaction) ์ž‘์—… ์ˆ˜ํ–‰
G1GC vs ParallelGC
  • ParallelGC๋Š” Old Generation ์˜์—ญ์—์„œ๋งŒ Full GC(๊ณต๊ฐ„ ์žฌํ™•๋ณด ๋ฐ ์กฐ๊ฐ ๋ชจ์Œ) ์ˆ˜ํ–‰
  • G1์€ ๋” ์งง์€ ์ฃผ๊ธฐ์˜ Full GC ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ „์ฒด์ ์ธ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์ค„์–ด๋“œ๋Š” ๋Œ€์‹  ์ผ์‹œ ์ •์ง€ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•
G1GC vs CMS
  • CMS๋Š” Old Generation์˜ ์กฐ๊ฐ ๋ชจ์Œ(Compaction)์„ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Full GC ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • CMS๋Š” Old ์˜์—ญ ์‚ฌ์šฉ๋Ÿ‰์ด ํŠน์ • ๊ธฐ์ค€์น˜ ๊ฐ’ ๋„˜์–ด๊ฐ€๋ฉด ์ˆ˜ํ–‰
  • G1GC๋Š” Old ์˜์—ญ์—์„œ GC ๋ฐœ์ƒ ์‹œ, ํž™ ์‚ฌ์šฉ๋Ÿ‰์ด ํŠน์ • ๊ธฐ์ค€์น˜ ๊ฐ’์„ ๋„˜์–ด๊ฐ€๋ฉด ์‹คํ–‰

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ž€ ๋ฌด์—‡์ธ๊ฐ€

  • ์ž๋ฐ” ์ง๋ ฌํ™”(Serialization)๋ž€
    • ์ž๋ฐ” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์˜ ์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”์ดํŠธ(byte) ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ 
    • ์‹œ์Šคํ…œ์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜์ž๋ฉด JVM(Java Virtual Machine ์ดํ•˜ JVM)์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ(ํž™ ๋˜๋Š” ์Šคํƒ)๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ 
  • ์ž๋ฐ” ์ง๋ ฌํ™” ์กฐ๊ฑด
    1. ์ž๋ฐ” ๊ธฐ๋ณธ(primitive) ํƒ€์ž…
    2. java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ์ฒด
  • ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•
    • java.io.ObjectOutputStream ๊ฐ์ฒด๋ฅผ ์ด์šฉ
  • ์ž๋ฐ” ์—ญ์ง๋ ฌํ™”(Deserialization)๋ž€
    • ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ 
    • ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ JVM์œผ๋กœ ์ƒ์ฃผ์‹œํ‚ค๋Š” ํ˜•ํƒœ์˜ ๊ธฐ์ˆ 
  • ์ž๋ฐ” ์—ญ์ง๋ ฌํ™” ์กฐ๊ฑด
    1. ์ง๋ ฌํ™” ๋Œ€์ƒ์ด ๋œ ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค ํŒจ์Šค์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ import ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
      • ์ค‘์š”ํ•œ ์ ์€ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. (๊ฐ™์€ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์ด๋ผ๋„ ์†Œ์Šค ๋ฒ„์ „์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.)
    2. ์ž๋ฐ” ์ง๋ ฌํ™” ๋Œ€์ƒ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ serialVersionUID ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
      • private static final long serialVersionUID = 1L;
  • ์—ญ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•
    • java.io.ObjectInputStream ๊ฐ์ฒด๋ฅผ ์ด์šฉ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

ํด๋ž˜์Šค ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐจ์ด

  • ํด๋ž˜์Šค(Class)
    • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„ ํ˜น์€ ํ‹€
    • ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ์˜ ์ง‘ํ•ฉ
  • ๊ฐ์ฒด(Object)
    • ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์— ๊ตฌํ˜„ํ•  ๋Œ€์ƒ
    • ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ๋ชจ์–‘ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ๋œ ์‹ค์ฒด
    • 'ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(instance)' ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.
    • ๊ฐ์ฒด๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ํฌ๊ด„์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.
    • oop์˜ ๊ด€์ ์—์„œ ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ '๊ฐ์ฒด'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ์ธ์Šคํ„ด์Šค(Instance)
    • ์„ค๊ณ„๋„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์— ๊ตฌํ˜„๋œ ๊ตฌ์ฒด์ ์ธ ์‹ค์ฒด
      • ์ฆ‰, ๊ฐ์ฒด๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด์— ์‹ค์ฒดํ™” ํ•˜๋ฉด ๊ทธ๊ฒƒ์„ '์ธ์Šคํ„ด์Šค'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
      • ์‹ค์ฒดํ™”๋œ ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค.
    • ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ์ฒด์— ํฌํ•จ๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • oop์˜ ๊ด€์ ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜์–ด ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ '์ธ์Šคํ„ด์Šค'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ์ถ”์ƒ์ ์ธ ๊ฐœ๋…(๋˜๋Š” ๋ช…์„ธ)๊ณผ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„ ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
      • '~์˜ ์ธ์Šคํ„ด์Šค' ์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
      • ๊ฐ์ฒด๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋‹ค.
      • ๊ฐ์ฒด ๊ฐ„์˜ ๋งํฌ๋Š” ํด๋ž˜์Šค ๊ฐ„์˜ ์—ฐ๊ด€ ๊ด€๊ณ„์˜ ์ธ์Šคํ„ด์Šค๋‹ค.
      • ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค๋‹ค.
    • ์ฆ‰, ์ธ์Šคํ„ด์Šค๋ผ๋Š” ์šฉ์–ด๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ž˜์Šค์™€ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„๋กœ ํ•œ์ •์ง€์–ด์„œ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค.
    • ์ธ์Šคํ„ด์Šค๋Š” ์–ด๋–ค ์›๋ณธ(์ถ”์ƒ์ ์ธ ๊ฐœ๋…)์œผ๋กœ๋ถ€ํ„ฐ '์ƒ์„ฑ๋œ ๋ณต์ œ๋ณธ'์„ ์˜๋ฏธํ•œ๋‹ค.
/* ํด๋ž˜์Šค */
public class Animal {
  ...
}
/* ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // '๊ฐ์ฒด'

    // ์ธ์Šคํ„ด์Šคํ™”
    cat = new Animal(); // cat์€ Animal ํด๋ž˜์Šค์˜ '์ธ์Šคํ„ด์Šค'(๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น)
    dog = new Animal(); // dog์€ Animal ํด๋ž˜์Šค์˜ '์ธ์Šคํ„ด์Šค'(๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น)
  }
}
  • Q. ํด๋ž˜์Šค VS ๊ฐ์ฒด
    • ํด๋ž˜์Šค๋Š” '์„ค๊ณ„๋„', ๊ฐ์ฒด๋Š” '์„ค๊ณ„๋„๋กœ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๋Œ€์ƒ'์„ ์˜๋ฏธํ•œ๋‹ค.
  • Q. ๊ฐ์ฒด VS ์ธ์Šคํ„ด์Šค
    • ํด๋ž˜์Šค์˜ ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋˜์—ˆ์„ ๋•Œ ๊ฐ์ฒด๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜์–ด ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
    • ๊ฐ์ฒด๋Š” ํ˜„์‹ค ์„ธ๊ณ„์— ๊ฐ€๊น๊ณ , ์ธ์Šคํ„ด์Šค๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ธ๊ณ„์— ๊ฐ€๊น๋‹ค.
    • ๊ฐ์ฒด๋Š” '์‹ค์ฒด', ์ธ์Šคํ„ด์Šค๋Š” '๊ด€๊ณ„'์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.
      • ๊ฐ์ฒด๋ฅผ 'ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค'๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.
    • '๋ฐฉ๊ธˆ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ• ๋‹นํ•œ' ๊ฐ์ฒด๋ฅผ ์ธ์Šคํ„ด์Šค๋ผ๊ณ  ๋งํ•˜์ง€๋งŒ, ์ด๋Š” ์›๋ณธ(์ถ”์ƒ์ ์ธ ๊ฐœ๋…)์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์— ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ผ ๋ฟ ์—„๊ฒฉํ•˜๊ฒŒ ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‚˜๋ˆ„๊ธด ์–ด๋ ต๋‹ค.
  • ์ถ”์ƒํ™” ๊ธฐ๋ฒ•
    1. ๋ถ„๋ฅ˜(Classification)
      • ๊ฐ์ฒด -> ํด๋ž˜์Šค
      • ์‹ค์žฌํ•˜๋Š” ๊ฐ์ฒด๋“ค์„ ๊ณตํ†ต์ ์ธ ์†์„ฑ์„ ๊ณต์œ ํ•˜๋Š” ๋ฒ”๋ถ€ ๋˜๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์œผ๋กœ ๋ฌถ๋Š” ๊ฒƒ
    2. ์ธ์Šคํ„ด์Šคํ™”(Instantiation)
      • ํด๋ž˜์Šค -> ์ธ์Šคํ„ด์Šค
      • ๋ถ„๋ฅ˜์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…. ๋ฒ”์ฃผ๋‚˜ ๊ฐœ๋…์œผ๋กœ๋ถ€ํ„ฐ ์‹ค์žฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •
      • ๊ตฌ์ฒด์ ์œผ๋กœ ํด๋ž˜์Šค ๋‚ด์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด ํŠน์ •ํ•œ ๋ณ€ํ˜•์„ ์ •์˜ํ•˜๊ณ , ์ด๋ฆ„์„ ๋ถ™์ธ ๋‹ค์Œ, ๊ทธ๊ฒƒ์„ ๋ฌผ๋ฆฌ์ ์ธ ์–ด๋–ค ์žฅ์†Œ์— ์œ„์น˜์‹œํ‚ค๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
      • '์˜ˆ์‹œ(Exemplification)'๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

๊ฐ์ฒด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

  • ๊ฐ์ฒด(Object)๋ž€

โซTop โ†ฉ๏ธBack โ„น๏ธHome

์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์˜ ์ฐจ์ด

  • ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)
    • ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์žˆ์œผ๋‚˜ ์ธ์ž์˜ ์ˆ˜๋‚˜ ์ž๋ฃŒํ˜•์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ
    • Ex)
      • public double computeArea(Circle c) { ... }
      • public double computeArea(Circle c1, Circle c2) { ... }
      • public double computeArea(Square c) { ... }
  • ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding)
    • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ์ด๋ฆ„๊ณผ ์šฉ๋ก€(signature)๊ฐ€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์— ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ
    • ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ํด๋ž˜์Šค ๊ฐ„์— ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜
    • Ex) Circle์—์„œ printMe() ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•œ๋‹ค.
public abstract class Shape {
    public void printMe() { System.out.println("Shape"); }
    public abstract double computeArea();
}
public class Circle extends Shape {
    private double rad = 5;
    @Override // ๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด @Override(annotation) ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
    public void printMe() { System.out.println("Circle"); }
    public double computeArea() { return rad * rad * 3.15; }
}
public class Ambiguous extends Shape {
    private double area = 10;
    public double computeArea() { return area; }
}

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Call by Reference์™€ Call by Value์˜ ์ฐจ์ด

  • Call by Value (๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ)
    • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์•ˆ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž„์‹œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค.
    • ๋ณต์‚ฌ๋œ ์ธ์ž๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” local value์˜ ํŠน์„ฑ์„ ๊ฐ€์ง„๋‹ค.
    • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„, ์™ธ๋ถ€์˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Call by Reference (์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ)
    • ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์•ˆ์—์„œ๋Š” ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž„์‹œ ๊ณต๊ฐ„์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ณ€์ˆ˜์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.)
    • ๋”ฐ๋ผ์„œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ธ์ž์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • Java๋Š” Call by Value ์ผ๊นŒ? Call by Reference ์ผ๊นŒ?
class Person {
  private String name;
  public Person(String name) {
    this.name = name;
  }
  public setName(String name) {
    this.name = name;
  }
  @Override
  public String toString() {
    return "name is " + this.name;
  }
}
public class FunctionCallTest {
  public static void assignNewPerson(Person p) {
    p = new Person("hee");
  }
  public static void changeName(Person p) {
    p.setName("hee");
  }

  public static void main(String[] args) {
    Person p = new Person("doy");

    assignNewPerson(p);
    System.out.println(p); // name is doy

    changeName(p);
    System.out.println(p); // name is hee
  }
}
public class FunctionCallTest2 {
    /* parameter๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜ array ์ž์ฒด์˜ Reference๊ฐ€ ์•„๋‹Œ array๊ฐ€ "์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๊ฐ’(Value)" */
    public static void changeContent(int[] array) {
        // If we change the content of arr,
        array[0] = 10;  // Will change the content of array in main()
        array[1] = 11;
    }
    public static void changeRef(int[] array) {
        // If we change the reference,
        array = new int[2];  // Will not change the array in main()
        array[0] = 20;
        array[1] = 21;
    }

    public static void main(String[] args) {
        int[] array = new int[2];
        array[0] = 0;
        array[1] = 1;

        changeContent(array);
        for (int i = 0; i < array.length; i++) {
            // Will print 10 11
            System.out.print(array[i] + " ");  // 10 11
        }
        changeRef(array);
        for (int i = 0; i < array.length; i++) {
            // Will still print 10 11
            // (Change the reference doesn't reflect change here)
            System.out.print(array[i] + " ");  // 10 11
        }
    }
}
  • ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์€ Call By Value์ด๊ณ , ์ฐธ์กฐ์ž๋ฃŒํ˜•์€ Call By Reference์ด๋‹ค??
  • ์˜คํ•ด 1. ํŠน์ • ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • changeName ๋ฉ”์„œ๋“œ๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜ p๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” [์ด๋ฆ„ ์†์„ฑ์ด "doy"์ธ Person ๊ฐ์ฒด]๋ฅผ [์ด๋ฆ„ ์†์„ฑ์ด "hee"์ธ ์ƒˆ๋กœ์šด Person ๊ฐ์ฒด]๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ง€ ์ด๋ฆ„ ์†์„ฑ๋งŒ ๋ณ€๊ฒฝํ–ˆ์„ ๋ฟ์ด๋‹ค.
  • ์˜คํ•ด 2. ์ฐธ์กฐ๋ณ€์ˆ˜๋Š” ์ž„์˜์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋ฉ”์„œ๋“œ๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์ด ๋ ˆํผ๋Ÿฐ์Šค(Call by Reference)์ด๋‹ค.
    • ์ „๋‹ฌ๋œ ๋ ˆํผ๋Ÿฐ์Šค๋Š” ์ฐธ์กฐ๋ณ€์ˆ˜ p ์ž์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์•„๋‹Œ p๊ฐ€ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ฐ’(์ด๊ฒƒ๋„ ๋ ˆํผ๋Ÿฐ์Šค)์ด๋‹ค.
    • ๋งŒ์•ฝ Java๊ฐ€ Call by Reference๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด assignNewPerson ๋ฉ”์„œ๋“œ ์‹คํ–‰ ํ›„์— p ์ฐธ์กฐ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๊ฐ€ [์ด๋ฆ„ ์†์„ฑ์ด "hee"์ธ ์ƒˆ๋กœ์šด Person ๊ฐ์ฒด]๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ๋˜ํ•œ ์ฐธ์กฐ๋ณ€์ˆ˜ p ์ž์ฒด์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Java๋Š” ์ด ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋”ฐ๋ผ์„œ Java๋Š” ํ•ญ์ƒ Call by Value ์ด๋‹ค.
    • ์—ฌ๊ธฐ์„œ value ๋ž€?
      • ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์˜ ๊ฐ’ ๋˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค
    • ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์˜ ๊ฒฝ์šฐ ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.
    • ์ฐธ์กฐ์ž๋ฃŒํ˜•์˜ ๊ฒฝ์šฐ ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๊ฐ’์ด ๋ ˆํผ๋Ÿฐ์Šค์ด๋ฏ€๋กœ ์ธ์ž๋กœ ๋„˜๊ธธ ๋•Œ Call by Value์— ์˜ํ•ด ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ฐจ์ด

  • ์ถ”์ƒ ๋ฉ”์„œ๋“œ(Abstract Method)
    • abstract ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์›ํ˜•๋งŒ ์„ ์–ธ๋˜๊ณ , ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ
public abstract String getName(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
public abstract String fail() { return "Fail"; } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ ์•„๋‹˜. ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class)
    • ๊ฐœ๋…: abstract ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค
      1. ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ ๊ฐ€์ง€๊ณ  abstract๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค
        • ์ตœ์†Œ ํ•œ ๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
      2. ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์–ด๋„ abstract๋กœ ์„ ์–ธํ•œ ํด๋ž˜์Šค
        • ๊ทธ๋Ÿฌ๋‚˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„
      • ์„œ๋ธŒ ํด๋ž˜์Šค์—์„œ ์Šˆํผ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๋ชฉ์ 
      • ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•จ์ด ์•„๋‹ˆ๋ฉฐ, ์ƒ์†์„ ์œ„ํ•œ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
      • ์—ฌ๋Ÿฌ ํด๋ž˜์Šค๋“ค์˜ ๊ณตํ†ต๋œ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”(์ถ”์ƒ ๋ฉ”์„œ๋“œ) ํ•˜์—ฌ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์—๊ฒŒ ๊ตฌํ˜„์„ ๊ฐ•์ œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. (๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋Š” ์ž์‹ ํด๋ž˜์Šค๋กœ ์ฑ…์ž„์„ ์œ„์ž„)
      • ์ฆ‰, ์ถ”์ƒ ํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์ฒดํ™”ํ•˜์—ฌ ๊ทธ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ๋‹ค.
/* ๊ฐœ๋… a์˜ ์˜ˆ์‹œ */
abstract class Shape { // ์ถ”์ƒ ํด๋ž˜์Šค
  Shape() {...}
  void edit() {...}
  abstract public void draw(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
}
/* ๊ฐœ๋… b์˜ ์˜ˆ์‹œ */
abstract class Shape { // ์ถ”์ƒ ํด๋ž˜์Šค
  Shape() {...}
  void edit() {...}
}
/* ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๊ตฌํ˜„ */
class Circle extends Shape {
  public void draw() { System.out.println("Circle"); } // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (์˜ค๋ฒ„๋ผ์ด๋”ฉ)
  void show() { System.out.println("๋™๊ทธ๋ผ๋ฏธ ๋ชจ์–‘"); }
}
  • ์ธํ„ฐํŽ˜์ด์Šค(Interface)
    • ๊ฐœ๋…: ์ถ”์ƒ ๋ฉ”์„œ๋“œ์™€ ์ƒ์ˆ˜๋งŒ์„ ํฌํ•จํ•˜๋ฉฐ, interface ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„
      • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ , ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
      • implements ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชฉ์ 
      • ์ƒ์†๋ฐ›์„ ์„œ๋ธŒ ํด๋ž˜์Šค์—๊ฒŒ ๊ตฌํ˜„ํ•  ๋ฉ”์„œ๋“œ๋“ค์˜ ์›ํ˜•์„ ๋ชจ๋‘ ์•Œ๋ ค์ฃผ์–ด, ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์˜ ๋ชฉ์ ์— ๋งž๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ๊ตฌํ˜„ ๊ฐ์ฒด์˜ ๊ฐ™์€ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด ์žˆ๋‹ค.
      • ์ฆ‰, ์„œ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ธํ„ฐํŽ˜์ด์Šค์˜ ํŠน์ง•
      1. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ์ˆ˜ ํ•„๋“œ์™€ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
      2. ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ์„œ, abstract public ์†์„ฑ์ด๋ฉฐ ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค.
      3. ์ƒ์ˆ˜๋Š” public static final ์†์„ฑ์ด๋ฉฐ, ์ƒ๋žตํ•˜์—ฌ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      4. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
        • interface MobilePhone extends Phone { }
/* ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ๋… */
interface Phone { // ์ธํ„ฐํŽ˜์ด์Šค
  int BUTTONS = 20; // ์ƒ์ˆ˜ ํ•„๋“œ (public static final int BUTTONS = 20;๊ณผ ๋™์ผ)
  void sendCall(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ (abstract public void sendCall();๊ณผ ๋™์ผ)
  abstract public void receiveCall(); // ์ถ”์ƒ ๋ฉ”์„œ๋“œ
}
/* ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„ */
class FeaturePhone implements Phone {
  // Phone์˜ ๋ชจ๋“  ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  public void sendCall() {...}
  public void receiveCall() {...}

  // ์ถ”๊ฐ€์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  public int getButtons() {...}
}
  • ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต์ 
    • ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋Š” ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.
    • ์„ ์–ธ๋งŒ ์žˆ๊ณ  ๊ตฌํ˜„ ๋‚ด์šฉ์ด ์—†๋‹ค.
    • ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ฉ”์„œ๋“œ์˜ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์ฑ…์ž„์„ ์œ„์ž„ํ•œ๋‹ค.
  • ์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ฐจ์ด์ 
    • ์„œ๋กœ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
      • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ตฌ์ฒดํ™”ํ•˜์—ฌ ๊ทธ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ๋‹ค. (์ƒ์†์„ ์œ„ํ•œ ๋ถ€๋ชจ ํด๋ž˜์Šค)
      • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์„œ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์„ ๊ฐ๊ฐ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. (๊ตฌํ˜„ ๊ฐ์ฒด์˜ ๊ฐ™์€ ๋™์ž‘์„ ๋ณด์žฅ)
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค์ด์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค.
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋‹จ์ผ ์ƒ์†์ด์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์ค‘ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” โ€œis a kind ofโ€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” โ€œcan do thisโ€
      • Ex) ์ถ”์ƒ ํด๋ž˜์Šค: Appliances(Abstract Class) - TV, Refrigerator
      • Ex) ์ธํ„ฐํŽ˜์ด์Šค: Flyable(Interface) - Plane, Bird

โซTop โ†ฉ๏ธBack โ„น๏ธHome

JVM ๊ตฌ์กฐ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Java Collections Framework

  • Map
    • ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค
    • ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ Key์™€ Value์˜ ํ˜•ํƒœ๋กœ ์‚ฝ์ž…๋˜๋ฉฐ, Key๋ฅผ ์ด์šฉํ•ด์„œ Value๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • Collection
    • List
      • ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” Collection
      • ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณตํ•ด์„œ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Set
      • ์ง‘ํ•ฉ์ ์ธ ๊ฐœ๋…์˜ Collection
      • ์ˆœ์„œ์˜ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
      • ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณตํ•ด์„œ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค.
  • Collections Framework ์„ ํƒ ๊ณผ์ •
    1. Map๊ณผ Collection ์ธํ„ฐํŽ˜์ด์Šค ์ค‘ ์„ ํƒ 1-1. Collection ์„ ํƒ ์‹œ ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ List์™€ Set์ค‘ ์„ ํƒ
    2. ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ Map, List, Set ๊ฐ๊ฐ์˜ ํ•˜์œ„ ๊ตฌํ˜„์ฒด๋ฅผ ์„ ํƒ 2-1. Map: HashMap, LinkedHashMap, HashTable, TreeMap 2-2. List: LinkedList, ArrayList 2-3. Set: TreeSet, HashSet
  • Collections Framework ๋™๊ธฐํ™”

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java Map ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด์˜ ์ข…๋ฅ˜

  • HashMap
    • Entry<K,V>์˜ ๋ฐฐ์—ด๋กœ ์ €์žฅ๋˜๋ฉฐ, ๋ฐฐ์—ด์˜ index๋Š” ๋‚ด๋ถ€ ํ•ด์‰ฌ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐ๋œ๋‹ค.
    • ๋‚ด๋ถ€ hash๊ฐ’์— ๋”ฐ๋ผ์„œ ํ‚ค์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ง€๋ฏ€๋กœ ํŠน์ • ๊ทœ์น™์—†์ด ์ถœ๋ ฅ๋œ๋‹ค.
    • key์™€ value์— null๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.
    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • ์‹œ๊ฐ„๋ณต์žก๋„: O(1)
  • LinkedHashMap
    • HashMap์„ ์ƒ์†๋ฐ›์œผ๋ฉฐ, Linked List๋กœ ์ €์žฅ๋œ๋‹ค.
    • ์ž…๋ ฅ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • ์‹œ๊ฐ„๋ณต์žก๋„: O(n)
  • TreeMap
    • ๋‚ด๋ถ€์ ์œผ๋กœ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(Red-Black tree)๋กœ ์ €์žฅ๋œ๋‹ค.
    • ํ‚ค๊ฐ’์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋˜์–ด ์ถœ๋ ฅ๋œ๋‹ค.
    • ํ‚ค๊ฐ’์— ๋Œ€ํ•œ Compartor ๊ตฌํ˜„์œผ๋กœ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‹œ๊ฐ„๋ณต์žก๋„: O(logn)
  • ConCurrentHashMap
    • multiple lock
    • updateํ•  ๋•Œ๋งŒ ๋™๊ธฐ ์ฒ˜๋ฆฌ
    • key์™€ value์— null๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • HashTable
    • single lock
    • ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•ด ๋™๊ธฐ ์ฒ˜๋ฆฌ
    • key์™€ value์— null๊ฐ’์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java Set ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด์˜ ์ข…๋ฅ˜

  • HashSet
    • ์ €์žฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์ด๋‹ค.
    • ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(hash algorithm)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
    • ๋‚ด๋ถ€์ ์œผ๋กœ HashMap ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • LinkedHashSet
    • ์ €์žฅ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” HashSet
  • TreeSet
    • ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋˜๋Š” ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ(binary search tree)์˜ ํ˜•ํƒœ๋กœ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค.
    • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์ค‘์— ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ ๋ ˆ๋“œ-๋ธ”๋ž™ ํŠธ๋ฆฌ(Red-Black tree)๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
    • Compartor ๊ตฌํ˜„์œผ๋กœ ์ •๋ ฌ ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java List ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด์˜ ์ข…๋ฅ˜

  • ArrayList
    • ๋‹จ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ ๊ตฌ์กฐ๋กœ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์— ์ ํ•ฉํ•˜๋‹ค.
    • ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ดํ›„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋˜๋ฏ€๋กœ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๋ฐ์ดํ„ฐ์—๋Š” ๋ถ€์ ํ•ฉํ•˜๋‹ค.
  • LinkedList
    • ์–‘๋ฐฉํ–ฅ ํฌ์ธํ„ฐ ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ ์‹œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ฃผ์†Œ์ง€๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๋ฏ€๋กœ ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉํ•˜๋‹ค.
    • ๋ฐ์ดํ„ฐ์˜ ๊ฒ€์ƒ‰ ์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฏ€๋กœ ๊ฒ€์ƒ‰์—๋Š” ๋ถ€์ ํ•ฉํ•˜๋‹ค.
    • ์Šคํƒ, ํ, ์–‘๋ฐฉํ–ฅ ํ ๋“ฑ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์“ฐ์ธ๋‹ค.
  • Vector
    • ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค.
    • ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๊ณ  ๋ฌด๊ฑฐ์›Œ ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Annotation

โซTop โ†ฉ๏ธBack โ„น๏ธHome

String StringBuilder StringBuffer

  • String
    • ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
    • String์—์„œ ์ €์žฅ๋˜๋Š” ๋ฌธ์ž์—ด์€ private final char[]์˜ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— String ๊ฐ’์€ ๋ฐ”๊ฟ€์ˆ˜ ์—†๋‹ค.
      • private: ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
      • final: ์ดˆ๊ธฐ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
    • String + String + String...
      • ๊ฐ๊ฐ์˜ String ์ฃผ์†Ÿ๊ฐ’์ด Stack์— ์Œ“์ด๊ณ , Garbage Collector๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋“ค์€ Heap์— ์Œ“์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์น˜๋ช…์ ์ด๋‹ค.
    • String์„ ์ง์ ‘ ๋”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” StringBuffer๋‚˜ StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • StringBuilder, StringBuffer
    • memory์— appendํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • StringBuilder
      • ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด
      • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • StringBuffer
      • ๋ณ€๊ฒฝ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด
      • ๋™๊ธฐ ์ฒ˜๋ฆฌ
      • multiple thread ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ํด๋ž˜์Šค(thread safe)
  • Java ๋ฒ„์ „๋ณ„ String Class ๋ณ€๊ฒฝ ์‚ฌํ•ญ
    • JDK 1.5 ๋ฒ„์ „ ์ด์ „์—์„œ๋Š” ๋ฌธ์ž์—ด ์—ฐ์‚ฐ(+, concat)์„ ํ•  ๋•Œ ์กฐํ•ฉ๋œ ๋ฌธ์ž์—ด์„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜์—ฌ ์ฐธ์กฐํ•ด ์„ฑ๋Šฅ์ƒ์˜ ์ด์Šˆ ์กด์žฌ
    • JDK 1.5 ๋ฒ„์ „ ์ดํ›„์—๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ String ๊ฐ์ฒด๋ฅผ StringBuilder๋กœ ์ปดํŒŒ์ผ ๋˜๋„๋ก ๋ณ€๊ฒฝ๋จ
    • ๊ทธ๋ž˜์„œ JDK 1.5 ์ดํ›„ ๋ฒ„์ „์—์„œ๋Š” String ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ StringBuilder์™€ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์—†์–ด์ง
    • ํ•˜์ง€๋งŒ ๋ฐ˜๋ณต ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด์„ ๋”ํ•  ๋•Œ์—๋Š” ๊ฐ์ฒด๋ฅผ ๊ณ„์† ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•จ
    • String ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉด StringBuffer, ์Šค๋ ˆ๋“œ ์•ˆ์ „ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์ด ์—†์œผ๋ฉด StringBuilder๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

๋™๊ธฐํ™”์™€ ๋น„๋™๊ธฐํ™”์˜ ์ฐจ์ด

  • ๋™๊ธฐํ™”(Syncronous)

    • ํ•œ ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ ์ œํ•œ
    • ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰
    • ๋‹ค์Œ์— ์‹คํ–‰๋  ๋ช…๋ น์€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ ๋Œ€๊ธฐ (๋Œ€๊ธฐ์‹œ๊ฐ„ ๋ฒ„ํผ๋ง ๋ฐœ์ƒ)
    • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๋Š” ํ˜•ํƒœ
    • ์‹œ๊ฐ„์ ์ธ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์— ๋งŽ์ด ์‚ฌ์šฉ
    • ex. ํ˜„๊ธˆ์ธ์ถœ๊ธฐ
    • Java์—์„œ synchronized ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
      • ์ž๋ฐ”์—์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ ‘๊ทผ ์ œํ•œ ํ‚ค์›Œ๋“œ
      • ๋ฉ”์†Œ๋“œ ๋‹จ์œ„, ๋ธ”๋ก ๋‹จ์œ„ ์ ์šฉ ๊ฐ€๋Šฅ
      • ๋‹จ, ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ์ „์ฒด์— lock์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋ฉด ๋ธ”๋ก ํ™œ์šฉ (์ž„๊ณ„ ์˜์—ญ์€ ์ž‘์„ ์ˆ˜๋ก ์ข‹์Œ)
  • ๋น„๋™๊ธฐํ™”(Asyncronous)

    • ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ ๋ช…๋ น ์‹คํ–‰ ๊ฐ€๋Šฅ
    • Callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ ํ™•์ธ
    • ex. Ajax, Thread
  • ์ ์šฉ ์˜ˆ์‹œ

    • synchronized ํ‚ค์›Œ๋“œ ์ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
      class User {
        private int userNo = 0;
      
        // ์ž„๊ณ„ ์˜์—ญ์ด ๋˜์–ด์•ผํ•˜๋Š” ๋ฉ”์†Œ๋“œ
        public void add(String name) {
          System.out.println(name + " : " + userNo++);
        }
      }
      
      class UserThread extends Thread {
        User user;
      
        UserThread(User user, String name) {
          super(name);
          this.user = user;
        }
      
        public void run() {
          try {
            for (int i = 0; i < 3; i++) {
              user.add(getName());
              sleep(500);
            }
          } catch(InterruptedException e) {
            System.err.println(e.getMessage());
          }
        }
      }
      
      public class SyncThread {
        public static void name(String[] args) {
          User user = new User();
      
          // 3๊ฐœ์˜ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด ์ƒ์„ฑ
          UserThread p1 = new UserThread(user, "A");
          UserThread p2 = new UserThread(user, "B");
          UserThread p3 = new UserThread(user, "C");
      
          // ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง : ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ
          p1.setPriority(p1.MAX_PRIORITY);
          p2.setPriority(p2.NORM_PRIORITY);
          p3.setPriority(p3.MIN_PRIORITY);
      
          p1.start();
          p2.start();
          p3.start();
        }
      }
      // ๊ฒฐ๊ณผ => ์ˆœ์„œ ๋’ค์ฃฝ๋ฐ•์ฃฝ
      A : 0๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 1๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 2๋ฒˆ์งธ ์‚ฌ์šฉ
      A : 3๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 5๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 4๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 7๋ฒˆ์งธ ์‚ฌ์šฉ
      A : 6๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 8๋ฒˆ์งธ ์‚ฌ์šฉ
    • ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ User ํด๋ž˜์Šค์˜ add ๋ฉ”์†Œ๋“œ์— synchronized ํ‚ค์›Œ๋“œ ์ ์šฉํ•œ ๊ฒฝ์šฐ
      class User {
        private int userNo = 0;
      
        public synchronized void add(String name) {
          System.out.println(name + " : " + userNo++);
        }
      }
      // ๊ฒฐ๊ณผ
      A : 0๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 1๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 2๋ฒˆ์งธ ์‚ฌ์šฉ
      A : 3๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 5๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 4๋ฒˆ์งธ ์‚ฌ์šฉ
      A : 7๋ฒˆ์งธ ์‚ฌ์šฉ
      B : 6๋ฒˆ์งธ ์‚ฌ์šฉ
      C : 8๋ฒˆ์งธ ์‚ฌ์šฉ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์—์„œ ==์™€ equals()์˜ ์ฐจ์ด

  • "=="
    • ํ•ญ๋“ฑ ์—ฐ์‚ฐ์ž(Operator) ์ด๋‹ค.
      • <--> !=
    • ์ฐธ์กฐ ๋น„๊ต(Reference Comparison) ; (์ฃผ์†Œ ๋น„๊ต, Address Comparison)
      • ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋ฐ˜ํ™˜ ํ˜•ํƒœ: boolean type
      • ๊ฐ™์€ ์ฃผ์†Œ๋ฉด return true, ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฉด return false
    • ๋ชจ๋“  ๊ธฐ๋ณธ ์œ ํ˜•(Primitive Types)์— ๋Œ€ํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
      • byte, short, char, int, float, double, boolean
  • "equals()"
    • ๊ฐ์ฒด ๋น„๊ต ๋ฉ”์„œ๋“œ(Method) ์ด๋‹ค.
    • <--> !(s1.equals(s2));
    • ๋‚ด์šฉ ๋น„๊ต(Content Comparison)
      • ๋‘ ๊ฐ์ฒด์˜ ๊ฐ’์ด ๊ฐ™์€์ง€ ํ™•์ธํ•œ๋‹ค.
      • ์ฆ‰, ๋ฌธ์ž์—ด์˜ ๋ฐ์ดํ„ฐ/๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น„๊ตํ•œ๋‹ค.
    • ๊ธฐ๋ณธ ์œ ํ˜•(Primitive Types)์— ๋Œ€ํ•ด์„œ๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • ๋ฐ˜ํ™˜ ํ˜•ํƒœ: boolean type
      • ๊ฐ™์€ ๋‚ด์šฉ์ด๋ฉด return true, ๋‹ค๋ฅธ ๋‚ด์šฉ์ด๋ฉด return false
  • "==" VS "equals()" ์˜ˆ์‹œ

public class Test {
    public static void main(String[] args) {
        // Thread ๊ฐ์ฒด
        Thread t1 = new Thread();
        Thread t2 = new Thread(); // ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ. ์ฆ‰, s1๊ณผ ๋‹ค๋ฅธ ๊ฐ์ฒด.
        Thread t3 = t1; // ๊ฐ™์€ ๋Œ€์ƒ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
        // String ๊ฐ์ฒด
        String s1 = new String("WORLD");
        String s2 = new String("WORLD");
        /* --print-- */
        System.out.println(t1 == t3); // true
        System.out.println(t1 == t2); // false(์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.)
        System.out.println(t1.equals(t2)); // false
        System.out.println(s1.equals(s2)); // true(๋ชจ๋‘ "WORLD"๋ผ๋Š” ๋™์ผํ•œ ๋‚ด์šฉ์„ ๊ฐ–๋Š”๋‹ค.)
    }
}

โซTop โ†ฉ๏ธBack โ„น๏ธHome

java์˜ ๋ฆฌํ”Œ๋ ‰์…˜ ์ด๋ž€

  • ๋ฆฌํ”Œ๋ ‰์…˜(Reflection) ์ด๋ž€?
    • ์ž๋ฐ”์—์„œ ์ด๋ฏธ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋œ ํด๋ž˜์Šค์—์„œ ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋”ฉ(Dynamic Loading)ํ•˜์—ฌ ์ƒ์„ฑ์ž(Constructor), ๋ฉค๋ฒ„ ํ•„๋“œ(Member Variables) ๊ทธ๋ฆฌ๊ณ  ๋ฉค๋ฒ„ ๋ฉ”์„œ๋“œ(Member Method) ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
    • ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€ ์ •๋ณด, ์ ‘๊ทผ ์ง€์ •์ž, ์ˆ˜ํผ ํด๋ž˜์Šค, ์–ด๋…ธํ…Œ์ด์…˜(Annotation) ๋“ฑ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์ปดํŒŒ์ผ ์‹œ๊ฐ„(Compile Time)์ด ์•„๋‹ˆ๋ผ ์‹คํ–‰ ์‹œ๊ฐ„(Run Time)์— ๋™์ ์œผ๋กœ ํŠน์ • ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๊ฐ์ฒดํ™”๋ฅผ ํ†ตํ•ด ๋ถ„์„ ๋ฐ ์ถ”์ถœํ•ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
    • Class.forName("ํด๋ž˜์Šค์ด๋ฆ„")
    • ํด๋ž˜์Šค์˜ ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    public class DoHee {
        public String name;
        public int number;
        public void setDoHee (String name, int number) {
          this.name = name;
          this.number = number;
        }
        public void setNumber(int number) {
            this.number = number;
        }
        public void sayHello(String name) {
          System.out.println("Hello, " + name);
      }
    }
    import java.lang.reflect.Method;
    import java.lang.reflect.Field;
    
    public class ReflectionTest {
        public void reflectionTest() {
            try {
                Class myClass = Class.forName("DoHee");
                Method[] methods = myClass.getDeclaredMethods();
    
                /* ํด๋ž˜์Šค ๋‚ด ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ์˜ ๋ชฉ๋ก ์ถœ๋ ฅ */
                /* ์ถœ๋ ฅ : public void DoHee.setDoHee(java.lang.String,int)
                         public void DoHee.setNumber(int)
                         public void DoHee.sayHello(java.lang.String) */
                for (Method method : methods) {
                    System.out.println(method.toString());
                }
    
                /* ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ˜ํ™˜ ํƒ€์ž… ํ™•์ธ */
                /* ์ถœ๋ ฅ : Class Name : class DoHee
                         Method Name : setDoHee
                         Return Type : void */
                Method method = methods[0];
                System.out.println("Class Name : " + method.getDeclaringClass());
                System.out.println("Method Name : " + method.getName());
                System.out.println("Return Type : " + method.getReturnType());
    
                /* ์ถœ๋ ฅ : Param Type : class java.lang.String
                         Param Type : int */
                Class[] paramTypes = method.getParameterTypes();
                for(Class paramType : paramTypes) {
                    System.out.println("Param Type : " + paramType);
                }
    
                /* ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœ */
                Method sayHelloMethod = myClass.getMethod("sayHello", String.class);
                sayHelloMethod.invoke(myClass.newInstance(), new String("DoHee")); // ์ถœ๋ ฅ : Hello, DoHee
    
                /* ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•„๋“œ์˜ ๊ฐ’ ์ˆ˜์ • */
                Field field = myClass.getField("number");
                DoHee obj = (DoHee) myClass.newInstance();
                obj.setNumber(5);
                System.out.println("Before Number : " + field.get(obj)); // ์ถœ๋ ฅ : Before Number : 5
                field.set(obj, 10);
                System.out.println("After Number : " + field.get(obj)); // ์ถœ๋ ฅ : After Number : 10
            } catch (Exception e) {
                // Exception Handling
            }
        }
    
        public static void main(String[] args) {
            new ReflectionTest().reflectionTest();
        }
    }
  • ์™œ ์‚ฌ์šฉํ• ๊นŒ?
    • ์‹คํ–‰ ์‹œ๊ฐ„์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋”ฉํ•˜์—ฌ ์ ‘๊ทผํ•  ๋•Œ
    • ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„ ํ•„๋“œ ๊ทธ๋ฆฌ๊ณ  ๋ฉ”์„œ๋“œ ๋“ฑ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด์•ผํ•  ๋•Œ
    • ๋ฆฌํ”Œ๋ ‰์…˜ ์—†์ด๋„ ์™„์„ฑ๋„ ๋†’์€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์กฐ๊ธˆ ๋” ์œ ์—ฐํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ์˜ํ•  ์ 
    • ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜์ง€ ์•Š๋Š” private ๋ฉค๋ฒ„๋„ Field.setAccessible() ๋ฉ”์„œ๋“œ๋ฅผ true๋กœ ์ง€์ •ํ•˜๋ฉด ์ ‘๊ทผ๊ณผ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Stream์ด๋ž€

  • Stream์ด๋ž€?

    • java8์—์„œ ์ถ”๊ฐ€๋œ API
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์†Œ๋“œ ์ •์˜
    • ์ปฌ๋ ‰์…˜ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ Stream ๋ฉ”์†Œ๋“œ์—์„œ ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ํ†ตํ•ด ์ •๋ ฌ, ํ•„ํ„ฐ๋ง ๋“ฑ ๊ฐ€๋Šฅ
  • ํŠน์ง•

    • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌ
      • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด common fork join pool์„ ์‚ฌ์šฉํ•˜๋Š” parallel() ๋ฉ”์†Œ๋“œ ์ œ๊ณต
      • common fork join pool
        • ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐœ๋ณ„ ํ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋†€๊ณ  ์žˆ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ผํ•˜๋Š” ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์„ ๊ฐ€์ ธ์™€ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ตœ์ ์˜ ์„ฑ๋Šฅ ๋„์ถœ
      • ์ฝ”์–ด์˜ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก, ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก, ๋ฐ์ดํ„ฐ๋‹น ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธธ์ˆ˜๋ก ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ
      • ๋ฐฐ์—ด, ArrayList ์‚ฌ์šฉ ์‹œ ์œ ๋ฆฌ(LinkedList๋Š” ์ˆœ์ฐจ ์ง„ํ–‰์ด ๋” ๋‚˜์„ ์ˆ˜ ์žˆ์Œ)
    • Immutable
      • ์›๋ณธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
      • ์• ์ดˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ณ€๊ฒฝ๋˜๋Š” ๋‚ด์šฉ์€ Stream์„ ์ง€์›ํ•˜๋Š” ์ปฌ๋ ‰์…˜์˜ ๋ฐ์ดํ„ฐ
    • lazy
      • ์ŠคํŠธ๋ฆผ์—๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์ด ์žˆ๋Š”๋ฐ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑ ์‹œ ๋ชจ๋‘ ํ•ฉ์ณ์„œ ์ง„ํ–‰ํ•˜๊ณ , ํ•ฉ์ณ์ง„ ์—ฐ์‚ฐ์„ ์ตœ์ข… ์—ฐ์‚ฐ์—์„œ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
      • ๋งˆ์ง€๋ง‰ ์ตœ์ข… ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ ๊ฐ’ ๊ณ„์‚ฐ
        • ์ค‘๊ฐ„ ์—ฐ์‚ฐ : filter, map, flatMap, ...
        • ์ตœ์ข… ์—ฐ์‚ฐ : allMatch, findFirst, collect, count, ...
        • ์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋œ ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ด๋‹ ๊ฐ€๋Šฅ
    • ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
      • ์ตœ์ข… ์—ฐ์‚ฐ ์™„๋ฃŒ ํ›„ Stream์ด ๋‹ซํžˆ๋ฏ€๋กœ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
      • ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์šฉ๋„์ด์ง€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ชฉ์ ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ
  • ์žฅ์ 

    • ๋‚ด๋ถ€ ๋ฐ˜๋ณต์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋”ฉ ๊ณผ์ •์„ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ , ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

โซTop โ†ฉ๏ธBack โ„น๏ธHome

Lambda๋ž€

Lambda ๊ฐœ๋…

  • Java 8์—์„œ ๋“ฑ์žฅ
  • ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ์‹์œผ๋กœ ํ‘œํ˜„
  • ๋งค๊ฐœ๋ณ€์ˆ˜, ->(ํ™”์‚ดํ‘œ), {๋ชธํ†ต} ๊ตฌ์กฐ
  • ๋ฉ”์†Œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฉ”์†Œ๋“œ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ
  • ๋žŒ๋‹ค๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค
    • ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ํ•œ ๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋งŒ ์ •์˜
    • ์™ธ๋ถ€์—์„œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋žŒ๋‹ค์‹์ด๋‚˜ ๋ฉ”์†Œ๋“œ ์ฐธ์กฐ ๊ฐ€๋Šฅ
    • ์ž๋ฐ”์—์„œ ํ•จ์ˆ˜๋ฅผ ์ผ๊ธ‰ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋‹จ์  ๋ณด์™„
    • ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ž„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด @FunctionalInterface ์‚ฌ์šฉ
    • ex. Comparator, Runnuble
  • Lambda์™€ Stream์˜ ๋“ฑ์žฅ ๊ณ„๊ธฐ

Lambda ์žฅ์ 

  • ๊ธฐ์กด์— ์ต๋ช…ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•˜๋˜ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€
  • ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์šฉ์ด

Lambda ๋‹จ์ 

  • ๋‚จ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์–ด๋ ค์›€
  • ๊นŒ๋‹ค๋กœ์šด ์žฌ๊ท€ ํ™œ์šฉ ๋ฐ ๋””๋ฒ„๊น…

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Lambda ํ‘œํ˜„์‹์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

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

โซTop โ†ฉ๏ธBack โ„น๏ธHome


Reference

๐Ÿ  Home