객체 지향 프로그래밍의 특징 중 하나인 추상화(Abstraction)은 자바에서 추상 클래스와 인터페이스로 구현됩니다.
추상 클래스
// 추상 클래스 Animal
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
// 추상 메서드
public abstract void speak();
}
// 추상 클래스 Animal을 상속하는 Dog 클래스
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
// 추상 메서드 구현
@Override
public void speak() {
System.out.println("멍멍!");
}
}
// 추상 클래스 Animal을 상속하는 Cat 클래스
public class Cat extends Animal {
public Cat(String name) {
super(name);
}
// 추상 메서드 구현
@Override
public void speak() {
System.out.println("야옹~");
}
}
-클래스 내 '추상 메서드'를 하나 이상 가지고 있고, abstract 키워드를 이용해 정의된 클래스입니다.
-추상 메서드는 메서드의 선언부만 있고, 구현부는 없는 메서드를 말합니다. 클래스가 설계도라면, 추상 클래스는 일종의 '미완성 설계도'입니다. 따라서 인스턴스를 생성할 수 없습니다.
-추상 클래스는 새로운 클래스를 작성하는데 바탕이 되는 조상 클래스로서 중요한 의미를 갖습니다. 서로 다른 클래스들의 공통적인 특징을 추출한 추상 클래스를 이용하면, 이를 상속 받은 각각의 하위 클래스를 효율적으로 구현할 수 있습니다.
-자바에서는 다중 상속의 모호성 때문에 단일 상속만 가능합니다.
위의 코드는 Animal 추상 클래스를 정의하고, Dog와 Cat 클래스에서 상속받아 추상 메소드인 speak()를 구현하는 예시입니다. Animal 클래스에서는 getName() 메소드를 정의하여 하위 클래스에서 사용할 수 있게 합니다.
인터페이스
// Shape 인터페이스
public interface Shape {
// 면적 구하는 메서드
double getArea();
// 둘레 구하는 메서드
double getPerimeter();
}
// Shape 인터페이스를 구현한 Circle 클래스
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
// Shape 인터페이스를 구현한 Rectangle 클래스
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
}
-클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상 자료형입니다.
-추상 메서드와 상수(constant)만을 구성 요소로 가질 수 있습니다.
-추상 클래스보다 추상화 정도가 높으며, 구현된 것은 아무 것도 없고 밑그림만 그려진 '기본 설계도'라고 할 수 있습니다.
-다중 상속을 지원합니다.
위의 코드는 Shape 인터페이스를 정의하고, Circle과 Rectangle 클래스에서 구현하는 예시입니다. Shape 인터페이스에서는 getArea()와 getPerimeter() 메소드를 추상 메소드로 정의합니다. Circle과 Rectangle 클래스에서는 이 두 메소드를 구현하여 면적과 둘레 길이를 계산합니다.
*추상 클래스와 인터페이스는 존재 목적이 다릅니다.
-추상 클래스의 존재 목적은 해당 추상 클래스를 상속받아 그 기능을 이용하고 확장시키는 것에 있습니다.
-반면 인터페이스는 메서드의 껍데기만 존재하는데, 이는 그 메서드의 구현을 강제하기 위함입니다. 메서드의 구현을 강제함으로써 구현 객체의 동일한 동작을 보장하는 것입니다.
-즉, 추상 클래스는 기존 기능의 재사용, 인터페이스는 설계를 강제하는 것에 목적을 두었다고 할 수 있습니다.
'java(자바)' 카테고리의 다른 글
[java(자바)] 자바에서 다중 상속을 허용하지 않는 이유 _디버깅의 눈물 (0) | 2023.03.23 |
---|---|
[java(자바)] 상속(extends) vs 구현(implements) _디버깅의 눈물 (0) | 2023.03.22 |
[java(자바)] 오버로딩과 오버라이딩의 차이 _디버깅의 눈물 (0) | 2023.03.20 |
[java(자바)] 클래스, 객체, 인스턴스란? _디버깅의 눈물 (0) | 2023.03.19 |
[java(자바)] 객체 지향의 주요 특징-캡슐화, 상속, 다형성, 추상화 _디버깅의 눈물 (0) | 2023.03.18 |