Skip to content

Latest commit

ย 

History

History
416 lines (300 loc) ยท 21.2 KB

File metadata and controls

416 lines (300 loc) ยท 21.2 KB

Java

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

  • OOP, Object Oriented Programming
  • ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ น์–ด์˜ ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋‹จ์œ„, ์ฆ‰ "๊ฐ์ฒด" ๋“ค์˜ ๋ชจ์ž„ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ๊ฐ์˜ ๊ฐ์ฒด ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.(ํ˜‘๋ ฅ)
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐ ํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. (์œ ์ง€๋ณด์ˆ˜, ์žฌ์‚ฌ์šฉ์„ฑ)
  • ์—ญํ• , ํ˜‘๋ ฅ, ์ฑ…์ž„

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

  • ์บก์Аํ™”(Encapsulation)

    • ์ •๋ณด ์€๋‹‰(information hiding)
    • ๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š”๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ
    • ์ ‘๊ทผ์ œ์–ด์ž(public, protected, default, private)
  • ์ถ”์ƒํ™”(Abstraction)

    • ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํด๋ž˜์Šค๋“ค์˜ ๊ณตํ†ต์ ์ธ ํŠน์„ฑ(๋ณ€์ˆ˜,๋ฉ”์†Œ๋“œ)๋“ค์„ ๋ฌถ์–ด ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ
  • ์ƒ์†(Inheritance)

    • ์ƒ์œ„ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์ƒ์†ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ํ•„์š”ํ•œ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.(ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉ)
    • ์ƒ์†์€ ์บก์Аํ™” ์œ ์ง€, ํด๋ž˜์Šค์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.
  • ๋‹คํ˜•์„ฑ(Polymorphism)

    • ์–ด๋–ค ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ๊ฐ€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” ๊ฒƒ

    • ์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) : ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๊ฐ™์€ ์ธ์ž ๋ชฉ๋ก ์œผ๋กœ ์ƒ์œ„ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜

    • ์˜ค๋ฒ„๋กœ๋”ฉ(Overloding) : ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ด๋ฆ„, ๋‹ค๋ฅธ ์ธ์ž ๋ชฉ๋ก ์œผ๋กœ ๋‹ค์ˆ˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ค‘๋ณต ์ •์˜ (์ƒ์„ฑ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ ์œ ์šฉํ•จ)

    cf. ํ—ท๊ฐˆ๋ฆฌ๋ฉด ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ง๋Œ€์–ด ์“ฐ๋‹ค(=> ์žฌ์ •์˜)/ ์˜ค๋ฒ„๋กœ๋”ฉ์€ load(์ ์žฌํ•˜๋‹ค)=>์ค‘๋ณต ์ •์˜


๊ฐ์ฒด์ง€ํ–ฅ 5๋Œ€ ์›์น™(OOP SOLID)

SRP(๋‹จ์ผ์ฑ…์ž„์›์น™, Single Responsibility principle)

  • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด๋ผ๋Š” ๊ฒƒ์€ ํด ์ˆ˜ ์žˆ๊ณ , ์ž‘์„ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋ฌธ๋งฅ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.
  • ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด SRP๋ฅผ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ.

OCP(๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™, Open/Closed principle)

  • ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ์—๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

    • ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ๋‹ค : ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ƒˆ๋กœ์šด ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ๋‹ค : ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • OCP๋ฅผ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.(๋‹คํ˜•์„ฑ)

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค. (์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ)

  • ๊ฐ์ฒด๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” ์ง€์‹์ด ๋งŽ์œผ๋ฉด ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง€๊ณ , ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์งˆ์ˆ˜๋ก ๊ฐœ๋ฐฉ-ํ์‡„์˜ ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค.

public class MemberService {
//  private MemberRepository memberRepository = new MemoryMemberRepository(); // ๊ธฐ์กด์ฝ”๋“œ
  private MemberRepository memberRepository = new JdbcMemberRepository(); // ๋ณ€๊ฒฝ์ฝ”๋“œ
}

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

LSP(๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™, Liskov substitution principle)

  • ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ, ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์›์น™, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋Š” ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์ด ์›์น™์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ์— ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ๋Š” ์ด์•ผ๊ธฐ
  • eg. ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—‘์…€์€ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ, ๋’ค๋กœ ๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด LSP ์œ„๋ฐ˜, ๋А๋ฆฌ๋”๋ผ๋„ ์•ž์œผ๋กœ ๊ฐ€์•ผํ•จ.

