λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μžλ°” 좔상 클래슀(Abstract Class) μ‚¬μš©λ²• & 예제

by 5566 2023. 11. 11.

1. 좔상 클래슀(Abstract Class)λž€ 무엇인가?

좔상 클래슀(Abstract Class)λŠ” μžλ°”μ—μ„œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μœ„ν•΄ μ œκ³΅λ˜λŠ” 클래슀 ν˜•μ‹ 쀑 ν•˜λ‚˜λ‘œ, μ‹€μ œ κ΅¬ν˜„λ˜μ§€ μ•Šμ€ 좔상 λ©”μ†Œλ“œ(abstract method)λ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 좔상 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€λ“€μ˜ 곡톡적인 νŠΉμ§•κ³Ό λ™μž‘μ„ μ •μ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€.

좔상 ν΄λž˜μŠ€λŠ” μ™„μ „ν•œ 클래슀(Concrete Class)와 달리, λ‹€μŒκ³Ό 같은 λͺ‡ 가지 νŠΉμ§•μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  • 좔상 ν΄λž˜μŠ€λŠ” abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έλ©λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μ§μ ‘μ μœΌλ‘œ 객체λ₯Ό 생성할 수 μ—†μœΌλ©°, 상속을 톡해 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 일반 λ©”μ†Œλ“œμ™€ 좔상 λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 상속받은 ν΄λž˜μŠ€λ“€μ—κ²Œ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ κ°•μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μƒμ†λ˜λŠ” ν΄λž˜μŠ€λ“€ 간에 일관성을 μœ μ§€ν•˜κ³ , μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

좔상 클래슀의 μ£Όμš” λͺ©μ μ€ κ·œμ•½(Contract)을 μ •μ˜ν•˜λŠ” κ²ƒμœΌλ‘œ, νŠΉμ • μ’…λ₯˜μ˜ κ°μ²΄λ‚˜ ν΄λž˜μŠ€λ“€μ΄ μ€€μˆ˜ν•΄μ•Ό ν•˜λŠ” νŠΉμ„±μ΄λ‚˜ λ™μž‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μœ μ‚¬ν•œ κΈ°λŠ₯을 ν•˜λŠ” λ‹€μ–‘ν•œ ν΄λž˜μŠ€λ“€μ΄ 좔상 클래슀λ₯Ό μƒμ†ν•΄μ„œ 곡톡 뢀뢄을 μž¬μ‚¬μš©ν•˜λ©΄μ„œλ„ λ‹€μ–‘ν•œ κ΅¬ν˜„μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€ν˜•μ„±(Polymorphism)의 κ°œλ…μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€.

2. 좔상 클래슀의 μ„ μ–Έ 방법과 νŠΉμ§•

좔상 클래슀λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 단계λ₯Ό 따라야 ν•©λ‹ˆλ‹€.

public abstract class AbstractClassName {
    // 좔상 λ©”μ†Œλ“œ 및 일반 λ©”μ†Œλ“œ μ •μ˜

    // 좔상 λ©”μ†Œλ“œ μ„ μ–Έ
    public abstract void abstractMethod();

