
추상화(Abstraction)란?
추상화는 복잡한 현실 세계의 객체를 프로그램에서 다루기 쉽도록 필수적인 속성과 기능만을 남기고, 세부 사항은 감추는 과정입니다. 객체의 중요한 속성에 집중하고, 불필요한 세부 사항을 감춰서 설계의 간결함을 유지할 수 있습니다. 이는 객체지향의 중요한 개념 중 하나로 프로그램의 유지보수성을 높이고, 향후 확장성을 고려한 설계를 가능하게 합니다.
추상 클래스 개념 및 작성 방법
추상 클래스는 공통적인 속성이나 메서드를 정의하는 동시에, 일부는 구체적으로 구현하지 않고 하위 클래스에서 구현을 강제하는 클래스입니다. 추상 클래스는 직접 인스턴스를 생성할 수 없고, 반드시 상속받은 자식 클래스에서 구체화되어야 합니다. 추상 클래스는 abstract 키워드를 사용해서 정의합니다. 추상 클래스는 구체적이지 않은 동작을 구현할 때 유용하며, 상속받은 클래스들이 구체적인 동작을 정의할 수 있게 합니다. 추상 메서드는 선언만 있고, 구체적인 구현은 하지 않은 메서드입니다. 이를 상속받은 클래스는 반드시 이 메서드를 구현해야 합니다.
abstract class Animal {
String name;
// 추상 메서드: 자식 클래스에서 구현해야 함
abstract void sound();
// 일반 메서드: 모든 하위 클래스에서 사용 가능
void eat() {
System.out.println("동물이 먹고 있습니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
추상 클래스의 특징
- 부분 구현 가능 : 이미 구현된 메서드와 추상 메서드를 함께 가질 수 있습니다.
- 상속을 통한 확장성 : 자식 클래스에서 추상 메서드를 구현해서 기능을 확장할 수 있습니다.
- 필드 포함 가능 : 상태(필드)를 정의하여 모든 하위 클래스에서 공통적으로 사용될 속성을 가질 수 있습니다.
인터페이스(Interface) - 다중 상속의 대안
인터페이스는 클래스가 따라야 하는 행동의 규약을 정의합니다. 인터페이스는 모든 메서드가 추상 메서드이기 때문에, 인터페이스를 구현하는 클래스가 그 메서드를 반드시 구현해야 합니다. 자바에서는 인터페이스로 다중 상속을 가능하게 해주며, 이를 통해 객체의 유연성을 높일 수 있습니다. 인터페이스는 클래스와 비슷하지만, 구현해야 할 메서드의 선언만을 포함하고 있으며, 그 메서드들은 반드시 구현 클래스에서 구현해야 합니다. 클래스는 implements 키워드를 사용해서 하나 이상의 인터페이스를 구현할 수 있습니다. 이를 통해 여러 행동 규약을 구현할 수 있게 되어 다중 상속의 효과를 누릴 수 있습니다. 그리고 인터페이스 자체로는 객체를 생성할 수 없습니다.
interface Animal {
void sound(); // 인터페이스의 메서드는 기본적으로 추상적
}
class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
인터페이스의 특징
- 다중 상속 가능 : 여러 인터페이스를 구현할 수 있으며, 이를 통해 다중 상속을 가능하게 할 수 있습니다.
- 코드의 유연성 : 인터페이스를 통해 객체의 구현을 바꾸지 않아도 기능을 확장하거나 교체할 수 있습니다.
- 계약에 의한 설계 : 인터페이스는 구현하는 클래스들이 반드시 필요한 메서드를 포함하도록 강제합니다.
디폴트 메서드와 static 메서드
자바 8부터는 인터페이스에서도 default 메서드와 static 메서드를 사용할 수 있습니다. default 메서드는 인터페이스 내에서 구현된 메서드이며, static 메서드는 객체 생성 없이 호출할 수 있습니다.
interface Animal {
void sound();
default void eat() {
System.out.println("동물이 먹고 있습니다.");
}
static void info() {
System.out.println("이것은 Animal 인터페이스입니다.");
}
}
추상 클래스와 인터페이스의 차이
- 목적
- 추상 클래스 : 공통된 속성 및 메서드의 부분 구현을 제공합니다.
- 인터페이스 : 행동 규약을 정의하고 구현을 강제합니다.
- 메서드
- 추상 클래스 : 추상 메서드와 일반 메서드를 함께 가집니다.
- 인터페이스 : default 메서드를 제외하고 추상 메서드만을 가집니다.
- 필드
- 추상 클래스 : 필드를 포함할 수 있습니다.
- 인터페이스 : 필드를 가질 수 없습니다.
- 상속
- 추상 클래스 : 단일 상속만 가능합니다.
- 인터페이스 : 다중 상속이 가능합니다.
추상 클래스의 활용 예시
추상 클래스는 상속 관계가 깊고, 여러 자식 클래스가 공통된 속성과 메서드를 재사용할 때 유리합니다.
abstract class Animal {
String name;
abstract void sound();
void eat() {
System.out.println("동물이 먹습니다.");
}
}
class Bird extends Animal {
@Override
void sound() {
System.out.println("짹짹");
}
}
인터페이스 활용 예시
인터페이스는 특정 기능을 여러 클래스에서 일관되게 적용하고 싶을 때 유용합니다.
interface Flyable {
void fly();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("새가 날아갑니다.");
}
}
class Airplane implements Flyable {
@Override
public void fly() {
System.out.println("비행기가 날아갑니다.");
}
}
추상화를 통한 설계의 유연성
추상화는 상위 클래스에서 공통적인 부분을 정의하고, 하위 클래스에서 세부 사항을 구현하게 하여 설계의 유연성을 제공합니다. 또한, 인터페이스를 통해 특정 동작을 여러 클래스에서 구현하게 하여 객체 간의 결합도를 낮출 수 있습니다. 이를 통해 코드의 확장성과 유지보수성을 높일 수 있습니다. 추상화와 인터페이스를 적절히 활용하면 복잡한 프로그램을 간결하고 유연하게 설계할 수 있습니다. 추상화는 설계의 유연성을 제공하고, 인터페이스는 다중 상속의 유연성을 보완합니다.
'📝 프로그래밍 패러다임 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향 프로그래밍] 캡슐화 - 데이터 보호와 정보 은닉의 핵심 원리 (0) | 2024.09.20 |
---|---|
[객체지향 프로그래밍] 다형성 - 다양한 형태의 객체를 다루는 방법 (0) | 2024.09.18 |
[객체지향 프로그래밍] 상속 - 코드의 재사용 (0) | 2024.09.17 |
객체지향 프로그래밍의 핵심 : 클래스와 객체 (0) | 2024.09.17 |
절차지향을 넘어 객체지향으로 (0) | 2024.09.09 |

추상화(Abstraction)란?
추상화는 복잡한 현실 세계의 객체를 프로그램에서 다루기 쉽도록 필수적인 속성과 기능만을 남기고, 세부 사항은 감추는 과정입니다. 객체의 중요한 속성에 집중하고, 불필요한 세부 사항을 감춰서 설계의 간결함을 유지할 수 있습니다. 이는 객체지향의 중요한 개념 중 하나로 프로그램의 유지보수성을 높이고, 향후 확장성을 고려한 설계를 가능하게 합니다.
추상 클래스 개념 및 작성 방법
추상 클래스는 공통적인 속성이나 메서드를 정의하는 동시에, 일부는 구체적으로 구현하지 않고 하위 클래스에서 구현을 강제하는 클래스입니다. 추상 클래스는 직접 인스턴스를 생성할 수 없고, 반드시 상속받은 자식 클래스에서 구체화되어야 합니다. 추상 클래스는 abstract 키워드를 사용해서 정의합니다. 추상 클래스는 구체적이지 않은 동작을 구현할 때 유용하며, 상속받은 클래스들이 구체적인 동작을 정의할 수 있게 합니다. 추상 메서드는 선언만 있고, 구체적인 구현은 하지 않은 메서드입니다. 이를 상속받은 클래스는 반드시 이 메서드를 구현해야 합니다.
abstract class Animal {
String name;
// 추상 메서드: 자식 클래스에서 구현해야 함
abstract void sound();
// 일반 메서드: 모든 하위 클래스에서 사용 가능
void eat() {
System.out.println("동물이 먹고 있습니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
추상 클래스의 특징
- 부분 구현 가능 : 이미 구현된 메서드와 추상 메서드를 함께 가질 수 있습니다.
- 상속을 통한 확장성 : 자식 클래스에서 추상 메서드를 구현해서 기능을 확장할 수 있습니다.
- 필드 포함 가능 : 상태(필드)를 정의하여 모든 하위 클래스에서 공통적으로 사용될 속성을 가질 수 있습니다.
인터페이스(Interface) - 다중 상속의 대안
인터페이스는 클래스가 따라야 하는 행동의 규약을 정의합니다. 인터페이스는 모든 메서드가 추상 메서드이기 때문에, 인터페이스를 구현하는 클래스가 그 메서드를 반드시 구현해야 합니다. 자바에서는 인터페이스로 다중 상속을 가능하게 해주며, 이를 통해 객체의 유연성을 높일 수 있습니다. 인터페이스는 클래스와 비슷하지만, 구현해야 할 메서드의 선언만을 포함하고 있으며, 그 메서드들은 반드시 구현 클래스에서 구현해야 합니다. 클래스는 implements 키워드를 사용해서 하나 이상의 인터페이스를 구현할 수 있습니다. 이를 통해 여러 행동 규약을 구현할 수 있게 되어 다중 상속의 효과를 누릴 수 있습니다. 그리고 인터페이스 자체로는 객체를 생성할 수 없습니다.
interface Animal {
void sound(); // 인터페이스의 메서드는 기본적으로 추상적
}
class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
}
인터페이스의 특징
- 다중 상속 가능 : 여러 인터페이스를 구현할 수 있으며, 이를 통해 다중 상속을 가능하게 할 수 있습니다.
- 코드의 유연성 : 인터페이스를 통해 객체의 구현을 바꾸지 않아도 기능을 확장하거나 교체할 수 있습니다.
- 계약에 의한 설계 : 인터페이스는 구현하는 클래스들이 반드시 필요한 메서드를 포함하도록 강제합니다.
디폴트 메서드와 static 메서드
자바 8부터는 인터페이스에서도 default 메서드와 static 메서드를 사용할 수 있습니다. default 메서드는 인터페이스 내에서 구현된 메서드이며, static 메서드는 객체 생성 없이 호출할 수 있습니다.
interface Animal {
void sound();
default void eat() {
System.out.println("동물이 먹고 있습니다.");
}
static void info() {
System.out.println("이것은 Animal 인터페이스입니다.");
}
}
추상 클래스와 인터페이스의 차이
- 목적
- 추상 클래스 : 공통된 속성 및 메서드의 부분 구현을 제공합니다.
- 인터페이스 : 행동 규약을 정의하고 구현을 강제합니다.
- 메서드
- 추상 클래스 : 추상 메서드와 일반 메서드를 함께 가집니다.
- 인터페이스 : default 메서드를 제외하고 추상 메서드만을 가집니다.
- 필드
- 추상 클래스 : 필드를 포함할 수 있습니다.
- 인터페이스 : 필드를 가질 수 없습니다.
- 상속
- 추상 클래스 : 단일 상속만 가능합니다.
- 인터페이스 : 다중 상속이 가능합니다.
추상 클래스의 활용 예시
추상 클래스는 상속 관계가 깊고, 여러 자식 클래스가 공통된 속성과 메서드를 재사용할 때 유리합니다.
abstract class Animal {
String name;
abstract void sound();
void eat() {
System.out.println("동물이 먹습니다.");
}
}
class Bird extends Animal {
@Override
void sound() {
System.out.println("짹짹");
}
}
인터페이스 활용 예시
인터페이스는 특정 기능을 여러 클래스에서 일관되게 적용하고 싶을 때 유용합니다.
interface Flyable {
void fly();
}
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("새가 날아갑니다.");
}
}
class Airplane implements Flyable {
@Override
public void fly() {
System.out.println("비행기가 날아갑니다.");
}
}
추상화를 통한 설계의 유연성
추상화는 상위 클래스에서 공통적인 부분을 정의하고, 하위 클래스에서 세부 사항을 구현하게 하여 설계의 유연성을 제공합니다. 또한, 인터페이스를 통해 특정 동작을 여러 클래스에서 구현하게 하여 객체 간의 결합도를 낮출 수 있습니다. 이를 통해 코드의 확장성과 유지보수성을 높일 수 있습니다. 추상화와 인터페이스를 적절히 활용하면 복잡한 프로그램을 간결하고 유연하게 설계할 수 있습니다. 추상화는 설계의 유연성을 제공하고, 인터페이스는 다중 상속의 유연성을 보완합니다.
'📝 프로그래밍 패러다임 > 객체지향프로그래밍' 카테고리의 다른 글
[객체지향 프로그래밍] 캡슐화 - 데이터 보호와 정보 은닉의 핵심 원리 (0) | 2024.09.20 |
---|---|
[객체지향 프로그래밍] 다형성 - 다양한 형태의 객체를 다루는 방법 (0) | 2024.09.18 |
[객체지향 프로그래밍] 상속 - 코드의 재사용 (0) | 2024.09.17 |
객체지향 프로그래밍의 핵심 : 클래스와 객체 (0) | 2024.09.17 |
절차지향을 넘어 객체지향으로 (0) | 2024.09.09 |