ISP(์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™, Interface segregation principle)

  • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.
  • ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค, ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ
  • ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ๋Š” ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ, ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„๋ฆฌ
  • ๋ถ„๋ฆฌํ•˜๋ฉด ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€ํ•ด๋„ ์šด์ „ ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.
  • ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

DIP(์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™, Dependency inversion principle)

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” "์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค." ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
  • ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป
  • ์—ญํ• (Role)์— ์˜์กดํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ฐ์ฒด ์„ธ์ƒ๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ์•„์ฃผ ์–ด๋ ค์›Œ์ง„๋‹ค.
MemberRepository m = new MemoryMemberRepository();
  • ์•ž์˜ ์˜ˆ์ œ๋Š” MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์„ ํƒํ•œ๋‹ค.
  • MemberRepository ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ, MemoryMemberRepository ๊ตฌํ˜„ ํด๋ž˜์Šค๋„ ๋™์‹œ์— ์˜์กดํ•œ๋‹ค.
  • DIP ์œ„๋ฐ˜

[ref] inflearn ๊น€์˜ํ•œ๋‹˜์˜ ์Šคํ”„๋ง ๊ฐ•์˜ ์ž๋ฃŒ


String, StringBuilder, StringBuffer ์ฐจ์ด์ 

  • Java์—์„œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ๋Œ€ํ‘œ์ ์ธ ํด๋ž˜์Šค๋“ค
  • ๏ธ ์—ฐ์‚ฐ์ด ๋งŽ์ง€ ์•Š์„ ๋•Œ๋Š” ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์—ฐ์‚ฐํšŸ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ฑฐ๋‚˜, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, Race condition ๋“ฑ์˜ ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ๊ฐ ํด๋ž˜์Šค์˜ ํŠน์ง•์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

String

  • immutation(๋ถˆ๋ณ€)

    String str = "hello"; String str = new String("hello");
    str = str + "world"; // [hello world]
    • String ํด๋ž˜์Šค์˜ ์ฐธ์กฐ๋ณ€์ˆ˜์ธ str์€ ๊ธฐ์กด์— "hello"๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋‹ค๊ฐ€, "hello world"๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ณ€๊ฒฝ๋œ๋‹ค.
    • ์ฒ˜์Œ ์„ ์–ธํ–ˆ๋˜ "hello"๋กœ ๊ฐ’์ด ํ• ๋‹น๋˜์–ด ์žˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ GC(garbage collection)์— ์˜ํ•ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.
    • String ํด๋ž˜์Šค๊ฐ€ ๋ถˆ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์ˆ˜์ •ํ•˜๋Š” ์‹œ์ ์— ์ƒˆ๋กœ์šด String ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ.

  • String ๋ฌธ์ž์—ด์„ ์—ฐ์‚ฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜ ๋ฐ˜๋ณต ์ƒ์„ฑ์œผ๋กœ ํผํฌ๋จผ์Šค๊ฐ€ ๋‚ฎ์•„์ง.

  • ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด์„ ์ž์ฃผ ์ฝ์–ด๋“ค์ด๋Š” ๊ฒฝ์šฐ String์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์„ฑ๋Šฅ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.



โœ”๏ธ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Java์—์„œ ๊ฐ€๋ณ€์„ฑ(mutable)์„ฑ์„ ๊ฐ€์ง€๋Š” StringBuffer/StringBuilder ํด๋ž˜์Šค๋ฅผ ๋„์ž…!

StringBuilder/StringBuffer ๊ณตํ†ต์ 

  • mutation(๊ฐ€๋ณ€)
  • .append(), .delete() ๋“ฑ์˜ API๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์ผ ๊ฐ์ฒด ๋‚ด์—์„œ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฌธ์ž์—ด์˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ๋ผ๋ฉด String ํด๋ž˜์Šค๋ณด๋‹ค StringBuffer/StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
StringBuffer sb = new StringBuffer("hello"); // hello
sb.append("world"); // hello world (๋™์ผํ•œ ๊ฐ์ฒด ์ˆ˜์ •)



