ν‹°μŠ€ν† λ¦¬ λ·°

μΆ”μƒν΄λž˜μŠ€ ❓

  • λ―Έμ™„μ„±λœ μ„€κ³„λ„λ‘œ λΉ„μœ ν•  수 있음(=ν”„λ ˆμž„)
  • μΆ”μƒλ©”μ„œλ“œ(λ―Έμ™„μ„± λ©”μ„œλ“œ)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” 클래슀
  • μΆ”μƒλ©”μ„œλ“œλŠ” 상속을 ν†΅ν•΄μ„œλ§Œ μ™„μ„±λ˜μ–΄μ§ˆ 수 있음
  • κ³΅ν†΅λœ 뢀뢄에 λŒ€ν•΄μ„œ μžμ‹ ν΄λž˜μŠ€μ—κ²Œ 상속이 이루어짐
  • μΆ”μƒν΄λž˜μŠ€λŠ” abstract ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ 생성함 
abstract class Robot{
	...
}

 

μΆ”μƒλ©”μ„œλ“œ( abstract method ) ❓

  • λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜μ§€λ§Œ λ©”μ„œλ“œμ˜ λ‚΄μš©μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
  • λ©”μ„œλ“œλ§Œ κ΅¬μ„±ν•˜κ³   μƒμ„Έκ΅¬ν˜„μ€ 상속을 톡해 이루어 지도둝 κ°•μ œν•¨.
  • λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λΉ„μ›Œλ‘λŠ” μ΄μœ λŠ” μžμ‹ν΄λž˜μŠ€ λ§ˆλ‹€μ˜ κ΅¬ν˜„λ‚΄μš©μ΄ λ‹¬λΌμ§ˆ 수 있기 λ•Œλ¬Έ
  • κ΅¬ν˜„λ‚΄μš©μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—  { } 블둝 없이 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•¨
abstract String attack();

 

μž κΉλ§Œμš” βœ‹

μΆ”μƒλ©”μ„œλ“œλ„ μ–΄μ°¨ν”Ό λ©”μ„œλ“œμΈλ° 일반 λ©”μ„œλ“œλ‘œ λ§Œλ“€μ–΄λ„ λ˜μ§€ μ•Šλ‚˜μš” ❓ 

κ·Έλ ‡λ‹€. μ–΄μ°¨ν”Ό κ΅¬ν˜„ λ‚΄μš©μ€ λ©”μ„œλ“œμ—λ§Œ μž‘μ„±λ˜λ©΄ λœλ‹€. μ–΄λŠ λ©”μ„œλ“œμ—λ“  κ΅¬ν˜„λ‚΄μš©λ§Œ μ œλŒ€λ‘œ μž‘μ„±ν•˜κ³  λ™μž‘ν•˜λ©΄ λ˜λŠ” 것이닀. κ·ΈλŸ°λ°λ„ abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ μΆ”μƒλ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ” μ΄μœ λŠ” λ°”λ‘œ κ°•μ œμ„±μ„ λΆ€μ—¬ν•˜κΈ° μœ„ν•΄μ„œλ‹€. 예둜 λ“€μ–΄ μžλ™μ°¨λ₯Ό λ§Œλ“ λ‹€κ³  κ°€μ •ν•΄ 보자. ν•Έλ“€, 휠, 엔진, λΈŒλ ˆμ΄ν¬μ™€ 같은 ꡬ성듀은 μžλ™μ°¨κ°€ λ§Œλ“€μ–΄μ§€κΈ° μœ„ν•΄μ„  λ°˜λ“œμ‹œ ν•„μˆ˜λΆˆκ°€κ²°ν•œ λΆ€ν’ˆ ν˜Ήμ€ κΈ°λŠ₯듀이닀. 혹, 이 쀑 ν•˜λ‚˜λΌλ„ λˆ„λ½λ˜μ–΄ μžλ™μ°¨λ‘œ λ§Œλ“€μ–΄μ§„λ‹€λ©΄ κ·Έ λˆ„κ΅¬λ„ 이런 μžλ™μ°¨λ₯Ό 타고 μ‹Άμ–΄ ν•˜μ§€ μ•Šμ„ 것이닀. 즉, μ›ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ μ£Όμš”ν•œ κΈ°λŠ₯이 λˆ„λ½λ˜μ§€ μ•Šκ³  λ°˜λ“œμ‹œ κ΅¬ν˜„λ˜λ„λ‘ κ°•μ œν•˜λŠ” 것을 μΆ”μƒλ©”μ„œλ“œλΌκ³  μ΄ν•΄ν•˜λ©΄ λœλ‹€.

 

