๋คํ์ฑ 1
๋คํ์ฑ ์์
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํ์ ์ธ ํน์ง์ผ๋ก๋ ์บก์ํ, ์์, ๋คํ์ฑ์ด ์๋ค. ๊ทธ์ค์์ ๋คํ์ฑ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ฝ์ด๋ผ ๋ถ๋ฆฐ๋ค.
์์ ํ์ตํ๋ ์บก์ํ๋ ์์์ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๋ค. ๋ฐ๋ฉด์ ๋คํ์ฑ์ ์ ๋๋ก ์ดํดํ๊ธฐ๋ ์ด๋ ต๊ณ , ์ ํ์ฉํ๊ธฐ๋ ๋ ์ด๋ ต๋ค. ํ์ง๋ง ์ข์ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด์๋ ๋คํ์ฑ์ ๋ํ ์ดํด๊ฐ ํ์๋ค.
๋คํ์ฑ(Polymorphism)์ ์ด๋ฆ ๊ทธ๋๋ก "๋ค์ํ ํํ", "์ฌ๋ฌ ํํ"๋ฅผ ๋ปํ๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ๋คํ์ฑ์ ํ ๊ฐ์ฒด๊ฐ ์ฌ๋ฌ ํ์
์ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋ ์ ์๋ ๋ฅ๋ ฅ์ ๋ปํ๋ค. ๋ณดํต ํ๋์ ํ์
์ผ๋ก ๊ณ ์ ๋์ด ์๋ค. ๊ทธ๋ฐ๋ฐ ๋คํ์ฑ์ ์ฌ์ฉํ๋ฉด ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ํ์
์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ค๋ ๋ป์ด๋ค.
๋คํ์ฑ์ ์ดํดํ๊ธฐ ์ํด์๋ 2๊ฐ์ง ํต์ฌ ์ด๋ก ์ ์์์ผ ํ๋ค.
- ๋คํ์ ์ฐธ์กฐ
- ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
๋คํ์ ์ฐธ์กฐ
Parent ํด๋์ค
package poly;
public class Parent {
public void parentMethod() {
System.out.println("Parent.parentMethod");
}
}
Child ํด๋์ค
package poly;
public class Child extends Parent{
public void childMethod() {
System.out.println("Child.childMethod");
}
}
Main ํด๋์ค
package poly;
public class PolyMain {
public static void main(String[] args) {
// ๋ถ๋ชจ ๋ณ์๊ฐ ๋ถ๋ชจ ์ธ์คํด์ค ์ฐธ์กฐ
System.out.println("Parent -> Parent");
Parent parent = new Parent();
parent.parentMethod();
// ์์ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ
System.out.println("Child -> Child");
Child child = new Child();
child.parentMethod();
child.childMethod();
// ๋ถ๋ชจ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ(๋คํ์ ์ฐธ์กฐ)
System.out.println("Parent -> Child");
Parent poly = new Child();
poly.parentMethod();
//Child child1 = new Parent(); // ์์์ ๋ถ๋ชจ๋ฅผ ๋ด์ ์ ์๋ค.
//poly.childMethod(); // ์์์ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ค. ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
}
}
๋คํ์ ์ฐธ์กฐ: ๋ถ๋ชจ ํ์ ์ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ
Parent → Child : poly.parentMethod( )
- ๋ถ๋ชจ ํ์ ์ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค.
- Parent poly = new Child( )
- Child ์ธ์คํด์ค๋ฅผ ๋ง๋ค์๋ค. ์ด ๊ฒฝ์ฐ ์์ ํ์ ์ธ Child๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์์ Child์ Parent๊ฐ ๋ชจ๋ ์์ฑ๋๋ค.
- ์์ฑ๋ ์ฐธ์กฐ๊ฐ์ Parent ํ์ ์ ๋ณ์์ธ poly์ ๋ด์๋๋ค.
๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค.
- ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ ๋ด์ ์ ์๋ค.
- Parent poly๋ ๋ถ๋ชจ ํ์
์ด๋ค. new Child( )๋ฅผ ํตํด ์์ฑ๋ ๊ฒฐ๊ณผ๋ Child ํ์
์ด๋ค.
Java์์ ๋ถ๋ชจ ํ์ ์ ์์ ํ์ ์ ๋ด์ ์ ์๋ค!- Parent poly = new Child( ) : ์ฑ๊ณต
- ๋ฐ๋๋ก ์์ ํ์
์ ๋ถ๋ชจ ํ์
์ ๋ด์ ์ ์๋ค.
- Child child1 = new Parent( ) : ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
๋คํ์ ์ฐธ์กฐ
- Parent parent = new Parent( )
- Child child = new Child( )
๊ทธ๋ฐ๋ฐ Parent ํ์ ์ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ์ธ Parent๋ ๋ฌผ๋ก ์ด๊ณ , ์์ ํ์ ๊น์ง ์ฐธ์กฐํ ์ ์๋ค. ๋ง์ฝ ์์๊ฐ ์๋ค๋ฉด ์์๋ ๊ทธ ํ์ ํ์ ๋ ์ฐธ์กฐํ ์ ์๋ค.
- Parent poly = new Parent( )
- Parent poly = new Child( )
- Parent poly = new Grandson( ) : Child ํ์์ ์์๊ฐ ์๋ค๋ฉด ๊ฐ๋ฅ
Java์์ ๋ถ๋ชจ ํ์
์ ์์ ์ ๋ฌผ๋ก ์ด๊ณ , ์์ ์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ์์ ํ์
์ ์ฐธ์กฐํ ์ ์๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๋ค์ํ ํํ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค๊ณ ํด์ ๋คํ์ ์ฐธ์กฐ๋ผ๊ณ ํ๋ค.
๋คํ์ฑ ์ฐธ์กฐ์ ํ๊ณ
Parent → Child : poly.childMethod( )
Parent poly = new Child( ) ์ด๋ ๊ฒ ์์์ ์ฐธ์กฐํญ ์ํฉ์์ poly๊ฐ ์์ ํ์
์ธ Child์ ์๋ childMethod( )๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
poly.childMethod( )๋ฅผ ์คํํ๋ฉด ๋จผ์ ์ฐธ์กฐ๊ฐ์ ํตํด ์ธ์คํด์ค๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋ก ์ธ์คํด์ค ์์์ ์คํํ ํ์
์ ์ฐพ์์ผ ํ๋ค. ํธ์ถ์์ธ poly๋ Parent ํ์
์ด๋ค. ๋ฐ๋ผ์ parent ํด๋์ค๋ถํฐ ์์ํด์ ํ์ํ ๊ธฐ๋ฅ์ ์ฐพ๋๋ค.
๊ทธ๋ฐ๋ฐ ์์ ๊ด๊ณ๋ ๋ถ๋ชจ ๋ฐฉํฅ์ผ๋ก ์ฐพ์ ์ฌ๋ผ๊ฐ ์ ์์ง๋ง ์์ ๋ฐฉํฅ์ผ๋ก ์ฐพ์ ๋ด๋ ค๊ฐ ์๋ ์๋ค. Parent๋ ๋ถ๋ชจ ํ์
์ด๊ณ ์์์ ๋ถ๋ชจ๊ฐ ์๋ค.
๋ฐ๋ผ์ childMethod( )๋ฅผ ์ฐพ์ ์ ์์ผ๋ฏ๋ก ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
childMethod( )๋ฅผ ํธ์ถํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
๋ฐ๋ก ์บ์คํ
์ด ํ์ํ๋ค.
๋คํ์ ์ฐธ์กฐ์ ํต์ฌ์ ๋ถ๋ชจ๋ ์์์ ํ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋คํ์ฑ๊ณผ ์บ์คํ
Parent poly = new Child( )์ ๊ฐ์ด ๋ถ๋ชจ ํ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด poly.childMethod( )์ ๊ฐ์ด ์์ ํ์ ์ ์๋ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ค.
package poly.basic;
import poly.Child;
import poly.Parent;
public class CastingMain1 {
public static void main(String[] args) {
// ๋ถ๋ชจ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ(๋คํ์ ์ฐธ์กฐ)
Parent poly = new Child();
// ๋จ ์์์ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ค. ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
//poly.childMethod();
// ๋ค์ด์บ์คํ
(๋ถ๋ชจ ํ์
-> ์์ ํ์
)
Child child = (Child) poly;
child.childMethod();
}
}
- poly.childMethod( )๋ฅผ ํธ์ถํ๋ฉด ๋จผ์ ์ฐธ์กฐ๊ฐ์ ์ฌ์ฉํด์ ์ธ์คํด์ค๋ฅผ ์ฐพ๋๋ค.
- ์ธ์คํด์ค ์์์ ์ฌ์ฉํ ํ์ ์ ์ฐพ์์ผ ํ๋ค. poly๋ Parent ํ์ ์ด๋ค.
- Parent๋ ์ต์์ ๋ถ๋ชจ์ด๋ค. ์์ ๊ด๊ณ๋ ๋ถ๋ชจ๋ก๋ง ์ฐพ์์ ์ฌ๋ผ๊ฐ ์ ์๋ค. childMethod( )๋ ์์ ํ์
์ ์์ผ๋ฏ๋ก ํธ์ถํ ์ ์๋ค.
๋ฐ๋ผ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
๋ค์ด ์บ์คํ
ํธ์ถํ๋ ํ์ ์ ์์์ธ Child ํ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ธ์คํด์ค์ Child์ ์๋ childMethod( )๋ฅผ ํธ์ถํ ์ ์๋ค.
๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์์ง๋ง ์์์ ๋ถ๋ชจ๋ฅผ ๋ด์ ์ ์๋ค.
- Parent parent = new Child( ) : ๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค.
- Parent parent = child // Child child ๋ณ์: ๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค.
๋ฐ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ด ์์์ ๋ถ๋ชจ๋ฅผ ๋ด์ ์ ์๋ค.
Child child = poly // Parent poly ๋ณ์
๋ถ๋ชจ ํ์
์ ์ฌ์ฉํ๋ ๋ณ์๋ฅผ ์์ ํ์
์ ๋์
ํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์์์ ๋ถ๋ชจ๋ฅผ ๋ด์ ์ ์๋ค.
์ด๋๋ ๋ค์ด์บ์คํ
์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ถ๋ชจ ํ์
์ ์ ๊น ์์ ํ์
์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ์บ์คํ ์ ํ๋ค๊ณ ํด์ Parent poly์ ํ์ ์ด ๋ณํ๋ ๊ฒ์ด ์๋๋ค. ํด๋น ์ฐธ์กฐ๊ฐ์ ๊บผ๋ด๊ณ ๊บผ๋ธ ์ฐธ์กฐ๊ฐ์ด Child ํ์ ์ด ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ poly์ ํ์ ์ Parent๋ก ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ ์ง๋๋ค.
์บ์คํ
- ์ ์บ์คํ (upcasting) : ๋ถ๋ชจ ํ์ ์ผ๋ก ๋ณ๊ฒฝ
- ๋ค์ด์บ์คํ (downcasting) : ์์ ํ์ ์ผ๋ก ๋ณ๊ฒฝ
์บ์คํ ์ ์ข ๋ฅ
์ผ์์ ๋ค์ด ์บ์คํ
package poly.basic;
public class CastingMain2 {
public static void main(String[] args) {
// ๋ถ๋ชจ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ(๋คํ์ ์ฐธ์กฐ)
Parent poly = new Child();
// ๋จ ์์์ ๊ธฐ๋ฅ์ ํธ์ถํ ์ ์๋ค. ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
//poly.childMethod();
// ์ผ์์ ๋ค์ด์บ์คํ
- ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์๊ฐ๋ง ๋ค์ด์บ์คํ
((Child) poly).childMethod();
}
}
์บ์คํ
์ ํ๋ค๊ณ ํด์ Parent poly์ ํ์
์ด ๋ณํ๋ ๊ฒ์ ์๋๋ค. ํด๋น ์ฐธ์กฐ๊ฐ์ ๊บผ๋ด๊ณ ๊บผ๋ธ ์ฐธ์กฐ๊ฐ์ด Child ํ์
์ด ๋๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ poly์ ํ์
์ Parent๋ก ๊ทธ๋๋ก ์ ์ง๋๋ค.
์ด๋ ๊ฒ ์ผ์์ ๋ค์ด์บ์คํ ์ ์ฌ์ฉํ๋ฉด ๋ณ๋์ ๋ณ์ ์์ด ์ธ์คํด์ค์ ์์ ํ์ ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์ ์บ์คํ
package poly.basic;
// upcasting vs downcasting
public class CastingMain3 {
public static void main(String[] args) {
Child child = new Child();
Parent parent1 = (Parent) child; // ์
์บ์คํ
์ ์๋ต ๊ฐ๋ฅ, ์๋ต ๊ถ์ฅ
Parent parent2 = child; // ์
์บ์คํ
์๋ต
parent1.parentMethod();
parent2.parentMethod();
}
}
์
์บ์คํ
์ ์๋ตํ ์ ์๋ค. ๋ค์ด์บ์คํ
์ ์๋ตํ ์ ์๋ค. ์ฐธ๊ณ ๋ก ์
์บ์คํ
์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์๋ต์ ๊ถ์ฅํ๋ค.
Java์์ ๋ถ๋ชจ๋ ์์์ ๋ด์ ์ ์๋ค. ํ์ง๋ง ๊ทธ ๋ฐ๋๋ ์๋๋ค. (๊ผญ ํ์ํ๋ค๋ฉด ๋ค์ด์บ์คํ
์ ํด์ผ ํ๋ค.)
์ ์บ์คํ ์ ์๋ตํด๋ ๋๊ณ , ๋ค์ด์บ์คํ ์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ช ์์ ์ผ๋ก ์บ์คํ ์ ํด์ผ ํ ๊น?
๋ค์ด ์บ์คํ ๊ณผ ์ฃผ์์
๋ค์ด์บ์คํ ์ ์๋ชปํ๋ฉด ์ฌ๊ฐํ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
package poly.basic;
// ๋ค์ด์บ์คํ
์ ์๋์ผ๋ก ํ์ง ์๋ ์ด์
public class CastingMain4 {
public static void main(String[] args) {
Parent parent1 = new Child();
Child child1 = (Child) parent1;
child1.childMethod(); // ๋ฌธ์ ์์
Parent parent2 = new Parent();
Child child2 = (Child) parent2; // ๋ฐํ์ ์ค๋ฅ - ClassCastException
child2.childMethod(); // ์คํ ๋ถ๊ฐ
}
}
๋จผ์ new Parent( )๋ก ๋ถ๋ชจ ํ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๋ฉ๋ชจ๋ฆฌ ์์ ์์ ํ์ ์ ์ ํ ์กด์ฌํ์ง ์๋๋ค.
Java์์๋ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ ํ์
์ผ๋ก ๋ค์ด์บ์คํ
ํ๋ ๊ฒฝ์ฐ์ ClassCastException์ด๋ผ๋ ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ๋์์ด ์คํ๋์ง ์๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ค.
๋ฐ๋ผ์ child2.childMethod( ) ์ฝ๋ ์์ฒด๊ฐ ์คํ๋์ง ์๋๋ค.
์ ์บ์คํ ์ด ์์ ํ๊ณ ๋ค์ด์บ์คํ ์ด ์ํํ ์ด์
์
์บ์คํ
์ ๊ฒฝ์ฐ ์ด๋ฐ ๋ฌธ์ ๊ฐ ์ ๋๋ก ๋ฐ์ํ์ง ์๋๋ค. ์๋ํ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ํด๋น ํ์
์ ์์ ๋ถ๋ชจ ํ์
์ ๋ชจ๋ ํจ๊ป ์์ฑ๋๋ค!
๋ฐ๋ผ์ ์๋ก๋ง ํ์
์ ๋ณ๊ฒฝํ๋ ์
์บ์คํ
์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ธ์คํด์ค๊ฐ ๋ชจ๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํญ์ ์์ ํ๋ค. ๊ทธ๋์ ์บ์คํ
์ ์๋ตํ ์ ์๋ค.
๋ฐ๋ฉด์ ๋ค์ด์บ์คํ
์ ๊ฒฝ์ฐ ์ธ์คํด์ค์ ์กด์ฌํ์ง ์๋ ํ์ ํ์
์ผ๋ก ์บ์คํ
ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์๋๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ๋ถ๋ชจ ํ์
์ ๋ชจ๋ ํจ๊ป ์์ฑ๋์ง๋ง ์์ ํ์
์ ์์ฑ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๊ฐ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ธ์งํ๊ณ ์ฌ์ฉํด์ผ ํ๋ค๋ ์๋ฏธ๋ก ๋ช
์์ ์ผ๋ก ์บ์คํ
์ ํด์ฃผ์ด์ผ ํ๋ค.
์ปดํ์ผ ์ค๋ฅ vs ๋ฐํ์ ์ค๋ฅ
์ปดํ์ผ ์ค๋ฅ๋ ๋ณ์๋ช
์คํ, ์๋ชป๋ ํด๋์ค ์ด๋ฆ ์ฌ์ฉ ๋ฑ Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ ์ ๋ฐ์ํ๋ ์ค๋ฅ์ด๋ค. ์ด๋ฐ ์ค๋ฅ๋ IDE์์ ์ฆ์ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ํ๊ณ ์ข์ ์ค๋ฅ์ด๋ค.
๋ฐ๋ฉด์ ๋ฐํ์ ์ค๋ฅ๋ ์ด๋ฆ ๊ทธ๋๋ก ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ์๋ ์์ ์ ๋ฐ์ํ๋ ์ค๋ฅ์ด๋ค. ๋ฐํ์ ์ค๋ฅ๋ ๋งค์ฐ ์ ์ข์ ์ค๋ฅ์ด๋ค. ์๋ํ๋ฉด ๋ณดํต ๊ณ ๊ฐ์ด ํด๋น ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋์ค์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
instanceof
๋คํ์ฑ์์ ์ฐธ์กฐํ ๋ณ์๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ค์ํ ์์์ ๋์์ผ๋ก ์ฐธ์กฐํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฐธ์กฐํ๋ ๋์์ด ๋ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
Parent parent1 = new Parent();
Parent parent2 = new Child();
Parent๋ ์์ ๊ณผ ๊ฐ์ Parent์ ์ธ์คํด์ค๋ ์ฐธ์กฐํ ์ ์๊ณ , ์์ ํ์
์ธ Child์ ์ธ์คํด์ค๋ ์ฐธ์กฐํ ์ ์๋ค.
์ด๋ parent1, parent2 ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ์ธ์คํด์ค์ ํ์
์ ํ์ธํ๊ณ ์ถ๋ค๋ฉด instanceof ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
package poly.basic;
public class CastingMain5 {
public static void main(String[] args) {
Parent parent1 = new Parent();
System.out.println("parent1 ํธ์ถ");
call(parent1);
Parent parent2 = new Child();
System.out.println("parent2 ํธ์ถ");
call(parent2);
}
private static void call(Parent parent) {
parent.parentMethod();
if (parent instanceof Child) {
System.out.println("Child ์ธ์คํด์ค ๋ง์.");
Child child = (Child) parent;
child.childMethod();
} else {
System.out.println("Child ์ธ์คํด์ค ์๋.");
}
}
}
๋คํ์ฑ๊ณผ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ
๋คํ์ฑ์ ์ด๋ฃจ๋ ๋ ํ๋์ ์ค์ํ ํต์ฌ ์ด๋ก ์ ๋ฐ๋ก ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ค.
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์์ ๊ผญ ๊ธฐ์ตํด์ผ ํ ์ ์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๊ฐ ํญ์ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค๋ ์ ์ด๋ค.
๊ทธ๋์ ์ด๋ฆ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ฎ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ฌ์ ์ํ๋ค๋ ๋ป์ ์ค๋ฒ๋ผ์ด๋ฉ์ด๋ค.
๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ์ง์ง ํ์ ๋คํ์ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ๋ํ๋๋ค.
- Parent, Child ๋ชจ๋ value๋ผ๋ ๊ฐ์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฉค๋ฒ ๋ณ์๋ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ง ์๋๋ค.
- Parent, Child ๋ชจ๋ method( )๋ผ๋ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค. Child์์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ค.
- ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ฉ๋๋ค.
Parent ํด๋์ค
package poly.overriding;
public class Parent {
public String value = "parent";
public void method() {
System.out.println("Parent.method");
}
}
Child ํด๋์ค
package poly.overriding;
public class Child extends Parent{
public String value = "child";
@Override
public void method() {
System.out.println("Child.method");
}
}
Main ํด๋์ค
package poly.overriding;
public class OverridingMain {
public static void main(String[] args) {
// ์์ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ
Child child = new Child();
System.out.println("Child -> Child");
System.out.println("value = " + child.value);
child.method();
// ๋ถ๋ชจ ๋ณ์๊ฐ ๋ถ๋ชจ ์ธ์คํด์ค ์ฐธ์กฐ
Parent parent = new Parent();
System.out.println("Parent -> Parent");
System.out.println("value = " + parent.value);
parent.method();
// ๋ถ๋ชจ ๋ณ์๊ฐ ์์ ์ธ์คํด์ค ์ฐธ์กฐ (๋คํ์ ์ฐธ์กฐ)
Parent poly = new Child();
System.out.println("Parent -> Parent");
System.out.println("value = " + poly.value); // ๋ณ์๋ ์ค๋ฒ๋ผ์ด๋ฉ X
poly.method(); // ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ฉ!
}
}
Parent → Child
- ์ด ๋ถ๋ถ์ด ์ค์ํ๋ค.
- poly ๋ณ์๋ Parent ํ์
์ด๋ค. ๋ฐ๋ผ์ poly.value, poly.method( )๋ฅผ ํธ์ถํ๋ฉด ์ธ์คํด์ค์ Parent ํ์
์์ ๊ธฐ๋ฅ์ ์ฐพ์์ ์คํํ๋ค.
- poly.value : Parent ํ์ ์ ์๋ value ๊ฐ์ ์ฝ๋๋ค.
- poly.method( ) : Parent ํ์
์ ์๋ method( )๋ฅผ ์คํํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ํ์ ํ์
์ธ Child.method( )๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ด ์๋ค. ์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๋ ํญ์ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
๋ฐ๋ผ์ Parent.method( )๊ฐ ์๋๋ผ Child.method( )๊ฐ ์คํ๋๋ค.
์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๋ ํญ์ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค. ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ถ๋ชจ ํ์
์์ ์ ์ํ ๊ธฐ๋ฅ์ ์์ ํ์
์์ ์ฌ์ ์ํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์์์์๋ ์ค๋ฒ๋ผ์ด๋ฉ ํ๊ณ ์์์์๋ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ์ ํ๋ฉด ์์์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฉ์๋๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค. ๋ ํ์ ์์์ ์ค๋ฒ๋ผ์ด๋ฉ ๋ ๋ฉ์๋๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ ๊ฒ์ด๋ค.
๋คํ์ฑ์ ์ด๋ฃจ๋ ํต์ฌ ์ด๋ก ์ธ ๋คํ์ ์ฐธ์กฐ์ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๋ํด ๋ฐฐ์ ๋ค.
- ๋คํ์ ์ฐธ์กฐ : ํ๋์ ๋ณ์ ํ์ ์ผ๋ก ๋ค์ํ ์์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
- ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ : ๊ธฐ์กด ๊ธฐ๋ฅ์ ํ์ ํ์ ์์ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ ์ํ๋ค.
'Today I Learned(TIL) > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Java ๊ธฐ๋ณธํธ ๊ฐ์_์์ (0) | 2024.12.01 |
---|---|
Java ๊ธฐ๋ณธํธ ๊ฐ์_final (2) | 2024.11.28 |
Java ๊ธฐ๋ณธํธ ๊ฐ์_์ ๊ทผ ์ ์ด์ (1) | 2024.11.28 |
Java ๊ธฐ๋ณธํธ ๊ฐ์_ํจํค์ง (0) | 2024.11.26 |
Java ๊ธฐ๋ณธํธ ๊ฐ์_์์ฑ์ (0) | 2024.11.26 |