๏ธStringBuffer vs String Builder

  • ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋™๊ธฐํ™”์˜ ์œ ๋ฌด
  • StringBuffer๋Š” ๋™๊ธฐํ™” ํ‚ค์›Œ๋“œ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋‹ค.(thread-safe)
  • StringBuilder๋Š” ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ ํ•ฉํ•˜์ง€ ์•Š์ง€๋งŒ, ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์—์„œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

cf. String๋„ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋‹ค.(thread-safe)

[ref] tuandevnotes.com


์ ‘๊ทผ์ง€์ •์ž(Access Modifier)

  • public : ๋ชจ๋‘๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • protected : ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค / ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์˜ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • default : ๊ธฐ๋ณธ ์ œํ•œ์ž, ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด์˜ ํด๋ž˜์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • private : ์™ธ๋ถ€ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ / ๊ฐ™์€ ํด๋ž˜์Šค ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ

Java ์ปดํŒŒ์ผ ๊ณผ์ •

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž๋ฐ” ์†Œ์Šค์ฝ”๋“œ(.java)๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  2. ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋ฐ” ์†Œ์Šค ์ฝ”๋“œ(.java) -> ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class) ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. [์ปดํŒŒ์ผ ํƒ€์ž„ ํ™˜๊ฒฝ]
  3. ์ปดํŒŒ์ผ๋œ ์ž๋ฐ” ๋ฐ”์ดํŠธ ์ฝ”๋“œ(.class)๋ฅผ JVM์˜ ํด๋ž˜์Šค๋กœ๋”(Class Loader)์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  4. ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋™์ ๋กœ๋”ฉ(Dynamic Loading)์„ ํ†ตํ•ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ๋กœ๋”ฉ ๋ฐ ๋งํฌํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data area), ์ฆ‰, JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค.
  5. ์‹คํ–‰์—”์ง„(Execution Engine)์€ JVM ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜จ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋“ค์„ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰ํ•œ๋‹ค.
    ์ด ๋•Œ, ์‹คํ–‰ ์—”์ง„์€ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
    • ์ธํ„ฐํ”„๋ฆฌํ„ฐ : ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์‹คํ–‰์€ ๋น ๋ฅด๋‚˜, ์ „์ฒด์ ์ธ ์‹คํ–‰ ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค.
    • JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler) : ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…ํ•œ ๋ฐฉ์‹. ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ๋”์ด์ƒ ์ธํ„ฐํ”„๋ฆฌํŒ… ํ•˜์ง€ ์•Š๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ „์ฒด๊ฐ€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ์‹คํ–‰์†๋„๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๋‹ค.

[ref] https://gyoogle.dev/blog/computer-language/Java/%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.html


JVM ๊ตฌ์กฐ์™€ Java์˜ ๋™์ž‘๋ฐฉ์‹

JVM์˜ ๊ตฌ์กฐ

JVM์€ ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • Class Loader
  • Execution Engine
  • Garbage Collector
  • Runtime Data Area

์ž๋ฐ”์˜ ์‹คํ–‰๋ฐฉ์‹

  • Java ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .java ์†Œ์Šค ํŒŒ์ผ์„ ๋ชจ๋‘ JVM์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” .class ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค. (์ปดํŒŒ์ผ ํƒ€์ž„)
  • JVM์„ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋Ÿฐํƒ€์ž„ ์‹œ์ ์ด ์‹œ์ž‘๋œ๋‹ค.
  • JVM ๋‚ด๋ถ€์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Execution Engine์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ Class Loader์— ์š”์ฒญํ•˜๊ณ , Class Loader๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ .class์—์„œ ๊ฐ€์ ธ์™€ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค.
    (๋กœ์ปฌ ๋””์Šคํฌ์—์„œ .class ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. - URLClassLoader)
  • ๊ฐ€์ ธ์˜ค๋Š” ํด๋ž˜์Šค๋“ค์˜ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋“ค์ด ์ด์ƒ์ด ์—†๋Š”์ง€, ์ž๋ฐ”์˜ ๋ณด์•ˆ ๊ทœ์น™์„ ์œ„๋ฐฐํ•˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค.
    (์ž๋ฐ”๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํ“จํ„ฐ๋ฅผ ํ›ผ์†์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ํ•˜๊ธฐ ์œ„ํ•ด ์—„๊ฒฉํ•œ ๋ณด์•ˆ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.)
  • Execution Engine์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜จ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋œ๋‹ค.
  • ๊ณ„์† ์ด๋Ÿฐ ๋ฐฉ์‹์ด ๋™์ž‘์„ ํ•˜๋ฉด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•œ๋‹ค.

