
1. ์ถ์ํด๋์ค์ ์ถ์ ๋ฉ์๋๋?
1.1 ์ถ์ ํด๋์ค : abstractํค์๋๋ก ์ ์ธ๋ ํด๋์ค์ด๋ฉฐ, ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์๋ค.
1.2 ์ถ์ ๋ฉ์๋ : ๋ฉ์๋ ๋ชธ์ฒด(๋ฐ๋)๊ฐ ์๋ ๋ฉ์๋๋ก, ์ ์ธ๋ง ๋์ด ์๊ณ ๊ตฌํ์ ์์ ํด๋์ค์์ ์ด๋ฃจ์ด์ง๋ค.
2. ๊ฐ์๋ฅผ ํตํด ์๊ฒ๋ ์ฃผ์ ๊ฐ๋
2.1 ์ถ์ ํด๋์ค์ ๋ฉ์๋ ๋ฐ๋๊ฐ ์๋ ๋ฉ์๋๋ ํฌํจ๋ ์ ์๋ค.
์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฟ๋ง ์๋๋ผ ์ผ๋ฐ ๋ฉ์๋๋ ํฌํจํ ์ ์๋ค.
์ผ๋ฐ ๋ฉ์๋๋ ๋ฉ์๋ ๋ฐ๋๊ฐ ์กด์ฌํ๋ฉฐ ๋ฐ๋์ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ ํ ํ์๋ ์๋ค.
2.2 ์ถ์ ํด๋์ค์ ์ถ์ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ฉ์ด ํ์.
์ถ์ ๋ฉ์๋๋ ์์ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํ๋ค.
๋ง์ฝ ๊ตฌํํ์ง ์์ผ๋ฉด ์์ ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๋์ด์ผ ํ๋ค.
2.3 ์ถ์ ๋ฉ์๋๋ ํธ์ถ ๋ถ๊ฐ
์ถ์ ๋ฉ์๋๋ ๋ชธ์ฒด๊ฐ ์์ผ๋ฏ๋ก ํธ์ถ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ด๋ฅผ ๋ง๊ธฐ ์ํด ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ ํด๋์ค์ abstract๋ฅผ ์ ์ธํ์ฌ ๊ฐ์ฒด ์์ฑ์ ์ฐจ๋จํ๋ค.
2.4 ์ถ์ ํด๋์ค๋ ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ
Animal a = new Animal();์ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
์ถ์ ํด๋์ค๋ ์ค์ฒด๊ฐ ์๋ ๊ฐ๋ ์ ํด๋์ค์ด๋ฉฐ, ์์ ํด๋์ค์์ ๊ตฌ์ฒดํ๋์ด์ผ ํ๋ค.
2.5 ์์ ํด๋์ค์ ์ค๋ฒ๋ผ์ด๋ฉ
์ถ์ ๋ฉ์๋๊ฐ ํฌํจ๋ ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ ์์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉ ํด์ผํ๋ค.
์ค๋ฒ๋ผ์ด๋ฉํ์ง ์์ผ๋ฉด ์์ ํด๋์ค๋ ์ถ์ ํด๋์ค๋ก ์ ์ธํด์ผ ํ๋ค.
2.6 ์์: public abstract void ();
๋ฉ์๋ ๋ฐ๋๊ฐ ์๋ sound() ๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ก ์ ์ธ๋๋ค. ์ด๋ฅผ ๊ตฌํํ์ง ์์ผ๋ฉด ์์ ํด๋์ค์์ ์ฌ์ฉํ ์ ์๋ค.
2.7 ์ถ์ ํด๋์ค์ ๋ชฉ์
์์์ ๊ฐ์ ํ์ฌ ์์ ํด๋์ค์์ ํน์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๊ฒ ๋ง๋ฆ.
์ค์ฒดํ๋์ง ์์ ๊ฐ๋ ์ ๋ชจ๋ธ๋งํ๋๋ฐ ์ฌ์ฉ๋จ
<์ค์ต ์ฝ๋>
// ์ถ์ ํด๋์ค ์ ์ธ
abstract class Animal {
// ์ถ์ ๋ฉ์๋
public abstract void sound();
// ์ผ๋ฐ ๋ฉ์๋
public void eat() {
System.out.println("This animal eats food.");
}
}
// ์์ ํด๋์ค
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Bark");
}
}
public class Main {
public static void main(String[] args) {
// Animal a = new Animal(); // ์๋ฌ: ์ถ์ ํด๋์ค๋ ์ธ์คํด์คํํ ์ ์์
Animal dog = new Dog(); // ์
์บ์คํ
dog.sound(); // "Bark" ์ถ๋ ฅ
dog.eat(); // "This animal eats food." ์ถ๋ ฅ
}
}
3. ์ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์๊ฒ abstract ํค์๋๋ก ๋ง๋๊ฑธ๊น?
3.1 ์ถ์ ํด๋์ค์ ๋ชฉ์
์ถ์ ํด๋์ค๋ ์ค์ฒดํ๋ ์ ์๋ ๊ณตํต๋ ๊ฐ๋ ์ด๋ ๊ธฐ๋ณธ ์ค๊ณ๋๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
์ถ์์ ๊ฐ๋ ์ด๋, ๊ตฌ์ฒด์ ์ธ ๋๋ฌผ, ์ฐจ๋, ๋ํ์ด ์๋๋ผ, ์ด๋ค์ ๊ณตํต์ ์ธ ์์ฑ๊ณผ ํ๋๋ง์ ์ ์ํ๋ค.
์์๊ณผ ๊ตฌํ ๊ฐ์ ํ๋,์ถ์ ํด๋์ค๋ ์์ ํด๋์ค์์ ๊ณตํต๋ ๊ธฐ๋ฅ์ ์์๋ฐ๊ฒ ํ๊ณ , ํน์ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ๊ตฌํํ๋๋ก ๊ฐ์ ํ๋ค.
๋ฐ๋ผ์, ์ถ์ ํด๋์ค ์์ฒด๋ ์์ ํ์ง ์์ ํด๋์ค์ด๋ค. ์ค์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ธ์คํด์คํํ๋ ๊ฒ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง์ง ์๋ค.
3.2 ๊ฐ์ฒด ์์ฑ์ด ๋ถ๊ฐ๋ฅํด์ผ ํ๋ ์ด์
3.2.1 ๊ตฌ์ฒด์ ์ธ ํ๋์ด ์ ์๋์ง ์์.
์ถ์ํด๋์ค๋ ํ๋ ์ด์์ ์ถ์ ๋ฉ์๋๋ฅผ ํฌํจํ ์ ์๋ค. ์ถ์ ๋ฉ์๋๋ ๋ฉ์๋ ๋ฐ๋๊ฐ ์์ผ๋ฏ๋ก, ํด๋น ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ฅผ ํธ์ถํ ์ ์๋ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
abstract class Animal {
public abstract void sound(); // ๊ตฌํ๋์ง ์์ ๋ฉ์๋
}
Animal a = new Animal(); // ์๋ฌ: ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด sound()๋ฅผ ํธ์ถํ ๋ฐฉ๋ฒ์ด ์์
3.2.2 ๋ถ์์ ํ ์ค๊ณ๋ก ์ธํด ์ค์ฒดํํ ์ ์์
์ถ์ ํด๋์ค๋ ๊ตฌ์ฒด์ ์ธ ๋์์ ์ ์ํ์ง ์์ผ๋ฉฐ, ์์ ํด๋์ค์์ ์ด๋ฅผ ๊ตฌ์ฒดํํ๋๋ก ์ค๊ณ๋์๋ค.
๋ฐ๋ผ์ ์ถ์ ํด๋์ค ์์ฒด๊ฐ ์ธ์คํด์คํ๋๋ฉด, ํด๋์ค ์ค๊ณ์ ๋ณธ์ง์ด ๊นจ์ง๋ค.
3.2.3 ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค ๋น๊ต
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๋น์ทํ ์ฉ๋๋ก ์ฌ์ฉ๋์ง๋ง,
์ถ์ ํด๋์ค๋ ์ผ๋ถ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ํฌํจํ ์ ์๋ ๋ฐ๋ฉด, ์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๋ฉ์๋๊ฐ ๊ตฌํ๋์ง ์์ ํํ(์ถ์ ๋ฉ์๋)์ด๋ค.
- ์ถ์ ํด๋์ค : ๊ณตํต๋ ๊ธฐ๋ฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ค๊ณ๋.
- ์ธํฐํ์ด์ค : ํด๋์ค ๊ฐ์ ๊ณ์ฝ์ ์ ์ํ๋ฉฐ, ๋คํ์ฑ์ ๊ทน๋ํํ๋ค.
<์๋ชป๋ ์ฌ์ฉ>
abstract class Animal {
public abstract void sound();
}
Animal a = new Animal(); // ์๋ฌ: ์ถ์ ํด๋์ค๋ ์ง์ ์ธ์คํด์คํํ ์ ์์
a.sound(); // ํธ์ถํ ์ ์๋ ๋ฉ์๋
<์ฌ๋ฐ๋ฅธ ์ฌ์ฉ>
abstract class Animal {
public abstract void sound(); // ์ถ์ ๋ฉ์๋
public void eat() {
System.out.println("This animal eats food.");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Bark");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog(); // ์
์บ์คํ
dog.sound(); // "Bark"
Animal cat = new Cat(); // ์
์บ์คํ
cat.sound(); // "Meow"
}
}
4. ์ธํฐํ์ด์ค
4.1 ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ถ์ ๋ฉ์๋
์ธํฐํ์ด์ค ๋ด ๋ชจ๋ ๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ์ ๋ฉ์๋์ด๋ค. (๊ตฌํ์ด ์๋ค.)
Java 8 ์ดํ์๋ default ๋ฉ์๋๋ฅผ ํตํด ์ธํฐํ์ด์ค์๋ ๋ฉ์๋ ๊ตฌํ์ด ๊ฐ๋ฅํด์ก์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก๋ ์ถ์ ๋ฉ์๋๋ง ํฌํจํ๋ค.
4.2 ๋ค์ค ์์ ์ง์
Java์์ ํด๋์ค๋ ํ๋์ ๋ถ๋ชจ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์ง๋ง, ์ธํฐํ์ด์ค๋ ์ฌ๋ฌ ๊ฐ๋ฅผ ๊ตฌํ(implements)ํ ์ ์๋ค.
๋คํ์ฑ์ ๊ทน๋ํํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์กฐํฉํ๋ ๋ฐ ์ ์ฉํ๋ค.
4.3 ๊ฐ์ฒด ์์ฑ ๋ถ๊ฐ
์ธํฐํ์ด์ค๋ ์ถ์์ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ ์ ์๋ค.
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌ์ฒด ํด๋์ค์ ๊ฐ์ฒด๋ง ์์ฑ ๊ฐ๋ฅํ๋ค.
4.4 ์ธํฐํ์ด์ค ๊ตฌํ
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ implements ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค.
์ธํฐํ์ด์ค์ ์ ์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
interface Animal {
void sound(); // ์ถ์ ๋ฉ์๋
default void eat() { // Java 8 ์ดํ default ๋ฉ์๋
System.out.println("This animal eats food.");
}
}
class Dog implements Animal {
@Override
public void sound() {
System.out.println("Bark");
}
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // ์ถ๋ ฅ: Bark
dog.eat(); // ์ถ๋ ฅ: This animal eats food.
Animal cat = new Cat();
cat.sound(); // ์ถ๋ ฅ: Meow
}
}
5. ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ฐจ์ด์