    // 일반 λ©”μ†Œλ“œ μ •μ˜
    public void regularMethod() {
        // λ©”μ†Œλ“œ λ‚΄μš©
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” 좔상 클래슀인 AbstractClassName을 μ„ μ–Έν•˜μ˜€μŠ΅λ‹ˆλ‹€. 좔상 클래슀λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” 클래슀 이름 μ•žμ— abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, 클래슀 내에 좔상 λ©”μ†Œλ“œμ™€ 일반 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

좔상 클래슀의 μ£Όμš” νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 좔상 ν΄λž˜μŠ€λŠ” abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έλ©λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 일반 λ©”μ†Œλ“œμ™€ 좔상 λ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 λ©”μ†Œλ“œλŠ” μ„ μ–Έλ§Œ ν•˜κ³  κ΅¬ν˜„μ€ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μ§μ ‘μ μœΌλ‘œ 객체λ₯Ό 생성할 수 μ—†μœΌλ©°, 상속을 톡해 μ‚¬μš©λ©λ‹ˆλ‹€.
  • 좔상 클래슀λ₯Ό 상속 받은 μ„œλΈŒ ν΄λž˜μŠ€λŠ” λͺ¨λ“  좔상 λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ‹€ν˜•μ„±(Polymorphism)을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 클래슀λ₯Ό 상속받아 μ„œλΈŒ 클래슀λ₯Ό λ§Œλ“€λ©΄, 좔상 클래슀의 λ©”μ†Œλ“œλ₯Ό μž¬μ‚¬μš©ν•˜λ©° 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    3. 좔상 클래슀의 상속과 κ΅¬ν˜„ 방법

좔상 ν΄λž˜μŠ€λŠ” λ‹€λ₯Έ ν΄λž˜μŠ€μ—κ²Œ 곡톡적인 νŠΉμ§•κ³Ό λ™μž‘μ„ μƒμ†ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. 좔상 클래슀λ₯Ό μƒμ†λ°›λŠ” ν΄λž˜μŠ€λ“€μ€ 좔상 클래슀의 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜κ³  좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public abstract class AbstractClassName {
    // 좔상 λ©”μ†Œλ“œ μ„ μ–Έ
    public abstract void abstractMethod();

    // 일반 λ©”μ†Œλ“œ μ •μ˜
    public void regularMethod() {
        // λ©”μ†Œλ“œ λ‚΄μš©
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ AbstractClassName은 좔상 ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 이 좔상 클래슀λ₯Ό μƒμ†λ°›λŠ” μ„œλΈŒ ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public class SubClassName extends AbstractClassName {
    // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
    public void abstractMethod() {
        // λ©”μ†Œλ“œ λ‚΄μš© κ΅¬ν˜„
    }

    // 좔가적인 κΈ°λŠ₯ κ΅¬ν˜„
    public void additionalMethod() {
        // λ©”μ†Œλ“œ λ‚΄μš© κ΅¬ν˜„
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ SubClassName은 AbstractClassName을 μƒμ†λ°›λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 상속을 받을 λ•Œμ—λŠ” extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 상속받은 μ„œλΈŒ ν΄λž˜μŠ€λŠ” 좔상 클래슀의 좔상 λ©”μ†Œλ“œμΈ abstractMethod()λ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, 좔가적인 κΈ°λŠ₯을 μœ„ν•΄ μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œλŠ” 일반 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

좔상 클래슀λ₯Ό 상속받은 μ„œλΈŒ ν΄λž˜μŠ€λŠ” 좔상 클래슀의 λ©”μ†Œλ“œλ₯Ό μƒμ†ν•˜λ©°, 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 상속 κ΄€κ³„μ˜ ν΄λž˜μŠ€λ“€ 간에 일관성을 μœ μ§€ν•˜λ©΄μ„œλ„ κ°œλ³„μ μΈ κ΅¬ν˜„μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 좔상 클래슀λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

4. 좔상 λ©”μ†Œλ“œ(Abstract Method)의 μ‚¬μš©λ²•κ³Ό μ€‘μš”μ„±

좔상 λ©”μ†Œλ“œλŠ” 좔상 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ„ μ–Έλ˜λ©°, μ‹€μ œ κ΅¬ν˜„ λ‚΄μš©μ΄ μ—†λŠ” λ©”μ†Œλ“œμž…λ‹ˆλ‹€. 좔상 λ©”μ†Œλ“œλŠ” μ„ μ–Έλ§Œμ„ ν•˜κ³  μ‹€μ œ λ‚΄μš©μ΄λ‚˜ κ΅¬ν˜„λΆ€λŠ” ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜(μ˜€λ²„λΌμ΄λ”©)λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

public abstract class AbstractClassName {
    // 좔상 λ©”μ†Œλ“œ μ„ μ–Έ
    public abstract void abstractMethod();
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ AbstractClassName은 좔상 클래슀이며, abstractMethodλŠ” 좔상 λ©”μ†Œλ“œμž…λ‹ˆλ‹€. 좔상 λ©”μ†Œλ“œλŠ” abstract ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έλ˜λ©°, λ©”μ†Œλ“œμ˜ λͺΈμ²΄ 뢀뢄은 μž‘μ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ 좔상 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λ©΄ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

좔상 λ©”μ†Œλ“œμ˜ μ‚¬μš©λ²•κ³Ό μ€‘μš”μ„±μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 좔상 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 λ©”μ†Œλ“œλŠ” 상속 받은 ν΄λž˜μŠ€μ—μ„œ λ©”μ†Œλ“œμ˜ ꡬ체적인 λ™μž‘μ„ μ •μ˜ν•  수 있게 ν•©λ‹ˆλ‹€.
  • 좔상 λ©”μ†Œλ“œλ₯Ό 톡해 λ‹€ν˜•μ„±(Polymorphism)을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 좔상 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³ , 이λ₯Ό κ΅¬ν˜„ν•œ μ—¬λŸ¬ 클래슀의 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μœ μ—°ν•˜κ³  ν™•μž₯μ„± μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 좔상 λ©”μ†Œλ“œλŠ” 상속을 톡해 μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ—¬μ€λ‹ˆλ‹€. ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ 좔상 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•¨μœΌλ‘œμ¨ 곡톡적인 λ™μž‘μ„ μƒμœ„ ν΄λž˜μŠ€μ— κ΅¬ν˜„ν•˜λŠ” 반면, κ°œλ³„ ν΄λž˜μŠ€μ—μ„œλŠ” 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

좔상 λ©”μ†Œλ“œλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜λ‘œ, 상속과 λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•˜λŠ” 데 μžˆμ–΄μ„œ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 좔상 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ 좔상 λ©”μ†Œλ“œλ₯Ό 잘 ν™œμš©ν•˜μ—¬ μœ μ—°ν•˜κ³  ν™•μž₯μ„± μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. 좔상 클래슀의 예제λ₯Ό ν†΅ν•œ μ‹€μŠ΅κ³Ό ν™œμš© 방법

λ‹€μŒ 예제λ₯Ό 톡해 좔상 클래슀의 μ‹€μŠ΅κ³Ό ν™œμš© 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

// 좔상 클래슀
abstract class Animal {
    // 좔상 λ©”μ†Œλ“œ
    public abstract void sound();

    // 일반 λ©”μ†Œλ“œ
    public void sleep() {
        System.out.println("μΏ¨μΏ¨~");
    }
}

// 좔상 클래슀λ₯Ό 상속받은 μ„œλΈŒ 클래슀
class Dog extends Animal {
    // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
    public void sound() {
        System.out.println("멍멍!");
    }
}

class Cat extends Animal {
    // 좔상 λ©”μ†Œλ“œ κ΅¬ν˜„
    public void sound() {
        System.out.println("μ•Όμ˜Ή!");
    }
}

μœ„μ˜ μ˜ˆμ œμ—μ„œ Animal은 좔상 클래슀이며, sound()λŠ” 좔상 λ©”μ†Œλ“œμž…λ‹ˆλ‹€. Dog와 Cat은 Animal을 μƒμ†λ°›λŠ” μ„œλΈŒ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 이 μ˜ˆμ œμ—μ„œλŠ” λ™λ¬Όμ˜ μ†Œλ¦¬λ₯Ό 좜λ ₯ν•˜λŠ” 좔상 λ©”μ†Œλ“œλ₯Ό 상속받은 μ„œλΈŒ ν΄λž˜μŠ€λ“€μ΄ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.sound(); // "멍멍!" 좜λ ₯
        dog.sleep(); // "μΏ¨μΏ¨~" 좜λ ₯

        Cat cat = new Cat();
        cat.sound(); // "μ•Όμ˜Ή!" 좜λ ₯
        cat.sleep(); // "μΏ¨μΏ¨~" 좜λ ₯
    }
}

좜λ ₯κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

멍멍!
μΏ¨μΏ¨~
μ•Όμ˜Ή!
μΏ¨μΏ¨~

μœ„μ˜ μ˜ˆμ œμ—μ„œ Dog와 Cat ν΄λž˜μŠ€λŠ” Animal 좔상 클래슀λ₯Ό 상속받아 ν•΄λ‹Ή 좔상 클래슀의 좔상 λ©”μ†Œλ“œμΈ sound()λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 일반 λ©”μ†Œλ“œμΈ sleep()λŠ” 좔상 ν΄λž˜μŠ€μ—μ„œ 이미 κ΅¬ν˜„λ˜μ–΄ 있기 λ•Œλ¬Έμ— 좔가적인 κ΅¬ν˜„μ΄ ν•„μš”ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

이처럼 좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 곡톡적인 λ™μž‘μ„ μƒμ†λ°›λŠ” ν΄λž˜μŠ€λ“€μ΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜λ©°, 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ‹€ν˜•μ„±μ„ 톡해 좔상 ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  이λ₯Ό κ΅¬ν˜„ν•œ μ—¬λŸ¬ 클래슀의 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μœ μ—°μ„±κ³Ό ν™•μž₯성을 톡해 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μœ μš©ν•˜κ²Œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€