Class Loader

  • ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— Java ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Java ์†Œ์ŠคํŒŒ์ผ์„ .class ํŒŒ์ผ(๋ฐ”์ดํŠธ ์ฝ”๋“œ)๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  • ๊ทธ ์ดํ›„ ์ƒ์„ฑ๋œ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค ์„ ์—ฎ์–ด์„œ JVM์ด ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ Runtime DataArea๋กœ ์ ์žฌํ•˜๋Š” ์—ญํ• ์„ Class Loader๊ฐ€ ํ•œ๋‹ค.
  • ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘ ์ผ ๋•Œ ์ด๋Ÿฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.

Execution Engine

Class Loader์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์˜ .class ํŒŒ์ผ๋“ค์„ ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ•ด ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
์ž๋ฐ”๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์€ ํ•œ์ค„ ํ•œ์ค„ ์ฝ์–ด๋“ค์—ฌ์•ผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ์ปดํŒŒ์ผ ๋ฐฉ์‹์— ๋น„ํ•ด ๋А๋ฆฌ๋‹ค.

-> ๊ทธ๋ž˜์„œ ์ž๋ฐ”๋Š” ์ปดํŒŒ์ผ๊ณผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ

    • ๋ฐ”์ดํŠธ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด์„œ ์‹คํ–‰ํ•œ๋‹ค.
    • ํ•˜๋‚˜ํ•˜๋‚˜์˜ ํ•ด์„์„ ๋น ๋ฅด์ง€๋งŒ ์ „์ฒด์ ์ธ ์‹คํ–‰์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.
    • JVM ์•ˆ์—์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler)

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

JAVA Compiler / JIT Compiler

Garbage Collector

  • GC๋Š” Heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋“ค ์ค‘์— ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋“ค์„ ์ œ๊ฑฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Garbage๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋งํ•œ๋‹ค.
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ์ด๋Ÿฐ ๊ฐ€๋น„์ง€๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œ์ผœ ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ
  • GC์˜ ๋ฐœ์ƒ์€ ์ผ์ •ํ•˜๊ฒŒ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ๊ฐ์ฒด๋ฅผ ์ •๋ฆฌํ• ์ง€๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.
  • C/C++ ๊ฐ™์€ ์–ธ์–ด๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ํ•ด์ œํ•ด์ฃผ์–ด์•ผ ํ•˜์ง€๋งŒ, ์ž๋ฐ”์—์„œ๋Š” GC๊ฐ€ ์žก์•„์ฃผ์–ด ํŽธ๋ฆฌํ•˜๋‹ค.

Runtime Data Area

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์‹œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๋Š” ์˜์—ญ์ด๋‹ค.
ํฌ๊ฒŒ 5๊ฐ€์ง€ ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

  • Heap
  • Method
  • Stack
  • PC register
  • Native Method Stack

Heap

  • ์ธ์Šคํ„ด์Šคํ™”๋œ ๋ชจ๋“  ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€ ๋ฐฐ์—ด์„ ์ €์žฅ์„ ํ•˜๋Š” ๊ณต๊ฐ„
  • ๋ชจ๋“  JVM ์Šค๋ ˆ๋“œ์— ๊ณต์œ ๋˜๋Š” ๊ณต์œ  ์ž์›
  • Heap์— ์ €์žฅ๋œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ํšŒ์ˆ˜ ๊ถŒํ•œ์€ ๋ฌด์กฐ๊ฑด GC์— ์˜ํ•ด์„œ๋งŒ ํšŒ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Method

  • ํด๋ž˜์Šค ์ˆ˜์ค€์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„
  • ๋ชจ๋“  JVM ์Šค๋ ˆ๋“œ์— ๊ณต์œ ๋˜๋Š” ๊ณต์œ  ์ž์›
  • ๋…ผ๋ฆฌ์ ์œผ๋กœ Heap ์˜์—ญ์— ํฌํ•จ๋˜๋Š” ์˜์—ญ

