๐ ์ถ์
์ฌ์ ์ ์๋ฏธ์ ์ถ์(abstract)์ ์ค์ฒด ๊ฐ์ ๊ณตํต๋๋ ํน์ฑ์ ์ถ์ถํ ๊ฒ
์ถ์ ํด๋์ค
๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ ํด๋์ค๋ฅผ ์ค์ฒด ํด๋์ค๋ผ๊ณ ํ๋ค๋ฉด,
์ด๋ฐ ํด๋์ค๋ค์ ๊ณตํต์ ์ธ `ํ๋`๋ `๋ฉ์๋`๋ฅผ ์ถ์ถํด์ ์ ์ธํ ํด๋์ค๋ฅผ ์ถ์ ํด๋์ค๋ผ๊ณ ํจ
์์
์, ๊ณค์ถฉ, ๋ฌผ๊ณ ๊ธฐ๋ ๋๋ฌผ์ด๋ผ๋ ๊ณตํต์ ์ธ ํน์ฑ์ ๊ฐ์ง
์ค์ฒด ํด๋์ค = ์, ๊ณค์ถฉ, ๋ฌผ๊ณ ๊ธฐ
์ถ์ ํด๋์ค = ๋๋ฌผ
์ถ์ ํด๋์ค๋ `new ์ฐ์ฐ์`๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ ์ ์๋ค.
์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ด์ โ
1. ๊ณตํต ๊ธฐ๋ฅ์ ๋ฌถ์ด์ ์ฝ๋ ์ค๋ณต ๋ฐฉ์ง
- ์ฌ๋ฌ ์์ ํด๋์ค์ ๊ณตํต๋ ํ๋๋ ๋ฉ์๋๋ฅผ ์ถ์ ํด๋์ค์ ์ ์ํด์, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์.
abstract class Animal {
String name;
void breathe() {
System.out.println("์จ์ ์ฐ๋ค");
}
abstract void sound(); // ๊ณตํต ๊ธฐ๋ฅ์ด์ง๋ง ๋์ ๋ฐฉ์์ ๋ค๋ฆ
}
→ breathe()๋ ๋ชจ๋ ๋๋ฌผ์ด ๊ณต์ ํ๋๊น ์ถ์ ํด๋์ค์์ ๊ตฌํ,
→ sound()๋ ๋๋ฌผ๋ง๋ค ๋ค๋ฅด๋๊น ์ถ์ ๋ฉ์๋๋ก ์ ์ธํด์ ์์์ด ๊ตฌํํ๊ฒ ํจ.
2. ์์ ํด๋์ค๊ฐ ๋ฐ๋์ ๊ตฌํํด์ผ ํ ๋ฉ์๋ ๊ฐ์
- ์ถ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ฉด, ์์ ํด๋์ค๋ ๊ทธ ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํด.
→ ํต์ผ๋ ์ธํฐํ์ด์ค ์ ๊ณต์ด ๊ฐ๋ฅํด์ง๊ณ , ์ค์๋ก ๋น ๋จ๋ฆด ๊ฑฑ์ ์ด ์์ด์ง.
abstract class Animal {
abstract void sound(); // ๋ฌด์กฐ๊ฑด ์ค๋ฒ๋ผ์ด๋ฉํด์ผ ํจ
}
3. ๊ฐ์ฒด ์์ฑ์ ๋ง๊ณ ์ค๊ณ ์ฉ๋๋ก๋ง ์ฌ์ฉ
- ์ถ์ ํด๋์ค๋ ์ง์ ๊ฐ์ฒด๋ก ๋ง๋ค ์ ์์ → ์ค์ง `์์ ์ ์ฉ`
- ์ฆ, ์ค๊ณ๋์ฒ๋ผ "๊ณตํต ๊ท๊ฒฉ"๋ง ์ ๊ณตํ๊ณ , ์ค์ ๋์์ ์์์ด ์ฑ์๋ฃ๋ ๊ตฌ์กฐ
Animal a = new Animal(); // โ ์๋ฌ! ์ถ์ ํด๋์ค๋ ์ธ์คํด์คํ ๋ถ๊ฐ
4. ์ธํฐํ์ด์ค๋ณด๋ค ์ ์ฐํ ์ ํ์ง
- ์๋ฐ๋ ๋ค์ค ์์์ด ์ ๋๋๊น, ํด๋์ค๋ ํ๋๋ฐ์ ์์ ๋ชป ํจ.
- ํ์ง๋ง ์ธํฐํ์ด์ค๋ ๋ค์ค ๊ตฌํ์ด ๊ฐ๋ฅํ๊ณ , ์ถ์ ํด๋์ค๋ ์์๋ง ๊ฐ๋ฅํจ.
- ์ถ์ ํด๋์ค๋ ํ๋, ์์ฑ์, ์ผ๋ฐ ๋ฉ์๋๊น์ง ํฌํจํ ์ ์์ด์, ๊ณตํต ๊ตฌํ ๋ก์ง์ด ๋ง์ ๊ฒฝ์ฐ ์ธํฐํ์ด์ค๋ณด๋ค ์ ๋ฆฌํจ.
๋ชฉ์ | ์ค๋ช |
๊ณตํต ๊ธฐ๋ฅ ์ ์ | ์์ ํด๋์ค์ ๊ณตํต๋ ์ฝ๋ ๋ฌถ๊ธฐ |
๋ฉ์๋ ๊ตฌํ ๊ฐ์ | ์์ ํด๋์ค๊ฐ ๋ฐ๋์ ์ค๋ฒ๋ผ์ด๋ฉํ๊ฒ ํจ |
์ค๊ณ์ฉ ํด๋์ค | ์ง์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ์ง, ์ค๊ณ๋๋ก๋ง ์ฌ์ฉ |
์ธํฐํ์ด์ค๋ณด๋ค ์ค์ฉ์ ์ธ ๊ฒฝ์ฐ | ํ๋๋ ๊ตฌํ ๋ฉ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ ์ ํฉ |
Q. ์ถ์ ํด๋์ค๊ฐ ์ถ์ ํด๋์ค๋ฅผ ์์ํ ์ ์์๊น?
A. ์ถ์ ํด๋์ค๋ ๋ค๋ฅธ ์ถ์ ํด๋์ค๋ฅผ ์์ํ ์ ์์
์ ์ถ์ ํด๋์ค๊ฐ ์ถ์ ํด๋์ค๋ฅผ ์์ํ๋๊ฐ?
1. ์ถ์ํ ๋จ๊ณ(๋ ๋ฒจ)๋ฅผ ๋๋ ์ ์๊ธฐ ๋๋ฌธ์
๋ณต์กํ ์์คํ ์ผ์๋ก ํ ๋ฒ์ ๋ชจ๋ ๊ฑธ ์ ์ํ๊ธฐ๋ณด๋จ, ์ ์ง์ ์ผ๋ก ์ถ์ํํด์ ๊ณ์ธต์ ์ผ๋ก ๊ตฌ์กฐํํ๋ ๊ฒ ์ข์
abstract class Animal {
abstract void makeSound();
}
abstract class Canine extends Animal {
abstract void sniff();
}
class Dog extends Canine {
void makeSound() { System.out.println("๋ฉ๋ฉ"); }
void sniff() { System.out.println("ํํ"); }
}
- `Animal`: ๋ชจ๋ ๋๋ฌผ์ ๊ณตํต ๊ธฐ๋ฅ ์ ์
- `Canine`: ๊ฐ๊ณผ ๋๋ฌผ๋ง์ ๊ณตํต ๊ธฐ๋ฅ(sniff) ์ ์ (์์ง ๊ตฌ์ฒด์ ์ด์ง ์์)
- `Dog`: ๊ตฌ์ฒด์ ์ธ ๋๋ฌผ → ์ฌ๊ธฐ์์ผ ์ค์ ๋ฉ์๋ ๊ตฌํ!
2. ๊ณตํต ๋ก์ง์ ์ถ์ ํด๋์ค๊ฐ ๋๋ ๊ฐ๊ธฐ ๋๋ฌธ
- ์์ ์ถ์ ํด๋์ค: ์ ๋ง ๊ณตํต์ ์ธ ์ถ์ ๋ฉ์๋ ์ ์
- ํ์ ์ถ์ ํด๋์ค: ๋ ๊ตฌ์ฒด์ ์ธ ์ญํ ์ ์ + ์ผ๋ถ ๊ณตํต ๋ฉ์๋ ๊ตฌํ
- ์ตํ์ ํด๋์ค(๊ตฌํ ํด๋์ค): ์์ ํ ๊ธฐ๋ฅ ๊ตฌํ
์ด๋ ๊ฒ ํ๋ฉด ์ค๋ณต์ ์ค์ด๋ฉด์๋ ์ญํ ์ ๋ช ํํ ๋ถ๋ฆฌํ ์ ์์ด.
ํญ๋ชฉ | ์ค๋ช |
๊ฐ๋ฅ ์ฌ๋ถ | โ ์ถ์ ํด๋์ค๋ ์ถ์ ํด๋์ค๋ฅผ ์์ํ ์ ์์ |
์ฌ์ฉํ๋ ์ด์ | ์ถ์ํ ๋จ๊ณ๋ฅผ ๋๋๊ณ , ์ญํ ์ ๊ณ์ธต์ ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ ์ํด |
์ฅ์ | ์ค๋ณต ์ ๊ฑฐ, ๊ตฌ์กฐ์ ์ค๊ณ, ์ ์ง๋ณด์ ์ฌ์ |
๋ด์ธ๋ ํด๋์ค
- ๊ธฐ๋ณธ์ ์ผ๋ก `final` ํด๋์ค๋ฅผ ์ ์ธํ ๋ชจ๋ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค๊ฐ ๋ ์ ์์
- JAVA 15 ๋ถํฐ ๋ฌด๋ถ๋ณํ ์์ ํด๋์ค ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ด์ธ๋(sealed) ํด๋์ค๊ฐ ๋์ ๋จ
๐๐ป Person์ ์์ ํด๋์ค๋ Employee์ Manager๋ง ๊ฐ๋ฅ
public sealed class Person permits Employee, Manager { ... }
- sealed ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด permits ํค์๋ ๋ค์ ์์ ๊ฐ๋ฅํ ์์ ํด๋์ค๋ฅผ ์ง์ ํด์ผ ํจ.
- ๋ด์ธ๋ Person ํด๋์ค๋ฅผ ์์ํ๋ Employee์ Manger๋ `final`, `non-sealed` ๋๋ ๋๋ค๋ฅธ ๋ด์ธ๋ ํด๋์ค์ธ `sealed` ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธํด์ผ ํจ
final | ๋ ์ด์ ์์ ๋ถ๊ฐ |
non-sealed | ๋ด์ธ ํด์ |
Q. non-sealed๊ฐ ์กด์ฌํ๋ ์ด์ ?
๋ด์ธ๋ ํด๋์ค๋ ์์ ํด๋์ค๋ฅผ ํ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋๋ฐ, ์ ์์์์ ๋ด์ธ์ ํด์ ํ๋๊ฐ??
A. ์ ํ์ ํ๋ฉด์๋ ์ ์ฐํจ์ ํ์ฉํ๋ ค๋ ์ค๊ณ ์ฒ ํ ๋๋ฌธ์
1. ์ผ๋ถ ์์๋ง ์ ํํ๊ณ , ์ผ๋ถ๋ ์์ ๋กญ๊ฒ ํ๊ณ ์ถ์ ๋
sealed ํด๋์ค๋ฅผ ๋ง๋ค๋ฉด ์์ ํด๋์ค๋ฅผ ๋ช ์์ ์ผ๋ก ์ ํ ๊ฐ๋ฅ
public sealed class Shape permits Circle, Rectangle {}
public final class Circle extends Shape {} // ์์ ๋ถ๊ฐ
public non-sealed class Rectangle extends Shape {} // ์์ ํ์ฉ
๐ `non-sealed`์ "๋๋ ์์ ๋กญ๊ฒ ํ์ฅ๋ ์ ์๋ค" ๋ผ๊ณ ์ ์ธํ๋ ๊ฒ
์ฆ, ๋ถ๋ชจ๋ ์ ์ฒด์ ์ผ๋ก ์์๋ค์ ์ ํํ์ง๋ง, ํน์ ์์์ ๋ค์ ์ด์ด๋๋ค๊ณ ์ ํํ ์ ์๊ฒ ๋ง๋๋ ๊ตฌ์กฐ
2. ์์ ๊ณ์ธต์ ์ ์ฐ์ฑ์ ์ํด
์ด๋ค ํด๋์ค ๊ณ์ธต์ ์๊ฒฉํ๊ฒ, ์ด๋ค ํด๋์ค ๊ณ์ธต์ ์ ์ฐํ๊ฒ ์ด์ด๋ ํ์๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด Java์ sealed๋ OOP์์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ ์์ ํ๊ฒ ์ค๊ณํ๊ธฐ ์ํ ๋๊ตฌ์ธ๋ฐ,
๋ชจ๋ ๊ณ์ธต์ด ๋ฑ๋ฑํ๊ฒ ๋ซํ ์์ผ๋ฉด ํ์ฅ์ด ๋ถ๊ฐ๋ฅํด์ ๋ถํธํ ์ ์์
sealed class Expr permits ConstExpr, VarExpr {}
non-sealed class VarExpr extends Expr {} // ๋ค์ํ ๋ณ์ ํํ์ด ํ์ํจ
final class ConstExpr extends Expr {} // ๊ณ ์ ์์๋ ํ์ฅ ํ์ ์์
3. ๊ถํ์ ์ผ๋จ ์ฃผ๊ณ , ์์์ด ์ค๊ณ ์ฑ ์์ ๊ฐ์ง ์ ์๋๋ก ํจ
non-sealed์ ๋ถ๋ชจ๊ฐ "๋๋ ๋๊น์ง๋ ์ ์ดํ ๊ฒ"
→ "๊ทธ ๋ค์์ ๋ค๊ฐ ์ฑ
์์ง๊ณ ์์์ ์ด๋ ๋ซ๋ ๊ฒฐ์ ํด" ๋ผ๋ ์๋๋ ์๋ค.
์ค๋ฌด์์๋ ์ด๋ ๊ฒ ํ์ ๋ชจ๋ ์ค๊ณ ์ฑ ์์ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ ์์ฃผ ์์
ํค์๋ | ์ค๋ช | ์์ ๊ฐ๋ฅ์ฑ | ์ฌ์ฉ ๋ชฉ์ | ์์ |
sealed | ์์ ํด๋์ค๋ฅผ ์ ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ | ๋ช ์ํ ํด๋์ค๋ง ๊ฐ๋ฅ | ์์ ๊ณ์ธต ์ ์ด, ๋ณด์์ฑ ํฅ์ | sealed class Shape permits Circle, Square {} |
non-sealed | ์์ ์ ํ์ ํด์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉ | ๋๊ตฌ๋ ์์ ๊ฐ๋ฅ | ์ ์ฐํ ํ์ฅ ํ์ฉ | non-sealed class Rectangle extends Shape {} |
final | ์์์ ์์ ํ ๋ง๊ณ ์ถ์ ๋ ์ฌ์ฉ | ์ ๋ ๋ถ๊ฐ | ํด๋์ค ํ์ฅ ๊ธ์ง | final class Circle extends Shape {} |