코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java Abstraction

자바 추상화 (Java Abstraction): 개념 및 사용법

  • *추상화(Abstraction)**는 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나로, 복잡한 시스템에서 불필요한 세부 사항을 숨기고, 중요한 정보만을 외부에 제공하는 방법을 말합니다. 자바에서 추상화는 주로 **추상 클래스(Abstract Class)**와 **인터페이스(Interface)**를 통해 구현됩니다.

이 글에서는 자바에서의 추상화 개념, 추상 클래스와 인터페이스의 사용법, 차이점 및 관련 예제를 다룹니다.

1. 추상화란?

추상화는 객체의 복잡한 구현을 숨기고, 사용자에게 필요한 인터페이스만을 제공하는 것을 의미합니다. 이를 통해 코드의 복잡성을 줄이고, 재사용성을 높일 수 있습니다. 자바에서 추상화는 주로 두 가지 방식으로 구현됩니다:

  1. 추상 클래스(Abstract Class): 일반 클래스와 비슷하지만, 구현되지 않은 메서드를 포함할 수 있습니다.
  2. 인터페이스(Interface): 모든 메서드가 구현되지 않은 순수한 설계도입니다.

추상화의 장점

  • 복잡성 감소: 추상화를 통해 복잡한 시스템에서 꼭 필요한 부분만 외부에 노출시킴으로써 코드의 복잡성을 줄일 수 있습니다.
  • 유지보수 용이성: 변경이 필요한 부분을 추상화 레벨에서 정의하여, 세부 구현에 의존하지 않고 수정이 가능합니다.
  • 확장성: 추상화된 인터페이스나 클래스는 쉽게 확장하거나 새로운 기능을 추가할 수 있습니다.

2. 추상 클래스 (Abstract Class)

추상 클래스는 클래스이지만, 하나 이상의 **추상 메서드(Abstract Method)**를 포함할 수 있습니다. 추상 메서드는 메서드의 선언만 있고, 실제 구현은 하위 클래스에서 제공해야 합니다. 추상 클래스 자체로는 인스턴스를 생성할 수 없으며, 이를 상속받아 구현한 자식 클래스를 통해 인스턴스를 생성합니다.

추상 클래스의 특징

  • 추상 클래스는 인스턴스화할 수 없다.
  • 추상 메서드는 구현되지 않은 메서드로, 하위 클래스에서 반드시 오버라이딩하여 구현해야 한다.
  • 추상 클래스는 추상 메서드 외에도 일반 메서드필드를 가질 수 있다.
  • 하위 클래스는 추상 클래스의 모든 추상 메서드를 반드시 구현해야 한다.

추상 클래스 선언

abstract class Animal {
    // 추상 메서드 (구현 없음)
    public abstract void sound();

    // 일반 메서드 (구현 있음)
    public void sleep() {
        System.out.println("Sleeping...");
    }
}

추상 클래스 사용 예제

// 추상 클래스 Animal
abstract class Animal {
    // 추상 메서드 (구현 없음)
    public abstract void sound();

    // 일반 메서드
    public void sleep() {
        System.out.println("Sleeping...");
    }
}

// Dog 클래스는 Animal을 상속받아 추상 메서드를 구현함
class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Bark");
    }
}

// Cat 클래스도 추상 메서드를 구현함
class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        // 추상 클래스는 인스턴스를 생성할 수 없음
        // Animal animal = new Animal();  // 오류 발생

        // Dog와 Cat 클래스의 인스턴스를 생성
        Animal dog = new Dog();
        Animal cat = new Cat();

        // 각 클래스의 구현된 메서드 호출
        dog.sound();  // 출력: Bark
        cat.sound();  // 출력: Meow

        // 공통된 메서드 호출
        dog.sleep();  // 출력: Sleeping...
    }
}

결과:

Bark
Meow
Sleeping...

위 예제에서 Animal 클래스는 추상 클래스이며, sound() 메서드는 추상 메서드로 선언되었습니다. DogCat 클래스는 Animal 클래스를 상속받아 각각 sound() 메서드를 구현하였습니다.

3. 인터페이스 (Interface)

  • *인터페이스(Interface)**는 모든 메서드가 구현되지 않은 추상적인 틀입니다. 인터페이스는 구현만을 제공하며, 실제 구현은 이를 구현하는 클래스에서 정의됩니다. 자바에서는 다중 상속을 지원하지 않지만, 인터페이스를 통해 여러 인터페이스를 구현할 수 있습니다.

