프로그래밍 공부
객체지향 프로그래밍(추상 메서드, 인터페이스 정리) 본문
추상 클래스와 인터페이스는 둘 다 자바에서 객체지향 프로그래밍의 중요한 개념으로
클래스 간의 공통된 행동을 정의하고 재사용할 수 있게 해준다.
하지만 두 개념은 설계 목적과 사용 방식에서 차이가 있다. 언제 추상 클래스를 사용하고, 언제 인터페이스를
사용하는지에 대한 가이드는 다음과 같다.
1. 상속 관계와 목적
- 추상 클래스:
- is-a 관계를 나타낼 때 사용. 상속받는 클래스들이 공통된 속성과 행동을 가질 때 적합.
- 클래스를 만들 때 일부는 구현하고 일부는 추상 메소드로 남겨서, 상속받는 클래스에서 구체적으로 구현하도록 하고 싶을 때 사용.
- 일반적으로 기본적인 동작이나 상태(필드)를 여러 클래스에 걸쳐 공유하고자 할 때 사용.
- 예를 들어, 모든 동물들이 기본적으로 가지고 있는 특성(예:
eat()
메소드,age
필드)을 정의할 때
추상 클래스를 사용.
- 인터페이스:
- 클래스가 어떤 기능을 수행할 수 있는지를 나타내는 can-do 관계를 정의할 때 사용.
특정 클래스가 여러 기능을 구현할 수 있을 때 적합. - 특정 클래스가 여러 개의 동작을 가져야 하며, 다중 상속이 필요한 경우 인터페이스를 사용.
- 예를 들어,
Flyable
인터페이스는 어떤 객체가 날 수 있는지 나타내며,Swimmable
인터페이스는
수영할 수 있는지를 나타냄.
- 클래스가 어떤 기능을 수행할 수 있는지를 나타내는 can-do 관계를 정의할 때 사용.
2. 구현 여부
- 추상 클래스:
- 일부 구현된 메소드를 포함할 수 있으며
하위 클래스에서 공통적으로 사용될 기본적인 동작을 정의할 수 있다. - 추상 클래스는 일부 필드와 메소드를 상속할 수 있다.
- 일부 구현된 메소드를 포함할 수 있으며
- 인터페이스:
- 자바 8 이전에는 메소드의 선언만 포함할 수 있었다(즉, 구현을 가질 수 없었음).
자바 8 이후로는 디폴트 메소드(기본 구현을 가진 메소드)와 정적 메소드도 포함할 수 있음. - 일반적으로 상태(필드)를 가지지 않으며, 다중 상속의 목적으로 사용.
- 자바 8 이전에는 메소드의 선언만 포함할 수 있었다(즉, 구현을 가질 수 없었음).
3. 다중 상속 가능성
- 추상 클래스:
- 단일 상속만 가능. 즉, 하나의 클래스는 하나의 추상 클래스만 상속받을 수 있음.
- 복잡한 계층 구조에서 공통된 기능을 제공하고, 서브클래스에서 이를 확장하거나 변경할 수 있다.
- 인터페이스:
- 다중 상속이 가능. 하나의 클래스가 여러 인터페이스를 구현할 수 있음.
- 클래스가 여러 다른 종류의 행동을 필요로 할 때
인터페이스를 사용하여 각각의 행동을 개별적으로 정의할 수 있다.
4. 예시 비교
추상 클래스
abstract class Animal {
int age;
void eat() {
System.out.println("This animal eats food.");
}
abstract void sound();
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Bark");
}
}
- Animal 클래스는 모든 동물이 공유하는 공통적인 상태(
age
)와 동작(eat()
)을 가지고 있으며,sound()
메소드는 각각의 동물에 따라 다르게 구현됨.
인터페이스
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("The duck is flying.");
}
@Override
public void swim() {
System.out.println("The duck is swimming.");
}
}
- Flyable과 Swimmable 인터페이스는 클래스가 특정 행동(날기, 수영하기)을 할 수 있음을 나타냅니다. Duck 클래스는 두 인터페이스를 모두 구현하여 다중 상속과 같은 효과를 얻습니다.
5. 요약
- 추상 클래스:
- 클래스의 기본적인 속성과 공통적인 기능을 정의하면서, 일부 메소드만을 하위 클래스에서 구현하도록
강제하고자 할 때 사용. - 상속 계층 구조에서 기본적인 구현을 제공하고, 클래스 간의 강한 결합을 원할 때 적합.
- 높은 단계의 구조를 제공하고 싶을때, 구현의 세세한 부분은 하위 클래스에게 맡기고 싶을 때
- 클래스의 기본적인 속성과 공통적인 기능을 정의하면서, 일부 메소드만을 하위 클래스에서 구현하도록
- 인터페이스:
- 클래스가 구현해야 할 메소드 집합을 정의하고, 다중 상속을 통해 다양한 기능을 클래스에 부여하고자
할 때 사용. - 여러 가지 독립적인 기능을 구현하도록 설계할 때 적합.
- 두 시스템(클래스, 함수)사이에 소통하기 위해 소통 방식을 정할 때
- 폐쇄형(prevate) 형으로 선언 할 수 없음
- 변수를 넣을 수 없음 → 상수만 가능
- 클래스는 여러가지 인터페이스를 상속 받아 구현가능
- 클래스가 구현해야 할 메소드 집합을 정의하고, 다중 상속을 통해 다양한 기능을 클래스에 부여하고자
즉, 인터페이스와 추상 클래스의 선택은 설계의 목적에 따라 달라지며, 다형성, 코드 재사용성, 유연성 등의
다양한 요소를 고려하여 결정됨.
'Programming > JAVA' 카테고리의 다른 글
객체지향 프로그래밍(다형성) (0) | 2024.10.08 |
---|---|
Array, ArrayLists (0) | 2024.10.08 |
객체지향 프로그래밍(인터페이스) (0) | 2024.10.08 |
객체지향 프로그래밍(추상 클래스) (0) | 2024.10.08 |
객체지향 프로그래밍(클래스) (0) | 2024.10.08 |
Comments