[JAVA] POLYMORPHISM

์„ฑ์žฅ์ผ๊ธฐยท2024๋…„ 7์›” 22์ผ
0

[SWCAMP] JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
9/16
post-thumbnail

๋‹คํ˜•์„ฑ

๐Ÿ’ก ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋„ ํ•˜๊ณ , ํ•˜๋‚˜์˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋กœ ๊ฐ์ฒด๋ณ„๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.
๋‹คํ˜•์„ฑ์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ 3๋Œ€ ํŠน์ง•(์บก์Аํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ) ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฝƒ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ์šธ ์ •๋„๋กœ ํ™œ์šฉ์„ฑ์ด ๋†’๊ณ  ์žฅ์ ์ด ๋งŽ๋‹ค.

๋‹คํ˜•์„ฑ์˜ ์žฅ์ 

A. ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์˜ ํƒ€์ž…์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์ด ์ฆ๊ฐ€๋œ๋‹ค.

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

C. ํ™•์žฅ์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

D. ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋™์  ๋ฐ”์ธ๋”ฉ

๐Ÿ’ก ์ปดํŒŒ์ผ ๋‹น์‹œ์—๋Š” ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฉ”์†Œ๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๊ฐ€ ๋Ÿฐํƒ€์ž„ ์‹œ ์‹ค์ œ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”์†Œ๋“œ(์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๋ฉ”์†Œ๋“œ)๋กœ ๋ฐ”์ธ๋”ฉ์ด ๋ฐ”๋€Œ์–ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ๋™์  ๋ฐ”์ธ๋”ฉ์˜ ์„ฑ๋ฆฝ ์กฐ๊ฑด
    ์ƒ์† ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๋ถ€๋ชจ ์ž์‹ ํด๋ž˜์Šค์— ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

์—…์บ์ŠคํŒ…๊ณผ ๋‹ค์šด์บ์ŠคํŒ…

๐Ÿ’ก ์ƒ์†๊ด€๊ณ„์— ์žˆ์ง€๋งŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ๊ฒƒ์ด ์•„๋‹Œ ํ›„์† ๊ฐ์ฒด๊ฐ€ ๊ณ ์œ ํ•˜๊ฒŒ ๊ฐ€์ง€๋Š” ํ™•์žฅ๋œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹ค์ œ ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์œผ๋กœ ๋‹ค์šด์บ์ŠคํŒ…(ํด๋ž˜์Šค ํ˜•๋ณ€ํ™˜)์„ ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
ํด๋ž˜์Šค ํ˜•๋ณ€ํ™˜์€ ์ƒ์œ„ ํƒ€์ž… ํ˜•๋ณ€ํ™˜(up-casting)๊ณผ ํ•˜์œ„ ํƒ€์ž… ํ˜•๋ณ€ํ™˜(down-casting)์ด ์žˆ๋‹ค. ์ƒ์œ„ ํƒ€์ž… ํ˜•๋ณ€ํ™˜์˜ ๊ฒฝ์šฐ ๋ฌต์‹œ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋ฉฐ, ํ•˜์œ„ ํƒ€์ž… ํ˜•๋ณ€ํ™˜์€ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

Instanceof ์—ฐ์‚ฐ์ž

๐Ÿ’ก ํด๋ž˜์Šค ํ˜•๋ณ€ํ™˜์˜ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„์‹œ ์กด์žฌํ•˜๋Š” ํƒ€์ž…๊ณผ ํ˜•๋ณ€ํ™˜ํ•˜๋ ค๋Š” ํƒ€์ž…์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ClassCastException์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์กฐ๊ธˆ ๋” ๋Ÿฐํƒ€์ž„ ์‹œ ์•ˆ์ „ํ•œ ํ˜•๋ณ€ํ™˜์„ ํ•˜๊ธฐ ์œ„ํ•ด instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. instanceof ์—ฐ์‚ฐ์ž๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ํ™•์ธํ•˜์—ฌ true or false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ํ‘œํ˜„์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
If(๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜ instanceof ํด๋ž˜์Šค ํƒ€์ž…) {
		// true์ผ ๋•Œ ์ฒ˜๋ฆฌํ•  ๋‚ด์šฉ, ํ•ด๋‹น ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ down-castingํ•  ๊ฒƒ
}
Car car = new Sonata();
if(car instanceof Sonata) {
		((Sonata) car).moveSonata();
} else if(car instanceof Avante) {
		((Avante) car).moveAvante();
} else if(car instanceof Grandure) {
		((Grandure) car).moveGrandure();
}

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

์ถ”์ƒ ํด๋ž˜์Šค

์ถ”์ƒ ํด๋ž˜์Šค(Abstract Class)๋ž€?