인터페이스의 특징

  • 인터페이스의 모든 메서드는 기본적으로 추상 메서드입니다. (자바 8 이후에는 기본 메서드와 정적 메서드를 가질 수 있음)
  • 인터페이스에 정의된 모든 필드는 상수(public, static, final)로 선언됩니다.
  • 다중 구현이 가능하므로, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다.

인터페이스 선언

interface Animal {
    // 추상 메서드
    void sound();

    // 자바 8 이후에는 기본 메서드 사용 가능
    default void sleep() {
        System.out.println("Sleeping...");
    }
}

인터페이스 사용 예제

// 인터페이스 Animal
interface Animal {
    // 추상 메서드
    void sound();

    // 기본 메서드 (Java 8 이후)
    default void sleep() {
        System.out.println("Sleeping...");
    }
}

// Dog 클래스는 Animal 인터페이스를 구현함
class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("Bark");
    }
}

// Cat 클래스도 Animal 인터페이스를 구현함
class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("Meow");
    }
}

public class Main {
    public static void main(String[] args) {
        // 인터페이스 타입으로 객체를 참조
        Animal dog = new Dog();
        Animal cat = new Cat();

        // 각 클래스의 구현된 메서드 호출
        dog.sound();  // 출력: Bark
        cat.sound();  // 출력: Meow

        // 공통된 기본 메서드 호출
        dog.sleep();  // 출력: Sleeping...
    }
}

결과:

Bark
Meow
Sleeping...

위 예제에서 Animal 인터페이스는 sound()라는 추상 메서드를 가지고 있습니다. DogCat 클래스는 Animal 인터페이스를 구현하고, 각자 sound() 메서드를 정의하였습니다. 인터페이스를 구현하는 클래스는 반드시 인터페이스의 모든 추상 메서드를 구현해야 합니다.

4. 추상 클래스와 인터페이스의 차이점

특징 추상 클래스 인터페이스
사용 목적 공통 기능을 제공하고, 일부는 구현 가능 클래스가 따라야 할 규격을 정의, 모든 메서드는 구현되지 않음
메서드 추상 메서드와 일반 메서드 모두 가질 수 있음 모든 메서드는 추상 메서드 (Java 8 이후 기본 메서드 가능)
필드 인스턴스 필드와 정적 필드 모두 가질 수 있음 상수만 가질 수 있음 (public, static, final)
상속 단일 상속 (하나의 부모 클래스만 상속 가능) 다중 구현 가능 (여러 인터페이스를 구현 가능)
인스턴스화 인스턴스화 불가 (하위 클래스에서만 인스턴스화 가능) 인스턴스화 불가
사용 사례 같은 계열의 클래스들에 대해 기본 기능을 제공할 때 사용 서로 관련 없는 클래스에 동일한 기능을 구현할 때 사용

5. 추상화의 장점

1. 복잡성 감소

추상화를 통해 복잡한 세부 사항을 숨기고, 외부에서는 꼭 필요한 정보만 제공할 수 있습니다. 이를 통해 코드의 복잡성을 줄일 수 있습니다.

2. 코드 재사용성

추상 클래스나 인터페이스를 통해 공통된 기능을 여러 클래스에서 재사용할 수 있습니다. 이를 통해 코드 중복을 줄이고, 유지보수성을 높일 수 있습니다.

3. 유연한 설계

인터페이스를 사용하면 다중 상속이 불가능한 자바에서 여러 클래스가 동일한 기능을 구현할 수 있도록 설계할 수 있습니다. 이를 통해 시스템의 유연성을 높일 수 있습니다.

요약

  • *추상화(Abstraction)**는 복잡한 시스템에서 중요한 기능만을 외부에 제공하고, 불필요한 세부 사항을 숨기는 OOP의 핵심

개념입니다.

  • 자바에서는 추상 클래스인터페이스를 통해 추상화를 구현할 수 있습니다.
    • 추상 클래스는 추상 메서드와 일반 메서드를 모두 가질 수 있으며, 인스턴스화할 수 없습니다.
    • 인터페이스는 추상 메서드만을 제공하며, 여러 개의 인터페이스를 한 클래스에서 구현할 수 있습니다.
  • 추상화는 복잡성 감소, 코드 재사용성 증가, 유연한 설계를 가능하게 합니다.

자바에서 추상화를 적절히 사용하면, 더 유연하고 확장 가능한 코드를 작성할 수 있으며, 여러 클래스에서 공통된 기능을 재사용할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com