π§ Java - μΈν°νμ΄μ€ & λ€νμ±
π§ Java - μΈν°νμ΄μ€ & λ€νμ±
π 08-1. μΈν°νμ΄μ€
- ν΄λμ€κ° ꡬνν΄μΌ ν λ©μλμ μ΄λ¦κ³Ό μκ·Έλμ²(λ§€κ°λ³μ, λ°νν)λ§ μ μΈν μΌμ’ μ βκ³μ½μβ
- interface ν€μλλ‘ μ μνλ©°, λ΄λΆμ μ μΈλ λ©μλλ λͺ¨λ μΆμ λ©μλ(public abstract)
- λ€μ€ μμμ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ ν΄λμ€κ° μ¬λ¬ μΈν°νμ΄μ€λ₯Ό ꡬνν μ μμ
- μμ(constant)λ₯Ό μ μν λλ public static final ννλ‘ μ μΈ
π― μΈν°νμ΄μ€ μ μΈ
// Drawable.java
public interface Drawable {
/** λνμ 그리λ λμμ μ μ */
void draw();
}
βοΈ μΈν°νμ΄μ€ ꡬν
- implements ν€μλ λ€μ μΈν°νμ΄μ€ μ΄λ¦μ λμ΄
- μΈν°νμ΄μ€μ μ μΈλ λͺ¨λ μΆμ λ©μλλ₯Ό μ€λ²λΌμ΄λ(μ¬μ μ)ν΄μΌ ν¨
- ν΄λμ€ λ΄λΆμμ μΈν°νμ΄μ€λ₯Ό ꡬννλ©΄, κ·Έ ν΄λμ€λ βDrawableμ ꡬννλ Circleβμ΄ λμ΄ draw() λ©μλλ₯Ό μ¬μ©ν μ μμ
// Circle.java
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("π΅ λ°μ§λ¦ " + radius + "μΈ μμ 그립λλ€.");
}
public double getRadius() {
return radius;
}
}
βοΈ μΈν°νμ΄μ€ μ¬μ©
// Main.java
public class Main {
public static void main(String[] args) {
Drawable shape = new Circle(3.5); // μΈν°νμ΄μ€ νμ
μΌλ‘ μ
μΊμ€ν
shape.draw(); // π΅ λ°μ§λ¦ 3.5μΈ μμ 그립λλ€.
}
}
[μ μΊμ€ν ]
- Circle κ°μ²΄λ₯Ό Drawable νμ λ³μμ ν λΉ
- μ»΄νμΌ μμ μλ shapeκ° Drawableμ΄λΌλ κ³΅ν΅ μΈν°νμ΄μ€λ§ μμ§λ§, μ€ν μμ μλ μ€μ Circleμ draw()κ° νΈμΆ
- ꡬν체λ₯Ό λ°κΎΈλ©΄ μ½λλ₯Ό μ ν μμ νμ§ μκ³ λ€μν λνμ λμΌνκ² μ²λ¦¬ κ°λ₯
𧬠08-2. νμ λ³νκ³Ό λ€νμ±
π μλ νμ λ³ν (Upcasting)
Drawable d = new Circle(2.0); // Circle β Drawable (μ
μΊμ€ν
)
μλ νλ³ν(μ μΌμ€ν )
- μμ ν΄λμ€(Circle) νμ μ λΆλͺ¨ μΈν°νμ΄μ€(Drawable) νμ μΌλ‘ λ³ν
- λͺ μμ μΊμ€ν μμ΄ μ»΄νμΌλ¬κ° μλμΌλ‘ μ²λ¦¬
- λ€νμ±μ ν΅μ¬: ꡬ체 ꡬν체μ κ΄κ³μμ΄ μΈν°νμ΄μ€λ₯Ό ν΅ν΄ ν΅μΌλ λ°©μμΌλ‘ μ κ·Ό
π§ͺ νλμ λ€νμ±
// Painter.java
public class Painter {
private Drawable tool; // μ΄λ€ Drawableμ΄λ λ΄μ μ μλ νλ
public Painter(Drawable tool) {
this.tool = tool;
}
public void paint() {
tool.draw();
}
}
// μ¬μ© μ
Painter p = new Painter(new Circle(1.5));
p.paint(); // π΅ λ°μ§λ¦ 1.5μΈ μμ 그립λλ€.
- ν΄λμ€ λ΄λΆμ λ©€λ² λ³μλ‘ μΈν°νμ΄μ€ νμ μ μ μΈ
- μμ±μλ μΈν°(setter)λ₯Ό ν΅ν΄ λ€μν ꡬν체(Circle, Rectangle, Triangle λ±)λ₯Ό μ£Όμ κ°λ₯
- Painter ν΄λμ€λ ꡬ체 νμ μ 무κ΄νκ² λͺ¨λ Drawableμ λ€λ£° μ μμ
π λ§€κ° λ³μμ λ€νμ±
// Renderer.java
public class Renderer {
public void render(Drawable d) {
d.draw();
}
}
// μ¬μ© μ
Renderer r = new Renderer();
r.render(new Circle(4.0)); // π΅ λ°μ§λ¦ 4.0μΈ μμ 그립λλ€.
- λ©μλ νλΌλ―Έν°λ₯Ό μΈν°νμ΄μ€ νμ μΌλ‘ μ μΈ
- μ΄λ€ ꡬν체 κ°μ²΄λ₯Ό μ λ¬νλλΌλ μΌκ΄λ μΈν°νμ΄μ€ λ©μλ(draw()) νΈμΆλ‘ μ²λ¦¬
- μλ‘μ΄ λν ν΄λμ€κ° μΆκ°λμ΄λ render() λ©μλλ κ·Έλλ‘ μ¬μ¬μ© κ°λ₯
π κ°μ νμ λ³ν(Downcasting)
Drawable d = new Circle(5.0);
if (d instanceof Circle) {
Circle c = (Circle) d; // λ€μ΄μΊμ€ν
System.out.println("λ°μ§λ¦: " + c.getRadius());
}
- μΈν°νμ΄μ€ νμ λ³μ(Drawable)λ₯Ό ꡬ체 ν΄λμ€(Circle) νμ μΌλ‘ λ³ν
- μΈν°νμ΄μ€μλ μλ κ³ μ λ©μλ(getRadius())λ₯Ό μ¬μ©νκΈ° μν΄ νμ
- μλͺ»λ νμ μΌλ‘ μΊμ€ν μ ClassCastException λ°μνλ―λ‘, instanceofλ‘ νμ κ²μ¬ ν μμ νκ² μν
π§ κ°μ²΄ νμ νμΈ (instanceof)
if (d instanceof Circle) {
System.out.println("μ΄ κ°μ²΄λ Circleμ
λλ€.");
} else {
System.out.println("Circleμ΄ μλλλ€.");
}
[instanceof μ°μ°μ]
- λ°νμμ μ€μ κ°μ²΄κ° νΉμ ν΄λμ€λ μΈν°νμ΄μ€λ₯Ό ꡬννλμ§ κ²μ¬
- λ€μ΄μΊμ€ν μ μ¬μ 체ν¬λ‘ μ¬μ©
- Boolean κ°μ λ°ν