๐Ÿ’ก ์ถ”์ƒ ๋ฉ”์†Œ๋“œ(๋ฉ”์†Œ๋“œ์˜ ๊ธฐ๋Šฅ์ด ์—†๊ณ  ๋ฉ”์†Œ๋“œ์˜ ํ—ค๋”๋ถ€๋งŒ ์กด์žฌํ•˜๋Š” ๋ถˆ์™„์ „ํ•œ ๋ฉ”์†Œ๋“œ)๋ฅผ 0๊ฐœ ์ด์ƒ ํฌํ•จํ•˜๋Š” ํด๋ž˜์Šค๋กœ ์Šค์Šค๋กœ ์ž์‹ ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ™œ์šฉํ•œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋ถˆ์™„์ „ํ•œ ํด๋ž˜์Šค๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์ƒ์†์„ ํ™œ์šฉํ•ด ํ•˜์œ„ ํด๋ž˜์Šค ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จํ•˜๋ฉด ๋ถˆ์™„์ „ํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์ด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

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

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

๐Ÿ’ก ์ถ”์ƒ ๋ฉ”์†Œ๋“œ์™€ ์ƒ์ˆ˜ ํ•„๋“œ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์˜ ๋ณ€ํ˜•์ฒด์ด๋‹ค.
์ƒ์†๊ณผ ๋‹ฌ๋ฆฌ implements๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์ž์‹ ํด๋ž˜์Šค ์ž…์žฅ์—์„œ โ€˜์ƒ์† ๋ฐ›์•˜๋‹คโ€™๊ณ  ๋งํ•˜์ง€ ์•Š๊ณ  โ€˜๊ตฌํ˜„ํ•œ๋‹คโ€™๋ผ๋Š” ํ‘œํ˜„์„ ์“ด๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ‘œํ˜„์‹
interface TestInter {
		
		// ๋ชจ๋“  ํ•„๋“œ๋Š” public static final๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
		public static final PI1 = 3.1415;

		// public static final์„ ์ƒ๋žตํ•ด๋„ ์ž๋™์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.(์ƒ๋žต ๊ฐ€๋Šฅ)
    PI2 = 3.14;

    // ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋Š” public abstract์—ฌ์•ผ ํ•œ๋‹ค.
		public abstract void method1();

    // public abstract๋ฅผ ์ƒ๋žตํ•ด๋„ ์ž๋™์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.(์ƒ๋žต ๊ฐ€๋Šฅ)
    void method2();
}
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” implements ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
class Person implements Instinct, Serializable {

		@Override
		public void eating(String food) {
				System.out.println("์‚ฌ๋žŒ์€ " + food + "๋ฅผ ์š”๋ฆฌํ•˜๊ณ  ์‹๊ธฐ๋ฅผ ํ™œ์šฉํ•ด ์Œ์‹์„ ๋จน๋Š”๋‹ค.");
    }
}

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

๐Ÿ’ก ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ณต์œ ๋ฅผ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” ์ƒ์ˆ˜(public static final ํ•„๋“œ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ณตํ†ตํ™”(public abstract ๋ฉ”์†Œ๋“œ)ํ•ด์„œ ๊ฐ•์ œ์„ฑ์„ ๋ถ€์—ฌํ•  ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์กŒ๋‹ค.(๊ณตํ†ต๋œ ์ธํ„ฐํŽ˜์ด์Šค)
๋˜ํ•œ ์ž๋ฐ”์˜ ๋‹จ์ผ ์ƒ์†์ด๋ผ๋Š” ๋‹จ์ ์„ ์–ด๋А ์ •๋„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•˜๋ฉฐ ๋ชจ๋“  ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค ์™ธ์—๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค
public class Application implements InterOne, InterTwo {
		
		@Override
		public void interOneMethod() {}

		@Override
		public void interTwoMethod() {}
}

์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ 

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

๊ตฌ๋ถ„์ถ”์ƒ ํด๋ž˜์Šค์ธํ„ฐํŽ˜์ด์Šค
์ƒ์† ๊ฐ€๋Šฅ ๋ฒ”์œ„๋‹จ์ผ ์ƒ์†๋‹ค์ค‘ ์ƒ์†
ํ‚ค์›Œ๋“œextends ์‚ฌ์šฉimplements ์‚ฌ์šฉ
์ถ”์ƒ ๋ฉ”์†Œ๋“œ ๊ฐฏ์ˆ˜abstract ๋ฉ”์†Œ๋“œ 0๊ฐœ ์ด์ƒ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋Š” abstract
abstract ํ‚ค์›Œ๋“œ ๋ช…์‹œ๋ช…์‹œ์  ์‚ฌ์šฉ๋ฌต์‹œ์ ์œผ๋กœ abstract

์ถ”์ƒํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต์ 

๊ตฌ๋ถ„์ถ”์ƒ ํด๋ž˜์Šค์ธํ„ฐํŽ˜์ด์Šค
์ž์ฒด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ƒ์„ฑ ๋ถˆ๊ฐ€์ƒ์„ฑ ๋ถˆ๊ฐ€
๋‹คํ˜•์„ฑ ์ ์šฉ ์‹œ ์ƒ์œ„ ํƒ€์ž… ํ™œ์šฉ ๊ฐ€๋Šฅ ์œ ๋ฌด๊ฐ€๋Šฅ๊ฐ€๋Šฅ
profile
์—”์ง€๋‹ˆ์–ด๋กœ์˜ ์„ฑ์žฅ์ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€