μΆ”μƒν΄λž˜μŠ€ μž‘μ„± πŸ“

μ—¬λŸ¬ 클래슀λ₯Ό κ³΅ν†΅μ μœΌλ‘œ μ‚¬μš©λ  수 μžˆλŠ” 클래슀λ₯Ό λ°”λ‘œ μž‘μ„±ν•˜κΈ°λ„ ν•˜κ³ , 기쑴의 클래슀의 곡톡적인 뢀뢄을 λ½‘μ•„μ„œ μΆ”μƒν΄λž˜μŠ€λ‘œ λ§Œλ“€μ–΄ μƒμ†ν•˜λ„λ‘ ν•˜λŠ” κ²½μš°λ„ μžˆλ‹€. 상속이 μžμ‹ 클래슀λ₯Ό λ§Œλ“œλŠ”λ° λΆ€λͺ¨ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이라면, μΆ”μƒν™”λŠ” 기쑴의 ν΄λž˜μŠ€λ‘œλΆ€ν„° 곡톡뢀뢄을 λ„μΆœν•΄ λΆ€λͺ¨ 클래슀λ₯Ό λ§Œλ“œλŠ” 것이라 ν•  수 μžˆλ‹€. λ•Œλ¬Έμ— 좔상화λ₯Ό κ΅¬ν˜„ν•œλ‹€λŠ” 것은 점차 κΈ°λŠ₯의 λ‚΄μš©μ΄ 상세화(상속) λœλ‹€λŠ” 이야기가 λœλ‹€. λ°˜λŒ€λ‘œ ꡬ체화λ₯Ό 좔상화 ν•œλ‹€λŠ” 것은 κΈ°λŠ₯의 λ‚΄μš©μ΄ 간결해지고 κ³΅ν†΅μ˜ κ΄€μ‹¬μ‚¬λ§Œ λ‚¨κ²Œ λœλ‹€. 

 

μš°λ¦¬λŠ” 'λ‘œλ΄‡'을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ„ 생각해 λ³Ό 수 μžˆλ‹€.

 

λ‘œλ΄‡μ€ 곡격을 ν•  수 μžˆλ‹€.

λ‘œλ΄‡μ€ 이동을 ν•  수 μžˆλ‹€.

λ‘œλ΄‡μ€ λ°©μ–΄λ₯Ό ν•  수 μžˆλ‹€.

λ‘œλ΄‡μ€ 변신을 ν•  수 μžˆλ‹€.

λ‘œλ΄‡μ€ λ‹€μ–‘ν•œ μ’…λ₯˜κ°€ μžˆλ‹€.

 

μœ„μ™€ 같이 각각의 λ‘œλ΄‡(μžμ‹ν΄λž˜μŠ€)이 κ°€μ§ˆμˆ˜ μžˆλŠ” κ³΅ν†΅λœ μ„±μ§ˆμ„ 뽑아낼 수 μžˆλ‹€. 이λ₯Ό μΆ”μƒν΄λž˜μŠ€λ‘œ μž‘μ„±ν•΄ 보자.

 

Robot.java

public abstract class Robot {
    //곡격
    abstract void attack();
    
    //이동
    abstract void move();
    
    //λ°©μ–΄
    abstract void defend();
    
    //λ³€μ‹ 
    abstract void transform();
    
}

λ‘œλ΄‡μ˜ 곡톡 μ„±μ§ˆμΈ 곡격(attack), 이동(move), λ°©μ–΄(defend), λ³€μ‹ (transform)을 μΆ”μƒλ©”μ„œλ“œλ‘œ λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.

