🧠 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 값을 λ°˜ν™˜

(1) instanceof 예제

image


(2) interface 예제

image