PC register

  • ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ, Program Counter
  • ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„์˜ ์ฃผ์†Œ์™€ ๋ช…๋ น์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์˜์—ญ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • CPU์— ์ง์ ‘ Instruction์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  Stack์—์„œ Operand๋ฅผ ๋ฝ‘์•„๋‚ด ์ด๋ฅผ ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์ทจํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ PC register๋ผ๊ณ  ํ•œ๋‹ค.

Native Method Stack

  • ์ž๋ฐ” ์™ธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.
  • ๋ณดํ†ต C/C++ ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ

[ref] https://err0rcode7.github.io/java/2021/05/16/JVM%EA%B3%BC%EC%9E%90%EB%B0%94%EC%9D%98%EC%8B%A4%ED%96%89.html
[ref] https://d2.naver.com/helloworld/1230


Java8์—์„œ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ

  • Lambda ํ‘œํ˜„์‹
  • Functional ์ธํ„ฐํŽ˜์ด์Šค
  • Steam
  • Optional
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ Default method
  • StringJoiner
  • ๋‚ ์งœ ๊ด€๋ จ ํด๋ž˜์Šค๋“ค ์ถ”๊ฐ€
  • ๋ณ‘๋ ฌ ๋ฐฐ์—ด ์ •๋ ฌ

Lambda Expression

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

Functional ์ธํ„ฐํŽ˜์ด์Šค

  • ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” interface.
  • ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์‹œ @FunctionalInterface ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‚ด์šฉ์ด ์—†๋Š” ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ ์„ ์–ธ ์‹œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

Stream

  • ์ž๋ฐ”์˜ ์ŠคํŠธ๋ฆผ์€ ์—ฐ์†๋œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • Stream()์€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. (index ์ˆœ)

  • ์ŠคํŠธ๋ฆผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ์—ฐ์‚ฐ์ž

    • filter(Predicate predicate) : ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ฑด์œผ๋กœ ๊ฑฐ๋ฅผ ๋•Œ ์‚ฌ์šฉ
    • map(Function<T,R> mapper) : ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
    • forEach(Consumer <? super T> action) : for ๋ฃจํ”„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์„ ๋‚ผ ๋•Œ
    • reduce(BinaryOperator accumulator) : ์ฒ˜์Œ ๋‘ ์š”์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ทธ ๋‹ค์Œ ์š”์†Œ์™€ ์—ฐ์‚ฐํ•œ๋‹ค.

Optional

  • null ์ฒ˜๋ฆฌ๋ฅผ ๋ณด๋‹ค ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

  • Optional ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ

    • Optional.empty() : ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” Optional ๊ฐ์ฒด ์ƒ์„ฑ
    • Optional.ofNullable(data): null์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ
    • Optional.of(data) : ๋ฐ˜๋“œ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ
  • Optional ๊ฐ์ฒด ๊บผ๋‚ด๊ธฐ

    • get() : ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ์—๋Š” null ๋ฆฌํ„ด
    • ofElse() : ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์˜ Default method

  • interface ์•ˆ์— ๊ตฌํ˜„๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋•Œ default ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

  • default method ๋งŒ๋“  ์ด์œ ?

    • 'ํ•˜์œ„ ํ˜ธํ™˜์„ฑ'
    • ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ๋ฐฉ์‹๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด๋ฏธ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ „๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • Lambda ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.
      (lambda ํ‘œํ˜„์‹์€ ๋ฉ”์†Œ๋“œ๊ฐ€ 1๊ฐœ์—ฌ์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ์™ธ์˜ ๋ฉ”์†Œ๋“œ๋Š” default method๋กœ ์ฒ˜๋ฆฌ!)

[ref] https://medium.com/@inhyuck/java-8%EC%97%90-%EC%B6%94%EA%B0%80%EB%90%9C-%EA%B2%83%EB%93%A4-8c66023cbbae

StringJoiner

  • ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ class

    • String / StringBuilder / StringBuffer / Formatter / StringJoiner
  • StringJoiner๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ๋‚˜์—ด๋˜๋Š” ๋ฌธ์ž์—ด ์‚ฌ์ด์— ํŠน์ • ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์ค˜์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. (prefix(์ ‘๋‘์‚ฌ), suffix(์ ‘๋ฏธ์‚ฌ) ์„ค์ •๋„ ๊ฐ€๋Šฅ)

  • StringJoiner ์—์„œ Delimiter(๊ตฌ๋ถ„์ž), ์ ‘๋‘์‚ฌ(Prefix), ์ ‘๋ฏธ์‚ฌ(Suffix)๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Test
