자바에서 추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 중요한 역할을 담당합니다. 이들을 사용하면 다양한 문제를 해결할 수 있습니다. 이번 포스트에서는 자바 추상 클래스와 인터페이스의 사용 예시를 알아보겠습니다.
1. 추상 클래스
추상 클래스는 인스턴스를 직접 생성할 수 없고, 상속을 통해 사용됩니다. 추상 클래스는 일반 클래스와 비슷한 멤버 변수, 메서드 등을 가질 수 있지만, 하나 이상의 추상 메서드를 가지고 있어서 추상 메서드를 구현하는 자식 클래스를 만들어야 합니다.
예를 들어, 동물을 다루는 프로그램에서 추상 클래스인 동물
클래스를 정의할 수 있습니다. 동물
클래스는 소리()
라는 추상 메서드를 가지고 있고, 이를 상속받은 실제 동물 클래스에서는 소리()
메서드를 구현해야 합니다. 이렇게 함으로써 동물
클래스는 동물의 공통적인 특성과 기능을 가지고 있으면서, 각각의 동물은 자신만의 특별한 소리를 낼 수 있도록 할 수 있습니다.
abstract class 동물 {
abstract void 소리();
}
class 강아지 extends 동물 {
void 소리() {
System.out.println("멍멍");
}
}
class 고양이 extends 동물 {
void 소리() {
System.out.println("야옹");
}
}
public class Main {
public static void main(String[] args) {
동물 강아지 = new 강아지();
강아지.소리(); // 멍멍
동물 고양이 = new 고양이();
고양이.소리(); // 야옹
}
}
이 예시에서 추상 클래스를 사용하여 동물의 공통 기능을 추상화하고, 실제 동물 클래스에서 이를 구현함으로써 코드의 재사용성과 유연성이 높아집니다.
2. 인터페이스
인터페이스는 추상 클래스와 마찬가지로 인스턴스를 직접 생성할 수 없고, 구현 클래스를 통해 사용됩니다. 인터페이스는 클래스가 가져야 하는 메서드들의 집합을 정의합니다. 이를 통해 다중 상속과 관련된 문제를 해결하고, 클래스 간의 관계를 유연하게 구성할 수 있습니다.
예를 들어, 전자기기의 전원을 켜고 끄는 기능을 갖춘 인터페이스인 전원
을 정의할 수 있습니다. 이 전원
인터페이스를 구현하는 클래스들은 각자의 방식으로 전원을 제어할 수 있습니다. 이렇게 하면 전자기기 클래스들은 공통된 전원 기능을 가지고 있으면서, 각각의 클래스에서는 독립적으로 전원을 제어할 수 있게 됩니다.
interface 전원 {
void 전원켜기();
void 전원끄기();
}
class TV implements 전원 {
public void 전원켜기() {
System.out.println("TV 전원을 켭니다.");
}
public void 전원끄기() {
System.out.println("TV 전원을 끕니다.");
}
}
class 컴퓨터 implements 전원 {
public void 전원켜기() {
System.out.println("컴퓨터 전원을 켭니다.");
}
public void 전원끄기() {
System.out.println("컴퓨터 전원을 끕니다.");
}
}
public class Main {
public static void main(String[] args) {
전원 tv = new TV();
tv.전원켜기(); // TV 전원을 켭니다.
전원 computer = new 컴퓨터();
computer.전원켜기(); // 컴퓨터 전원을 켭니다.
}
}
인터페이스를 사용하여 클래스 간의 관계를 구성함으로써, 클래스를 더욱 유연하게 설계할 수 있고, 코드의 재사용성과 확장성을 높일 수 있습니다.
결론
자바에서 추상 클래스와 인터페이스는 다양한 문제를 해결하는 데 도움을 줍니다. 추상 클래스는 공통 기능을 추상화하여 상속을 통해 자식 클래스에서 사용할 수 있게 하며, 인터페이스는 클래스 간의 관계를 유연하게 구성하고 다중 상속 문제를 해결할 수 있습니다. 이러한 기능들을 적절히 활용하여 프로그램을 설계하면 유지보수성과 확장성이 높은 코드를 작성할 수 있습니다.
끝