Blog

[Java]34 ๐ŸŽฏย ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP) - ํŠน์ง• (Concepts)

Category
Author
Tags
PinOnMain
1 more property
Intro
๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ํ•œ๋ฒˆ์— ์ดํ•ด ํ•  ์ˆ˜๋„ ์—†๋Š” ๋ถ€๋ถ„์ด๊ณ , ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜๊ณ , ์ •๋‹ต์ด ์—†๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ๋‹ค๋“ค ์„ค๋ช…ํ•˜์ง€๋งŒ ์„ ๋ฐฐ๋“ค์€ ๋ชจ๋‘ ๊ฒฝํ—˜์—์„œ ๋น„๋กฏํ•œ ๊ทธ๋“ค๋งŒ์˜ ํ‹€์ด ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ๋ณด๋ฉด ๊ต์œก๋“ค์„ ๋“ค์œผ๋ฉด์„œ ๊ฐ€์žฅ ์ง„์ง€ํ•˜๊ฒŒ ๊ฐ•์˜๋“ค์„ ๋ณด๊ณ  ์žˆ๊ธฐ๋„ ํ•˜๊ณ , ๋ฌด์–ธ๊ฐ€ ์–ด๋ ค์›€๋ณด๋‹ค ๊ธด์žฅ๊ฐ์ด ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.
์–ด๋–ป๊ฒŒ๋ณด๋ฉด ๋‚ด๊ฐ€ Java์˜ ๋งค๋ ฅ์— ๋น ์ง„ ๊ฒƒ๋„ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด ํŠน์„ฑ์„ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•๋ก , ํŒจ๋Ÿฌ๋‹ค์ž„, ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming)์— ์ž˜ ์–ด์šธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ?
๋ฌผ๋ก  ๋งŽ์€ ์ข…๋ฅ˜์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋“ค์ด ์žˆ๋‹ค.
๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ผ ๋ถˆ๋ฆฌ์šฐ๋Š” ์–ธ์–ด ์ข…๋ฅ˜
๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋Š” ๋งŽ์ง€๋งŒ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋กœ์จ ์ถฉ๋ถ„ํ•œ ํ™œ์šฉ์„ ๋ชปํ•˜๋Š” ๊ฒƒ ์•„๋‹๊นŒ?
์ ˆ์ฐจ ์ง€ํ–ฅ๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์ฐจ์ด
๊ทธ๋Ÿผ ์ ˆ์ฐจ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ธ๊ฐ€? ์•„๋‹ˆ๋‹ค. ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์ด ๋‹ค๋ฅด๊ณ  ๋ชฉ์ ์ด ๋‹ค๋ฅธ ๊ฒƒ์ด์—ˆ๋‹ค.
โ€ข
์ ˆ์ฐจ ์ง€ํ–ฅ ๋ชจ๋ธ๋ง์€ ํ”„๋กœ๊ทธ๋žจ์„ย ๊ธฐ๋Šฅ์ค‘์‹ฌ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœย "๋ฌด์—‡์„ ์–ด๋–ค ์ ˆ์ฐจ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€?"๊ฐ€ ํ•ต์‹ฌ์ด ๋œ๋‹ค. ์ฆ‰, ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.
โ€ข
๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ๋ง์€ ๊ธฐ๋Šฅ์ด ์•„๋‹Œย ๊ฐ์ฒด๊ฐ€ ์ค‘์‹ฌ์ด ๋˜๋ฉฐย "๋ˆ„๊ฐ€ ์–ด๋–ค ์ผ์„ ํ•  ๊ฒƒ์ธ๊ฐ€?"๊ฐ€ ํ•ต์‹ฌ์ด ๋œ๋‹ค. ์ฆ‰, ๊ฐ์ฒด๋ฅผ ๋„์ถœํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ์ •์˜ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค.
๊ฐ์ฒด๊ฐ„์˜ ๊ด€๊ณ„
๊ฐ์ฒด๋Š” ๋‹จ๋…์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋‹ค. ๊ด€๊ณ„์˜ ์ข…๋ฅ˜์—๋Š” ์ง‘ํ•ฉ ๊ด€๊ณ„, ์‚ฌ์šฉ ๊ด€๊ณ„, ์ƒ์† ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค.
1.
์ง‘ํ•ฉ ๊ด€๊ณ„
โ€ข
์™„์„ฑํ’ˆ๊ณผ ๋ถ€ํ’ˆ์˜ ๊ด€๊ณ„๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ๋Š” ์—”์ง„, ํƒ€์ด์–ด, ํ•ธ๋“ค ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฏ€๋กœ ์ž๋™์ฐจ์™€ ๋ถ€ํ’ˆ๋“ค์€ ์ง‘ํ•ฉ ๊ด€๊ณ„๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
2.
์‚ฌ์šฉ ๊ด€๊ณ„
โ€ข
๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ๋žŒ์ด ์ž๋™์ฐจ์—๊ฒŒ ๋‹ฌ๋ฆฐ๋‹ค, ๋ฉˆ์ถ˜๋‹ค ๋“ฑ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‚ฌ๋žŒ๊ณผ ์ž๋™์ฐจ๋Š” ์‚ฌ์šฉ ๊ด€๊ณ„๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
3.
์ƒ์† ๊ด€๊ณ„
โ€ข
๋ถ€๋ชจ์™€ ์ž์‹ ๊ด€๊ณ„๋ฅผ ๋งํ•œ๋‹ค. ์ž๋™์ฐจ๊ฐ€ ๊ธฐ๊ณ„์˜ ํŠน์ง•(ํ•„๋“œ, ๋ฉ”์†Œ๋“œ)์„ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค๋ฉด ๊ธฐ๊ณ„(๋ถ€๋ชจ)์™€ ์ž๋™์ฐจ(์ž์‹)๋Š” ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํŠน์ง•
1.
์ถ”์ƒํ™”(abstraction) โ†’ abstract class or abstract method, Not yet defined
2.
์บก์Šํ™”(encapsulation) โ†’ cover up exposed vars by public, protected, default, private(getter/setter)
3.
์ƒ์†์„ฑ(inheritance) โ†’ Child class states are defined by extended from Parents classโ€™s states
4.
๋‹คํ˜•์„ฑ(polymorphism) โ†’ enable Overload and Override method to the origin
a.
๋™์ ๋ฐ”์ธ๋”ฉ(Dynamic Binding) โ†’ The origin will be cover over by request method which Overridden or Overloaded method
๋‚˜๋Š” ์ด๊ฒƒ๋“ค์ด ๊ฐ๊ฐ ์–ด๋–ค ๊ฒƒ๋“ค์ธ์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•œ๋‹ค.