public void testDelimiterPrefixSuffix() {
        int[] source = {1, 2, 3, 4};

        StringJoiner strJoiner = new StringJoiner(",", "[", "]");
        for (int el : source) {
        strJoiner.add(Integer.toString(el));
        }

        assertThat(strJoiner.toString()).isEqualTo("[1,2,3,4]");
        }

๋‚ ์งœ ๊ด€๋ จ ํด๋ž˜์Šค๋“ค ์ถ”๊ฐ€

  • java.time.ZoneDateTime / java.time.LocalDate
  • java.time.format.DateTimeFormatter
  • java.time.DayOfWeek(enum) : ์š”์ผ

๋ณ‘๋ ฌ ๋ฐฐ์—ด ์ •๋ ฌ(Parallel array sorting)

  • Java 8์—์„œ๋Š” parallelSort() ์ •๋ ฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ์ œ๊ณต๋œ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ sort()์˜ ๊ฒฝ์šฐ ๋‹จ์ผ ์Šค๋ ˆ๋„๋กœ ์ˆ˜ํ–‰
  • parallelSort()๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๋‚˜๋‰˜์–ด ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ๋‹ค.
  • CPU๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ฒ ์ง€๋งŒ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋” ๋น ๋ฅด๋‹ค.

์ž๋ฐ” ์–ด๋…ธํ…Œ์ด์…˜(Java Annotation)

  • ์• ๋…ธํ…Œ์ด์…˜์€ ์ฃผ์„์ด๋ž€ ์˜๋ฏธ (JDK 1.5 ๋ฒ„์ „ ์ด์ƒ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฌธ๋ฒ• ์—๋Ÿฌ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ์ •๋ณด ์ œ๊ณต
  • ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœํˆด์ด ๋นŒ๋“œ๋‚˜ ๋ฐฐ์น˜ ์‹œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ณด ์ œ๊ณต
  • ์‹คํ–‰ ์‹œ(๋Ÿฐํƒ€์ž„ ์‹œ) ํŠน์ • ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋„๋ก ์ •๋ณด๋ฅผ ์ œ๊ณต

์ž๋ฐ” ์ฝ”๋“œ์— ์ ์šฉ๋˜๋Š” ๋‚ด์žฅ ์–ด๋…ธํ…Œ์ด์…˜

  • @Override
    • ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์˜ค๋ฒ„๋ผ์ด๋“œ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์ƒ์œ„ ํด๋ž˜์Šค(or interface)์—์„œ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ
  • @Deprecated
    • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์„ ํ‘œ์‹œ
    • ๋งŒ์•ฝ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœ์ƒ
  • @FunctionalInterface
    • Java8 ๋ถ€ํ„ฐ ์ง€์›, ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
    • ๋งŒ์•ฝ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, 2๊ฐœ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ(default ๋ฉ”์„œ๋“œ ์ œ์™ธ)๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

final keyword

  • ๋ณ€์ˆ˜, ๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋ฌด์–ธ๊ฐ€๋ฅผ ์ œํ•œํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค๋Š” ๊ฒƒ์ด ๊ณตํ†ต์ 

๋ณ€์ˆ˜(variable)

  • ๋ณ€์ˆ˜์— final์„ ๋ถ™์ด๋ฉด ์ด ๋ณ€์ˆ˜๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ

  • ์ˆ˜์ •๋  ์ˆ˜ ์—†๊ธฐ์— ์ดˆ๊ธฐํ™” ๊ฐ’์€ ํ•„์ˆ˜์ 

  • ๊ฐ์ฒด ์•ˆ์˜ ๋ณ€์ˆ˜๋ผ๋ฉด ์ƒ์„ฑ์ž, static ๋ธ”๋Ÿญ์„ ํ†ตํ•œ ์ดˆ๊ธฐํ™”๊นŒ์ง€๋Š” ํ—ˆ์šฉ

  • ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํ•  ๋•Œ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์˜ ๊ฐ’์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ

...ing

[ref] https://sabarada.tistory.com/148