이제 Robot을 λ§Œλ“€κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ 이 4κ°€μ§€μ˜ κΈ°λŠ₯을 μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό μ™„μ „ν•œ λ‘œλ΄‡μ΄ νƒ„μƒν•˜κ²Œ λœλ‹€.

 

자 λ‹€μŒμ€ Robot μΆ”μƒλ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” κ΅¬ν˜„ν΄λž˜μŠ€λ₯Ό μž‘μ„±ν•΄ 보자.

 

TaekwonV.java

public class TaekwonV extends Robot{

    @Override
    void attack() {
        System.out.println("νƒœκΆŒλΈŒμ΄κ°€ 미사일 곡격을 ν•©λ‹ˆλ‹€.");
    }
    @Override
    void move() {
        System.out.println("νƒœκΆŒλΈŒμ΄κ°€ λΉ„ν–‰ λͺ¨λ“œλ‘œ 이동 ν•©λ‹ˆλ‹€.");
    }

    @Override
    void defend() {
        System.out.println("νƒœκΆŒλΈŒμ΄κ°€ 방패둜 λ°©μ–΄ ν•©λ‹ˆλ‹€.");
    }

    @Override
    void transform() {
        System.out.println("νƒœκΆŒλΈŒμ΄κ°€ μ „νˆ¬κΈ°λ‘œ λ³€μ‹ ν•©λ‹ˆλ‹€.");
    }
}

 

Sungard.java

public class Sungard extends Robot{

    @Override
    void attack() {
        System.out.println("μ¬κ°€λ“œκ°€ 발차기 곡격을 ν•©λ‹ˆλ‹€.");
    }

    @Override
    void move() {
        System.out.println("μ¬κ°€λ“œκ°€ κ±Έμ–΄μ„œ μ΄λ™ν•©λ‹ˆλ‹€.");
    }

    @Override
    void defend() {
        System.out.println("μ¬κ°€λ“œκ°€ 방패둜 λ°©μ–΄ν•©λ‹ˆλ‹€.");
    }

    @Override
    void transform() {
        System.out.println("μ¬κ°€λ“œκ°€ μžλ™μ°¨λ‘œ λ³€μ‹  ν•©λ‹ˆλ‹€.");
    }
}

Mazinger.java

public class Mazinger extends Robot{

    @Override
    void attack() {
        System.out.println("λ§ˆμ§•κ°€κ°€ νŽ€μΉ˜ 곡격을 ν•©λ‹ˆλ‹€.");
    }

    @Override
    void move() {
        System.out.println("λ§ˆμ§•κ°€κ°€ λΉ„ν–‰ ν•©λ‹ˆλ‹€.");
    }

    @Override
    void defend() {
        System.out.println("λ§ˆμ§•κ°€κ°€ 방패둜 λ°©μ–΄ν•©λ‹ˆλ‹€.");
    }

    @Override
    void transform() {
        System.out.println("λ§ˆμ§•κ°€ λΉ„ν–‰κΈ°λ‘œ λ³€μ‹  ν•©λ‹ˆλ‹€.");
    }
}

μš°λ¦¬λŠ” μ—¬κΈ°μ„œ @Override에 집쀑할 ν•„μš”κ°€ μžˆλ‹€. νƒœκΆŒλΈŒμ΄, λ§ˆμ§•κ°€, μ¬κ°€λ“œλŠ” λͺ¨λ‘ λ°˜λ“œμ‹œ ν•„μš”ν•œ κΈ°λŠ₯ 4가지에 λŒ€ν•΄μ„œ μž¬μ •μ˜λ₯Ό 톡해 μΆ”μƒλ©”μ„œλ“œμ˜ λ‚΄μš©μ„ μž¬μ •μ˜ν•˜κ³  μžˆλ‹€. 이 쀑 ν•˜λ‚˜λΌλ„ μž¬μ •μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μžλ°”λŠ” λ‹€μŒκ³Ό 같은 μ—λŸ¬ 메세지λ₯Ό 보낼 것이닀.