[1] ์ถ”์ƒํ™”(abstraction)

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

[2] ์บก์Šํ™”(encapsulation)

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

[3] ์ƒ์†์„ฑ(inheritance)

โ€ข
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ํŠน์ง•(ํ•จ์ˆ˜, ๋ฐ์ดํ„ฐ)์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ฒƒ
โ—ฆ
์•„๋“ค : โ€œ๋‚œ ์•„๋ฒ„์ง€์™€ ์ง‘์ฃผ์†Œ๊ฐ€ ๊ฐ™์•„! ๋‚ด ์ฃผ์†Œ๋Š” ์•„๋ฒ„์ง€ ์ฃผ์†Œ๋กœ ์ฐพ์•„๋„ ๋ผ!โ€
โ€ข
์ด๋ฏธ ์ž‘์„ฑ๋œ ํด๋ž˜์Šค๋ฅผ ๋ฐ›์•„์„œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ
โ€ข
๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์žฌํ™œ์šฉํ•ด์„œ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐ์ฒด์ง€ํ–ฅ ๋ฐฉ๋ฒ•์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์— ์†ํ•œ๋‹ค.

[4] ๋‹คํ˜•์„ฑ(polymorphism)

โ€ข
์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ
โ—ฆ
์•„๋“ค : โ€œ๋‚˜๋Š” ์•„๋ฒ„์ง€๋ž‘ ์ธ์‚ฌ๋ง์ด ๋‹ฌ๋ผโ€
โ€ข
๋™์ผํ•œ ๋ช…๋ น์˜ ํ•ด์„์„ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์— ์˜์กดํ•˜๋Š” ๊ฒƒ
โ€ข
์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding), ์˜ค๋ฒ„๋กœ๋”ฉ(Overloading)
โ—ฆ
์˜ค๋ฒ„๋ผ์ด๋”ฉ(Overriding) - ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๊ฐ™๋˜ ๋‚ด๋ถ€ ์†Œ์Šค๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ
โ–ช
์•„๋“ค : โ€œ๋‚œ ์•„๋ฒ„์ง€๋ž‘ ๋‹ค๋ฅธ ์ผ์„ ํ•ด!โ€
โ—ฆ
์˜ค๋ฒ„๋กœ๋”ฉ(Overloading) - ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ •์˜ํ•œ ํ›„ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฌ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
โ–ช
ํ•˜์ˆ™์ƒ : โ€œํ•˜์ˆ™์„ ์ž…๋ ฅํ•˜๋ฉด ๋‚œ ์ถ”๊ฐ€๋กœ ํ•˜์ˆ™์ƒ์ด๋ผ๊ณ  ์†Œ๊ฐœ๋ง์„ํ•ดโ€

