๐ ์ฑ ์๊ฐํ๊ธฐ
๋ด๊ฐ ์ฌ์ฉํ ์๋ฐ์์ ์ ๋ณต ์ฑ
๋งํฌ!
ใด ๊น๋ํ ์ง์, ์ด์ง์คํผ๋ธ๋ฆฌ์ฑ
์ด ์ฑ ์ ๊ณ ๋ฅด๊ฒ ๋ ์ด์ ๋ ์น๊ตฌ์ ์ถ์ฒ์ด์๋ค. ๊ต์ฅํ ๊ผผ๊ผผํ๊ฒ ์ ํ์์ด ์ดํดํ๊ธฐ ์ฝ๋ค๋ ์ด์ ๋ก ์น๊ตฌ๋ ์ด ์ฑ ์ ๊ณจ๋๋ค๊ณ ํ๋ค. ๋๋ ๊ทธ๋์ ๊ทธ๋ฅ ๋ฐ๋ผ์๋ค. ์ค์ ๋ก ์ฑ ์ ์ดํด๋ณด๋ ๊ต์ฅํ ๊ผผ๊ผผํ๊ฒ ์ ๋ฆฌ๋์ด์๋ค. ๋ค๋ฅธ ์ฑ ์ ๋ณธ ์ ์ด ์์ด ๋น๊ต๊ฐ ๋ถ๊ฐํ์ง๋ง, ๋ด ์๊ฐ์ผ๋ก ์ฒ์ ์๋ฐ๋ฅผ ๊ณต๋ถํ๋ค๋ฉด ์ด ์ฑ ์ ๊ฐ์ง๊ณ ์ถฉ๋ถํ ๋ฐ๋ผ๊ฐ ์ ์์ ๋ฏ ํ๋ค. ๋ชจ๋๋ค ํ์ดํ !!
๐ฐ
โ๏ธ ์์_ 307p
• ์์
: ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ(ํ๋, ๋ฉ์๋, ์ด๋ ํด๋์ค)๋ฅผ ๋ด๋ ค๋ฐ์ ์์ ํด๋์ค ๋ด๋ถ์ ํฌํจ์ํค๋ ์๋ฐ ๋ฌธ๋ฒ ์์
class Human {
String name;
int age;
void eat() {}
void sleep() {}
}
class Student extends Human {
int studentID;
void goToSchool() {}
}
Human h = new Human();
h.name = "๊น์๋ฐ";
h.age = 1;
h.eat;
Student s = new Student();
s.name = "๊น์์ ";
s.age = 2;
s.studentID = 12;
ํด๋์ค๋ฅผ ์์ํ ๋๋ extends ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํด๋์ค๋ช ๋ค์์ extends ๋ถ๋ชจ ํด๋์ค๋ช (extends Human)์ผ๋ก ํ๊ธฐํ๋ฉด ๋๋ค. Student ํด๋์ค๋ Human ํด๋์ค์ ์๋ ํ๋์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑํ๋ฉด ๋๋๋ฐ, ์ด๋ฅผ ํตํด ์ฝ๋์ ์ค๋ณต์ฑ์ ์ ๊ฑฐํ๋ ์ฅ์ ์ด ์๋ค. ๋ํ 'ํ์์ ํ์์ด๋ค.' ๋ง๊ณ 'ํ์์ ์ฌ๋์ด๋ค.' ๋ผ๋ ๋ง์ด ์ถ๊ฐ๋๋ฉด์ ๋คํ์ ํํ์ด ๊ฐ๋ฅํด์ง๋ค. ๋คํ์ฑ์ด๋, 1๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ง ๋ชจ์์ผ๋ก ํํํ๋ ๊ฒ์ด๋ค. '์ฌ๋์ ํ์์ด๋ค.' ๋ผ๋ ๋ง์ ์ดํด๋ณด๋ฉด ์ด๋ ์ณ์ง ์๋ค๋ ๊ฑธ ์ ์ ์๋ค. ์์์ด ๋คํ์ฑ์ด๋ ์ฅ์ ์ ๊ฐ์ง์ง๋ง '์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๋ค.' ๋ผ๋ ๋ง์ด ์ฑ๋ฆฝ๋์ง ์์ ์ ์์ผ๋ ์ ์ํด์ผํ๋ค.
Student ํด๋์ค๋ ํ๋ 3๊ฐ, ๋ฉ์๋ 3๊ฐ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
Q. ์ฝ๋์ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ์์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ผ๊น?
A. ๊ทธ๊ฒ์ ์๋๋ค. ์ฝ๋์ ์ค๋ณต์ ์ ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ์์์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ๋ก์ ํธ๋ฅผ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์๋ค. ์คํ๋ ค ๊ฐ๋จํ ์ฝ๋์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ ํด๋์ค์ ๋ฃ์ด ์์ฑํ๋ ๊ฒ์ด ํจ์จ์ ์ด๊ณ ๋น ๋ฅผ ์ ์๋ค.
• ๋ค์ค ์์
class B {
int data = 3;
}
class C {
int data = 4
}
class A extends B, C {
...
}
A a = new A();
System.print.out(a.data);
์๋ฐ๋ ๋ค์ค์์์ ์ง์ํ์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ํด๋์ค B์ ํด๋์ค C์ data ํ๋๋ฅผ ํฌํจํ๊ณ ์์ผ๋ A ์ ์ฅ์์ ์ด๋ data๋ฅผ ๊ฐ์ ธ์์ผํ ์ง ํผ๋ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ ๋ชจํธ์ฑ์ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ ๋ค์ค์์์ ํ์ฉํ์ง ์๋๋ค.
• ์์ํ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
class A {
int m;
void abc() {}
}
class B extends A {
int n;
void bcd() {}
}
B b = new B();
์์ ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค๋ JVM์ ์ํด ๋ก๋ฉ๋๋๋ฐ, ์ด๊ฒ์ ํด๋์ค ๋ก๋ฉ์ด๋ผ๊ณ ํ๋ค. ์ด์ ํด๋์ค๊ฐ ๋ก๋ฉ๋๋ฉด ๋ฉ์๋ ์์ญ์ ํด๋์ค์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. ๊ทธ ํ ์ค์ ๊ฐ์ฒด๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋๋ค. ์ฒ์์ ๋ถ๋ชจ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ทธ ํ ์์ ํด๋์ค์์ ์ถ๊ฐํ ํ๋์ ๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ์ถ๊ฐ๋๋ค. ์ฆ, ์์ ํด๋์ค ๊ฐ์ฒด์ ๋ด๋ถ์ ๋ถ๋ชจ ํด๋์ค ๊ฐ์ฒด๊ฐ ํฌํจ๋๋ค.
์ฐธ์กฐ ๋ณ์ b๋ B ํ์ ์ผ๋ก ์ ์ธ๋๋ค. ๊ทธ๋ ๊ธฐ์ B ํ์ ๊ฐ์ฒด๋ง์ ๊ฐ๋ฆฌํฌ ์ ์๋๋ฐ, ๊ฐ์ฒด B ์์๋ ๋ถ๋ชจ ํด๋์ค๋ ํจ๊ป ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ํด๋์ค ๊ฐ์ฒด์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
• ์์ฑ์์ ์์ ์ฌ๋ถ
class A {
A() {
}
}
class B extends A {
}
์์ฑ์๋ ์์ ํด๋์ค์ธ B ํด๋์ค์ ์์๋์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ์์ฑ์๋ฅผ ํด๋์ค B๊ฐ ์์ํ๊ฒ๋๋ฉด ํด๋์ค๋ช ๊ณผ ์์ฑ์๋ช ์ด ๋ฌ๋ผ์ง๋ฉด์ ์์ฑ์๊ฐ ๋ ์ ์๋ค. ๋ฉ์๋๊ฐ ๋๊ธฐ ์ํด์ ๋ฆฌํด ํ์ ์ ์ ํด์ผํ๋๋ฐ, ๋ฆฌํด ํ์ ๋ ์์ด์ ๋ฉ์๋๊ฐ ๋ ์ ์๋ค. ๊ฒฐ๊ตญ ์์ ํด๋์ค๊ฐ ์์ฑ์๋ฅผ ๋ฐ๊ฒ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ๋๋ค.
โ๏ธ ์ ์บ์คํ ๊ณผ ๋ค์ด์บ์คํ _ 319p
• ์บ์คํ
: ๋ฑํธ๋ฅผ ์ค์ฌ์ผ๋ก ํญ์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ์๋ฃํ์ด ์ผ์นํด์ผํ๋๋ฐ, ์๋ฃํ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ํ์ ์ ๋ณํํด์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
• ์ ์บ์คํ
: ๋ฒ์๊ฐ ์ข์ ์ชฝ์์ ๋์ ์ชฝ์ผ๋ก ์บ์คํ ๋๋ค. (์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค๋ก ๋ณํ)
class A {}
class B extends A {}
class C extends B {}
B b1 = new B();
A a1 = b1;
C c2 = new C();
B b2 = (B) c2;
์ ์บ์คํ ์ ์ปดํ์ผ๋ฌ๊ฐ ์๋์ผ๋ก ํ์ ์ ๋ณํํด์ค๋ค. ๊ทธ๋์ A a1 = (A) b1;์ผ๋ก ์ ์ง ์์๋ (A)๋ฅผ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ถ๊ฐํ๋ค. ํด๋์ค A๋ ํด๋์ค B๋ฅผ ์์ํ๋ค. ํด๋์ค B๋ ํด๋์ค C๋ฅผ ์์ํ๋ค. ๊ทธ๋ฌ๋ฉด b1์ Aํ์ ์ผ๋ก ๋ณํํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ C๋ B์ A๋ก ํ์ ์ ๋ณํํ ์ ์๋ค.
์ข ๋ ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด A ํด๋์ค๊ฐ ์ฌ๋, B ํด๋์ค๊ฐ ํ์์ด๋ผ๊ณ ๊ฐ์ ํ๋ค๋ฉด 'ํ์์ ์ฌ๋์ด๋ค.'๋ ์ธ์ ๋ ๋ง๋ ๋ง์ด๋ ์ ์บ์คํ ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
• ๋ค์ด์บ์คํ
: ๋ฒ์๊ฐ ๋์ ์ชฝ์์ ์ข์ ์ชฝ์ผ๋ก ์บ์คํ ๋๋ค. (๋ถ๋ชจ ํด๋์ค์์ ์์ ํด๋์ค๋ก ๋ณํ)
class A {}
class B extends A {}
class C extends B {}
A a1 = new A();
B b1 = (B) a1;
A a2 = new B();
B b2 = (B) a2;
C c2 = (C) a2;
Aํ์ ์ธ ์์ฑ์ a1์ Bํ์ ์ผ๋ก ๋ค์ด ์บ์คํ ๋ ์ ์๋ค. ์๋ํ๋ฉด ํด๋์ค A๋ ํด๋์ค B๋ C๋ฅผ ์์ํ๊ณ ์์ง ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก B b1= (B) a1;์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์์ฑ์ a2๋ฅผ ์ดํด๋ณด์. ์ฌ๊ธฐ์ ์ฐธ์กฐ ๋ณ์ ํ์ ๊ณผ ์ค์ ๊ฐ์ฒด ํ์ ์ด ๋์ผํ์ง ์๋ค. ์ฐธ์กฐ ๋ณ์ ํ์ ์ A๊ฐ ๋๊ณ ์ค์ ๊ฐ์ฒด ํ์ ์ B๊ฐ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ก ์ดํด๋ณด๋ฉด B๋ A ํด๋์ค๋ฅผ ์์ํ๋ฏ๋ก ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ฏธ Bํ์ ์์ Aํ์ ์ด ์๋ ํํ์ผ ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ ์ค์ ๊ฐ์ฒด ํ์ ์ B๊ฐ ๋๋ฉด์, a2๋ B ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก a2๋ Bํ์ ์ผ๋ก ๋ค์ด ์บ์คํ ์ด ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฌ๋ฉด c2๋ฅผ ์ดํด๋ณด์. ํด๋์ค B๋ ํด๋์ค C๋ฅผ ์์ํ์ง ์๋๋ค. ํ ๋ฉ๋ชจ๋ฆฌ์ Cํ์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์๋๋ค. (๋ง๋ค์ด์ง ์ ์ด ์๊ธฐ ๋๋ฌธ์) ๊ทธ๋ ๊ธฐ์ ClassCastException์ ๋ฐ์์ํจ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ค์ด์บ์คํ ์ ์ฐธ์กฐ ๋ณ์ ํ์ ๋ณด๋ค ์ค์ ๊ฐ์ฒด ํ์ ์ ์ค์ ์ ๋๋ค. ์ค์ ๊ฐ์ฒด ํ์ ์ด ์ด๋ ํด๋์ค๋ฅผ ์์ํ๋์ง์ ๋ฐ๋ผ ๋ค์ด์บ์คํ ์ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค.
Q. ์ฐธ์กฐ ๋ณ์ ํ์ ๊ณผ ์ค์ ๊ฐ์ฒด ํ์ ์ ์ฐจ์ด์ ์?
A. ์ฐธ์กฐ ๋ณ์ ํ์ ์ ์ปดํ์ผ ์์ ์ ์ํฅ์ ๋ฏธ์น๋ค. ์ฐธ์กฐ ๋ณ์ ํ์ ์ ๋ฐ๋ผ ํธ์ถ ๊ฐ๋ฅํ ๋ฉ์๋์ ์ ๊ทผ ๊ฐ๋ฅํ ํ๋์ ์ ํ์ด ์๊ธฐ๋๋ฐ, ์ ์ ๋ฐ์ธ๋ฉ์ผ๋ก ๋์ํ๋ค. ์์ ํ์ ์ผ๋ก ์ ์ธํ ๊ฒฝ์ฐ ์์ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์๋ค. (๋คํ์ฑ)
new ํค์๋๋ฅผ ํตํด ์์ฑ๋ ๊ฐ์ฒด ํ์ ์ผ๋ก ๋ฐํ์ ์์ ์ ์ํฅ์ ๋ฏธ์น๋ค. ์ค์ ๊ฐ์ฒด ํ์ ์ ๋ฐ๋ผ ๋์์ ์ํฅ์ ๋ฏธ์น๋๋ฐ ๋์ ๋ฐ์ธ๋ฉ์ผ๋ก ๋์ํ๋ค. (์บ์คํ )
โ๏ธ ํ์ ์ ๋ฐ๋ฅธ ์ฐจ์ด์ _323p (๋ด์ฉ ๋ค๋ฆ)
• ์ค์ ๊ฐ์ฒด ํ์
: ๋ฐํ์ ์์ ์ ์ํฅ์ ์ฃผ๋ฉฐ, ๋์ ๋ฐ์ธ๋ฉ์ผ๋ก ๋์ํ๋ค.
• Cat ํ์ , Cat ์์ฑ์
interface Animal {
void sound();
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
public void scratch() {
System.out.println("Cat is scratching");
}
}
public class Main {
public static void main(String[] args) {
Cat a2 = new Cat();
a2.sound();
a2.scratch();
}
}
์์ฑ์ a2๋ ์ฐธ์กฐ ๋ณ์ ํ์ ๊ณผ ์ค์ ๊ฐ์ฒด ํ์ ์ด Cat์ผ๋ก ๋์ผํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ a2๋ Cat์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค. ๊ทธ๋ ๊ธฐ์ sound ๊ฐ์ "Meow"๊ฐ ๋ ๊ฒ์ด๋ค. scratch๋ ์ ์คํ๋์ด "Cat is scratching"์ผ๋ก ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
• Animal ํ์ , Cat ์์ฑ์
interface Animal {
void sound();
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
public void scratch() {
System.out.println("Cat is scratching");
}
}
public class Main {
public static void main(String[] args) {
Animal a2 = new Cat();
a2.sound();
a2.scratch();
}
}
์ค๋ฒ๋ผ์ด๋ฉ๋ ๋ฉ์๋๋ฅผ ์ดํด๋ณผ ๊ฒ์ด๋ค. ์ธํฐํ์ด์ค์ธ Animal์ ์์ํ๋ Cat ํด๋์ค๋ sound( ) ๋ฉ์๋๋ฅผ ๊ฐ์ก์ง๋ง, Animal ์ธํฐํ์ด์ค๋ ๋๊ฐ์ด sound( ) ๋ฉ์๋๊ฐ ์๋ค.
์ฐธ์กฐ ๋ณ์ ํ์ ์ Animal์ด๊ณ ์ค์ ๊ฐ์ฒด ํ์ ์ Cat์ธ ์์ฑ์ a2๋ sound( )๋ฉ์๋์ scratch( )๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ ํ๋ค. ์ด๋ sound ๋ฉ์๋๋ ์ค๋ฒ๋ผ์ด๋ฉ์ด ๋์ด Cat์ sound ๋ฉ์๋๊ฐ ํธ์ถ๋์ด (๋์ ๋ฐ์ธ๋ฉ) "Meow"๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ Animal ํด๋์ค์๋ scratch ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์์๋ค. ๊ทธ๋ ๊ธฐ์ Animal ํ์ ์ธ a2๋ scratch ๋ฉ์๋๋ ๋ถ๋ฌ์ฌ ์ ์๋ค.
• ์ฐธ์กฐ ๋ณ์ ํ์
: ์ปดํ์ผ ์์ ์ ์ํฅ์ ์ฃผ๋ฉฐ, ์ ์ ๋ฐ์ธ๋ฉ์ผ๋ก ๋์ํ๋ค.
interface Animal {
void sound();
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
public void scratch() {
System.out.println("Cat is scratching");
}
}
public class Main {
public static void main(String[] args) {
Animal a2 = new Cat();
a2.sound();
Cat a = (Cat) a2;
a.scratch();
}
}
์์ ์ฝ๋์์ a2.scratch๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ํ๊ธฐ ์ํด์๋ ์์ฑ์ a2๋ฅผ ๋ค์ด์บ์คํ ํด์ฃผ๋ฉด ๋๋ค. a2๊ฐ Animal ํ์ ์ ๊ฐ์ง๊ณ ์์ด์ Animal์ ์๋ ๋ฉ์๋๋ง ์คํ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ฉด a2๋ฅผ Cat ํ์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. ์ฐธ์กฐ ๋ณ์ ํ์ ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ๋ค์ด์บ์คํ ์ ํด์คฌ๋ค. ๊ทธ๋ฌ๋ฉด scratch ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธ instanceof_ 326p
• instanceof
: ์บ์คํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ๋ถ๋ฆฌ์ธ ํ์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
C c = new C();
System.out.println(c instanceof A);
[ ์ฐธ์กฐ ๋ณ์ instanceof ํ์ ] ํ์์ผ๋ก ์ฐ์ด๋ฉฐ, ์บ์คํ ์ด ๊ฐ๋ฅํ๋ฉด true๋ก ๋ถ๊ฐ๋ฅํ๋ฉด false๋ก ํ์ธํ ์ ์๋ค. instanceof ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ด๊ณ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ์์ฑ์๋ฅผ ์ง์ ํ์ธํ์ง ์๊ณ ๋ ์บ์คํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.