λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/Java

[Java] 좔상화와 λ‹€ν˜•μ„±μœΌλ‘œ μœ μ—°ν•œ μ½”λ“œ μ„€κ³„ν•˜κΈ°

by hyebin (Helia) 2025. 5. 13.
λ°˜μ‘ν˜•

λͺ©μ°¨

     

    객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 μ§„μ§œ νž˜μ€ μœ μ—°ν•¨κ³Ό ν™•μž₯성에 μžˆμŠ΅λ‹ˆλ‹€.

    κ·Έ 핡심에 μžˆλŠ” κ°œλ…μ΄ λ°”λ‘œ 좔상화(Abstraction) 와 λ‹€ν˜•μ„±(Polymorphism) 이죠.

     

    이번 κΈ€μ—μ„œλŠ” 좔상 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ‹€ν˜•μ„±, instanceofλ₯Ό 톡해 Java둜 μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μš΄ 섀계 ꡬ쑰λ₯Ό λ§Œλ“œλŠ” 방법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.


    πŸ”· 좔상 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€

    πŸ“Œ μΆ”μƒν™”λž€?

    μΆ”μƒν™”λŠ” κ³΅ν†΅μ μΈ 속성과 λ™μž‘μ„ 뽑아내어 μΌλ°˜ν™”ν•˜λŠ” κ°œλ…μž…λ‹ˆλ‹€.
    즉, μ—¬λŸ¬ 객체가 κ³΅ν†΅μœΌλ‘œ κ°€μ Έμ•Ό ν•  ‘ν‹€’을 μ •μ˜ν•˜λ˜, κ΅¬ν˜„은 λ‚˜μ€‘μ— ν•˜κ²Œ λ§Œλ“œλŠ” κ±°μ£ .

    Javaμ—μ„œλŠ” 이 좔상화λ₯Ό μœ„ν•΄ μΆ”상 클래슀(Abstract Class)와 μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

     

    좔상 클래슀(Abstract Class)

    좔상 ν΄λž˜μŠ€λŠ” μ™„μ „ν•˜μ§€ μ•Šμ€ 클래슀둜, ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ„œλ“œλ₯Ό 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

    좔상 λ©”μ„œλ“œλŠ” μ„ μ–Έλ§Œ 있고 κ΅¬ν˜„μ€ μ—†λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. 

    // 좔상 클래슀 μ„ μ–Έ
    abstract class Animal {
        // 일반 ν•„λ“œ
        protected String name;
        
        // 일반 λ©”μ„œλ“œ
        public void eat() {
            System.out.println(name + "이(κ°€) λ¨Ήκ³  μžˆμŠ΅λ‹ˆλ‹€.");
        }
        
        // 좔상 λ©”μ„œλ“œ (κ΅¬ν˜„λΆ€κ°€ μ—†μŒ)
        abstract void makeSound();
    }
    
    // 좔상 클래슀 상속
    class Dog extends Animal {
        public Dog(String name) {
            this.name = name;
        }
        
        // 좔상 λ©”μ„œλ“œ κ΅¬ν˜„ (ν•„μˆ˜)
        @Override
        void makeSound() {
            System.out.println("멍멍!");
        }
    }

     

    좔상 클래슀의 νŠΉμ§•

    • abstract ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ
    • 객체λ₯Ό 직접 생성할 수 μ—†μŒ (new Animal() λΆˆκ°€λŠ₯)
    • 좔상 λ©”μ„œλ“œμ™€ 일반 λ©”μ„œλ“œ λͺ¨λ‘ 포함 κ°€λŠ₯
    • μƒμ„±μž, ν•„λ“œ, 일반 λ©”μ„œλ“œλ„ κ°€μ§ˆ 수 있음
    • μžμ‹ ν΄λž˜μŠ€λŠ” λͺ¨λ“  좔상 λ©”μ„œλ“œλ₯Ό λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό 함

     

    μΈν„°νŽ˜μ΄μŠ€ (interface)

    μΈν„°νŽ˜μ΄μŠ€λŠ” μ™„μ „ν•œ 좔상화λ₯Ό μ œκ³΅ν•˜λŠ” ꡬ쑰둜, ν΄λž˜μŠ€κ°€ μ–΄λ–€ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

    // μΈν„°νŽ˜μ΄μŠ€ μ„ μ–Έ
    interface Flyable {
        // λͺ¨λ“  λ©”μ„œλ“œλŠ” 기본적으둜 public abstract
        void fly();
        
        // μƒμˆ˜ μ„ μ–Έ (기본적으둜 public static final)
        int MAX_SPEED = 100;
        
        // Java 8λΆ€ν„° μΆ”κ°€λœ default λ©”μ„œλ“œ (κ΅¬ν˜„ κ°€λŠ₯)
        default void land() {
            System.out.println("μ°©λ₯™ν•©λ‹ˆλ‹€.");
        }
        
        // Java 8λΆ€ν„° μΆ”κ°€λœ static λ©”μ„œλ“œ
        static void info() {
            System.out.println("λ‚  수 μžˆλŠ” 객체 μΈν„°νŽ˜μ΄μŠ€");
        }
    }
    
    // μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
    class Bird implements Flyable {
        @Override
        public void fly() {
            System.out.println("μƒˆκ°€ λ‚ μ•„κ°‘λ‹ˆλ‹€.");
        }
        
        // default λ©”μ„œλ“œ μž¬μ •μ˜ (선택적)
        @Override
        public void land() {
            System.out.println("μƒˆκ°€ λ‚˜λ­‡κ°€μ§€μ— μ•‰μŠ΅λ‹ˆλ‹€.");
        }
    }

     

    μΈν„°νŽ˜μ΄μŠ€μ˜ νŠΉμ§•

    • interface ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ
    • λͺ¨λ“  λ©”μ„œλ“œλŠ” 기본적으둜 public abstract (Java 8 이전)
    • λͺ¨λ“  ν•„λ“œλŠ” public static final (μƒμˆ˜)
    • Java 8λΆ€ν„° default λ©”μ„œλ“œμ™€ static λ©”μ„œλ“œ 포함 κ°€λŠ₯
    • ν΄λž˜μŠ€λŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ κ°€λŠ₯ (닀쀑 κ΅¬ν˜„)
    • μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™•μž₯ κ°€λŠ₯ (extends)

     

    πŸ“Œ 좔상 클래슀 vs μΈν„°νŽ˜μ΄μŠ€

    ν•­λͺ© 좔상 클래슀 μΈν„°νŽ˜μ΄μŠ€
    ν‚€μ›Œλ“œ abstract class interface
    상속/κ΅¬ν˜„ 방식 extends implements
    닀쀑 상속 ❌ (λΆˆκ°€) βœ… (μ—¬λŸ¬ 개 κ΅¬ν˜„ κ°€λŠ₯)
    ν•„λ“œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„ μ–Έ κ°€λŠ₯ μƒμˆ˜(public static final)만
    λ©”μ„œλ“œ κ΅¬ν˜„ 좔상 λ©”μ„œλ“œμ™€ 일반 λ©”μ„œλ“œ abstract, default, static λ©”μ„œλ“œ
    μ ‘κ·Ό μ œμ–΄μž
    λͺ¨λ“  μ’…λ₯˜ κ°€λŠ₯ public만 κ°€λŠ₯
    μ‚¬μš© λͺ©μ  곡톡 둜직 곡유 + ν™•μž₯μ„± μ—­ν•  λͺ…μ„Έ(κ·œμ•½) μ •μ˜

     

    πŸ’‘ μ–Έμ œ 무엇을 μ‚¬μš©ν•΄μ•Ό ν• κΉŒ?

    좔상 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” 경우:

    • 관련성이 높은 ν΄λž˜μŠ€λ“€ 간에 μ½”λ“œλ₯Ό κ³΅μœ ν•˜κ³  싢을 λ•Œ
    • 곡톡 ν•„λ“œλ‚˜ λ©”μ„œλ“œκ°€ 많고, μƒνƒœλ₯Ό κ°€μ Έμ•Ό ν•  λ•Œ
    • μ ‘κ·Ό μ œμ–΄μžλ₯Ό λ‹€μ–‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ
    • 클래슀 κ³„μΈ΅κ΅¬μ‘°μ—μ„œ "is-a" 관계일 λ•Œ

    μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” 경우:

    • 관련성이 μ—†λŠ” ν΄λž˜μŠ€λ“€μ΄ νŠΉμ • λ™μž‘μ„ κ΅¬ν˜„ν•΄μ•Ό ν•  λ•Œ
    • 닀쀑 상속이 ν•„μš”ν•  λ•Œ
    • κ΅¬ν˜„λ³΄λ‹€ **κ·œμ•½(λͺ…μ„Έ)**에 쀑점을 λ‘˜ λ•Œ
    • "can-do" 관계λ₯Ό ν‘œν˜„ν•  λ•Œ

    πŸ”Ά λ‹€ν˜•μ„±κ³Ό instanceof

    λ‹€ν˜•μ„±(Polymorphism)μ΄λž€?

    λ‹€ν˜•μ„±μ€ ν•˜λ‚˜μ˜ 객체가 μ—¬λŸ¬ νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ‘œ μ‚¬μš©λ  수 μžˆλŠ” μ„±μ§ˆμ„ λ§ν•©λ‹ˆλ‹€.

    즉, λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ μžμ‹ 객체λ₯Ό μ°Έμ‘°ν•˜λ©΄ λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ 행동할 수 μžˆμ–΄μš”!

    Animal animal = new Dog();  // λΆ€λͺ¨ νƒ€μž… = μžμ‹ 객체
    animal.sound();             // μ‹€μ œλŠ” Dog의 sound() μ‹€ν–‰

     

    λ‹€ν˜•μ„±μ˜ μ£Όμš” ν˜•νƒœ

    1. λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©: μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜
    2. μ°Έμ‘° λ³€μˆ˜μ˜ λ‹€ν˜•μ„±: λΆ€λͺ¨ νƒ€μž… μ°Έμ‘° λ³€μˆ˜λ‘œ μžμ‹ 객체λ₯Ό μ°Έμ‘°

    λ‹€ν˜•μ„±μ˜ μž₯점

    • μœ μ—°ν•œ ν”„λ‘œκ·Έλž˜λ° κ°€λŠ₯
    • μ½”λ“œ ν™•μž₯μ„± 증가
    • μœ μ§€λ³΄μˆ˜ μš©μ΄μ„± ν–₯상
    • 결합도 κ°μ†Œ

    instanceof μ—°μ‚°μž

    instanceof μ—°μ‚°μžλŠ” 객체가 νŠΉμ • 클래슀/μΈν„°νŽ˜μ΄μŠ€μ˜ μΈμŠ€ν„΄μŠ€μΈμ§€ ν™•μΈν•˜λŠ” μ—°μ‚°μžμž…λ‹ˆλ‹€.

    주둜 λ‹€ν˜•μ„± ν™˜κ²½μ—μ„œ μ‹€μ œ 객체 νƒ€μž…μ„ 확인할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

    public void printSound(Animal animal) {
        if (animal instanceof Dog) {
            System.out.println("멍멍!");
        } else if (animal instanceof Cat) {
            System.out.println("μ•Όμ˜Ή!");
        } else {
            System.out.println("동물 μ†Œλ¦¬");
        }
    }

     

    πŸ’‘ Java 16λΆ€ν„°λŠ” instanceof와 ν•¨κ»˜ νƒ€μž… μΊμŠ€νŒ…κΉŒμ§€ ν•œ μ€„λ‘œ κ°€λŠ₯ν•΄μ‘Œμ–΄μš”!
    if (obj instanceof Cat cat) { ... }

    πŸ™Œ  마무리

    μ˜€λŠ˜μ€ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ…μΈ 좔상화(Abstract)와 λ‹€ν˜•μ„±(Polymorphism)에 λŒ€ν•΄ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

     

    좔상 ν΄λž˜μŠ€λŠ” 곡톡 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³  ν™•μž₯을 μœ„ν•œ 틀을 μ œκ³΅ν•˜λ©°, μΈν„°νŽ˜μ΄μŠ€λŠ” μ—¬λŸ¬ ν΄λž˜μŠ€μ— 곡톡 λ™μž‘μ„ κ°•μ œν•˜λŠ” 계약 역할을 ν•©λ‹ˆλ‹€.

    λ‹€ν˜•μ„±μ„ 톡해 ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ λ‹€μ–‘ν•œ κ΅¬ν˜„μ²΄λ₯Ό λ‹€λ£° 수 μžˆμ–΄ μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    instanceof μ—°μ‚°μžλŠ” μ‹€ν–‰ μ‹œκ°„μ— 객체의 μ‹€μ œ νƒ€μž…μ„ ν™•μΈν•˜μ—¬ μ μ ˆν•œ 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

     

    μ΄λŸ¬ν•œ κ³ κΈ‰ 객체지ν–₯ κ°œλ…λ“€μ€ λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—μ„œ μ½”λ“œ μž¬μ‚¬μš©μ„±, μœ μ§€λ³΄μˆ˜μ„±, ν™•μž₯성을 크게 ν–₯μƒμ‹œν‚€λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.

     

    λ‹€μŒ μ‹œκ°„μ—λŠ” Java의 μ˜ˆμ™Έ μ²˜λ¦¬μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

    κΆκΈˆν•œ λ‚΄μš©μ΄λ‚˜ μΆ”κ°€λ‘œ μ•Œκ³  싢은 κ°œλ…μ΄ μžˆλ‹€λ©΄ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš” 😊

    λ°˜μ‘ν˜•