[+@] ๋™์ ๋ฐ”์ธ๋”ฉ(Dynamic Binding) - ๋‹คํ˜•์„ฑ์˜ ์ผํ™˜

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

[1] ์ถ”์ƒํ™”(abstraction)

package oop_concepts_Abstraction; import oop_concepts_Encapsulation.Member; public class Main { public static void main(String[] args){ Animal cat = new Cat("Hore",12,12.3,"Korea"); Animal dog = new Dog("LALA",5,15.6,"States"); Animal chicken = new Chicken("Coo",2,4.3,"Japan"); cat.bark(); dog.bark(); chicken.bark(); //-------------- Encapsulation example test Member member = new Member(); System.out.println(member.memberNum); //memberNum์€ public์ด๋ผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ๋„ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ์Œ. //System.out.println(member.memo); //System.out.println(member.id); // private, default ์—ญ์‹œ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ System.out.println(member.getId()); //private id์ง€๋งŒ, getId() getter๋Š” public์ด๋ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ! } }
Java
๋ณต์‚ฌ
package oop_concepts_Abstraction; public abstract class Animal { String name; int age; double speed; String country; public Animal(String name, int age, double speed, String country) { this.name = name; this.age = age; this.speed = speed; this.country = country; } public void move() {//๊ณตํ†ต์ ์ธ ์›€์ง์ž„ System.out.println("์ด๋™ํ•œ๋‹ค"); } public void eat() {//๊ณตํ†ต์ ์ธ ๋จน๋Š” ํ–‰์œ„ System.out.println("๋จน๋Š”๋‹ค"); } public void play() {//๊ณตํ†ต์ ์ธ ๋…ธ๋Š” ํ–‰์œ„ System.out.println("์žฅ๋‚œ์นœ๋‹ค"); } public abstract void bark(); //์ง–๋Š” ์†Œ๋ฆฌ๋Š” ๋™๋ฌผ๋งˆ๋‹ค ๋‹ค๋ฅด๋ฏ€๋กœ ์ถ”์ƒ๋ฉ”์„œ๋“œ๋กœ ์ƒ์„ฑ // ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•จ }
Java
๋ณต์‚ฌ

[2] ์บก์Šํ™”(encapsulation)

package oop_concepts_Encapsulation; public class Main { public static void main(String[] args) { Member member = new Member(); System.out.println(member.memberNum); //Member Class์˜ public ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ์„ ์–ธ๋œ ํ•„๋“œ memberNum์€ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ. //System.out.println(member.id); //private ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ์„ ์–ธ๋œ id ๋“ฑ์€ ์ธ์Šคํ„ด์Šค์—์„œ ๋ชป๊บผ๋ƒ„ //System.out.println(member.age); //private ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ์„ ์–ธ๋œ id ๋“ฑ์€ ์ธ์Šคํ„ด์Šค์—์„œ ๋ชป๊บผ๋ƒ„ System.out.println(member.getId()); //private์ธ ํ•„๋“œ๋Š” ํด๋ž˜์Šค์—์„œ getter, setter๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Œ. System.out.println(member.getAge()); //private์ธ ํ•„๋“œ๋Š” ํด๋ž˜์Šค์—์„œ getter, setter๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Œ. } }
Java
๋ณต์‚ฌ
package oop_concepts_Encapsulation; public class Member { public int memberNum; //public ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ. (ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋‚ด) private String id; //private ์ ‘๊ทผ ์ œ์–ด์ž๋กœ ํ•ด๋‹น ํด๋ž˜์Šค(member) ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. private String pw; private int age; String memo = "Memo"; //default ์ ‘๊ทผ ์ œ์–ด์ž ๋™์ผํ•œ ํŒจํ‚ค์ง€ ์•ˆ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. //getter public String getId() { return id; } public String getPw() { return pw; } public int getAge() { return age; } //setter public void setId(String id) { this.id = id; } public void setPw(String pw) { this.pw = pw; } public void setAge(int age) { this.age = age; } }
Java
๋ณต์‚ฌ

[3] ์ƒ์†์„ฑ(inheritance)

package oop_concepts_Inheritance; public class Main { public static void main(String[] args) { //์‚ฌ๋žŒ > ์˜์‚ฌ ์™€ ๊ฐ™์€ ์ƒ์†๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. //type ๋ณ€์ˆ˜๋ช… = new ํด๋ž˜์Šค๋ช…( ); Doctor doc = new Doctor(); //์˜์‚ฌํด๋ž˜์Šค ํƒ€์ž…์˜ ์˜์‚ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด, doc.heal(); //์˜์‚ฌ ๊ธฐ์ˆ ์ธ ์น˜๋ฃŒ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค System.out.println(doc.age); //๋˜ํ•œ ์‚ฌ๋žŒ(๋ถ€๋ชจํด๋ž˜์Šค)์„ ์ƒ์† ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ด๋ผ๋Š” ์ •๋ณด๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. Person doc2 = new Doctor(); //ํ•˜์ง€๋งŒ ์‚ฌ๋žŒํด๋ž˜์Šค ํƒ€์ž…์˜ ์˜์‚ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋ฉด, //doc2.heal(); //์ž์‹์ธ ์˜์‚ฌ ํด๋ž˜์Šค์˜ ๊ธฐ์ˆ ์„ ์“ธ ์ˆ˜ ์—†๋‹ค. doc2๋ผ๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด Person์ด๋ผ๋Š” ํด๋ž˜์Šค๊ธฐ ๋•Œ๋ฌธ์— Person์˜ ๋Šฅ๋ ฅ๋ฐ–์— ๋ชป์“ด๋‹ค. doc2.eat();//์ด๊ฑด ์‚ฌ๋žŒ์˜ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์ด๋‹ค. doc2.play();//์ด๊ฑด ์‚ฌ๋žŒ์˜ ๊ธฐ๋ณธ ๊ธฐ์ˆ ์ด๋‹ค. //Doctor doc3 = new Person(); //์• ์ดˆ์— ์ž์‹ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์—†๋‹ค. Student stu = new Student(); stu.study(); Person stu2 = new Person(); //์ด๊ฑด ๋ช…์นญ๋งŒ stu์ง€ ์‚ฌ๋žŒํƒ€์ž…์˜ ์‚ฌ๋žŒ๊ฐ์ฒด๋‹ค. Person stu3 = new Student(); stu3.play();//Personํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋‹ค. } }
Java
๋ณต์‚ฌ
package oop_concepts_Inheritance; public class Person { int age; int weight; int height; void eat(){ System.out.println("๋จน์–ด์š”"); } void sleep(){ System.out.println("์ž์š”"); } void play(){ System.out.println("๋†€์•„์š”"); } }
Java
๋ณต์‚ฌ
package oop_concepts_Inheritance; public class Doctor extends Person{ public void heal(){ System.out.println("์˜์‚ฌ๋ผ ์น˜๋ฃŒํ•ด์š”"); } }
Java
๋ณต์‚ฌ

[4] ๋‹คํ˜•์„ฑ(polymorphism) + ๋ฐ”์ธ๋”ฉ

package oop_concepts_Polymorphism; public class Main { public static void main(String[] args) { Superman sup = new Superman(25,56,123,"john",321,212); System.out.println("age:"+sup.age);//๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€๊ฒƒ System.out.println("weight:"+sup.weight);//๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€๊ฒƒ System.out.println("height:"+sup.height);//๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€๊ฒƒ System.out.println("name:"+sup.name);//์˜ค๋ฒ„๋กœ๋”ฉํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ System.out.println("power:"+sup.power);//์˜ค๋ฒ„๋กœ๋”ฉํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ System.out.println("speed:"+sup.speed);//์˜ค๋ฒ„๋กœ๋”ฉํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ sup.attack();//๋ณธ์ธ sup.move();// --> Override ๋ถ€๋ชจ์˜ ๋‚ด๋ถ€ ์†Œ์Šค ์žฌ์ •์˜ <<------ Superman์ด ๋ฎ์Œ, Dynamic Binding } }
Java
๋ณต์‚ฌ
package oop_concepts_Polymorphism; public class Human { int age=22; int weight=22; int height=22; public Human(int age, int weight, int height){ } public void move(){ System.out.println("์›€์ง์—ฌ์š”"); } public void stop(){ System.out.println("๋ฉˆ์ถฐ์š”"); } }
Java
๋ณต์‚ฌ
package oop_concepts_Polymorphism; public class Superman extends Human{ String name; int power; //superman ๋งŒ์˜ ํŠน์ˆ˜ ๋Šฅ๋ ฅ int speed; //superman๋งŒ์˜ ํŠน์ˆ˜ ๋Šฅ๋ ฅ (๋ถ€๋ชจ๋กœ ์ƒ์†๋ฐ›์ง€ ์•Š์€๊ฒƒ์ž„) public Superman(int age, int weight, int height, String name, int power, int speed){ super(age, weight, height); // ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ age, weight๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ<< ์ •์  ๋ฐ”์ธ๋”ฉ Static binding ๋œ ์ƒํƒœ this.name = name; this.power = power; //๊ฐ์ฒด (์ธ์Šคํ„ด์Šค)์ƒ์„ฑ ์‹œ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜จ power, speed๋ฅผ this๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์˜ power์— ํ• ๋‹น this.speed = speed; } public void move(){ System.out.println("์žฌ๋น ๋ฅด๊ฒŒ"); // <<<<<------ ๋ถ€๋ชจ์—๊ฒŒ๋„ ์žˆ๋Š” move()์ง€๋งŒ ์ž์‹์—์„œ ์˜ค๋ฒ„๋กœ๋”ฉํ•ด์„œ ๊ฐ์ฒด๋Š” Superman ํƒ€์ž…์ด๋ผ ์ด๊ฒƒ์ด ์‹คํ–‰๋จ.(๋ฎ์–ด์ง) System.out.println("์›€์ง์ด๊ณ "); System.out.println("ํ”ผํ•˜๊ธฐ!!"); } public void fly(){ System.out.println("๋‚ ๋ผ์š”"); } public void attack(){ System.out.println("๋•Œ๋ ค์š”"); } }
Java
๋ณต์‚ฌ