java: org.kithub.Mazinger is not abstract and does not override abstract method defend() in org.kithub.Robot

그리고 μš°λ¦¬λŠ” μ„Έ λ‘œλ΄‡μ˜ 4가지 κΈ°λŠ₯이 λͺ¨λ‘ λ‹€λ₯΄λ‹€λŠ” 것(곡격:미사일,νŽ€μΉ˜,발차기)을 μ•Œ 수 μžˆλ‹€. 즉, μΆ”μƒν΄λž˜μŠ€(λΆ€λͺ¨ν΄λž˜μŠ€)λŠ” μžμ‹ν΄λž˜μŠ€μ—κ²Œ ν•„μš”ν•œ κΈ°λŠ₯ 4가지λ₯Ό μ œμ‹œν•œ 것일뿐 μƒμ„Έν•œ λ‚΄μš©μ€ μ˜¨μ „νžˆ μžμ‹ν΄λž˜μŠ€μ—κ²Œ μœ„μž„ν•˜κ³  μžˆλ‹€. 같은 λ‘œλ΄‡μ΄λΌλ„ 미사일 곡격이 κ°€λŠ₯ν•  수 있고, νŽ€μΉ˜ 곡격이 κ°€λŠ₯ν•  μˆ˜λ„ μžˆκΈ°λ•Œλ¬Έμ΄λ‹€.

 

Main.java

    public static void main(String[] args) {
        List<Robot> robots = List.of(new Mazinger(),new TaekwonV(), new Sungard());
        robots.stream().forEach((r)->r.attack());
    }
λ§ˆμ§•κ°€κ°€ νŽ€μΉ˜ κ³΅κ²©μ„ ν•©λ‹ˆλ‹€.
νƒœκΆŒλΈŒμ΄κ°€ λ―Έμ‚¬μΌ κ³΅κ²©μ„ ν•©λ‹ˆλ‹€.
μ¬κ°€λ“œκ°€ λ°œμ°¨κΈ° κ³΅κ²©μ„ ν•©λ‹ˆλ‹€.

이제 μ„Έ λͺ¨λΈμ˜ λ‘œλ΄‡(μΈμŠ€ν„΄μŠ€)을 λ§Œλ“€μ–΄ 곡격 λ™μž‘μ„ μˆ˜ν–‰ν•΄λ³΄μž. λ‘œκ·Έμ— λ‚˜μ™€ μžˆλŠ” κ²ƒμ²˜λŸΌ λͺ¨λ‘ λ‹€λ₯Έ 곡격 νŒ¨ν„΄μ„ μ§€λ‹ˆκ³  μžˆμŒμ„ μ•Œ 수 μžˆλ‹€. μ—¬κΈ°μ„œ μš°λ¦¬λŠ” ν•˜λ‚˜λ₯Ό 더 μ•Œκ²Œ λœλ‹€. 객체가 닀름에도 List μ»¬λ ‰μ…˜μ€ λ‹€λ₯Έ μ„Έ νƒ€μž…μ˜ 객체λ₯Ό λͺ¨λ‘ 받아듀이고 μžˆλ‹€λŠ” 것이닀. 이것이 λ°”λ‘œ λΆ€λͺ¨μ˜ νƒ€μž…μ€ κ°™μ§€λ§Œ μ‹€μ œ μ°Έμ‘°ν•˜κ³  μžˆλŠ” μžμ‹μ˜ νƒ€μž…μ΄ λ‹€λ₯Έ 경우λ₯Ό μš°λ¦¬λŠ” 'λ‹€ν˜•μ„±'이라고 λΆ€λ₯Έλ‹€. μžλ°”λŠ” μ΄λŸ¬ν•œ λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— μΆ”μƒν΄λž˜μŠ€μ™€ 같은 λ―Έμ™„μ„±μ˜ 섀계도λ₯Ό 톡해 μ’€ 더 μœ μ—°ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 개발이 κ°€λŠ₯ν•œ 것이닀.

 

 

λŒ“κΈ€
λ°˜μ‘ν˜•