Java 상속과 인터페이스의 차이점
Java에서 객체지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념 중 하나는 **상속(Inheritance)과 인터페이스(Interface)**이다. 두 개념 모두 코드의 재사용성과 확장성을 높이고 다형성을 구현하는 데 중요한 역할을 하지만, 각각의 목적과 동작 방식에는 여러 차이점이 있다.
본 글에서는 상속과 인터페이스의 개념, 특징, 차이점, 그리고 실제 활용 사례를 포함하여 자세히 설명하겠다.
1. 상속(Inheritance)
1.1 상속의 개념
상속은 기존 클래스(부모 클래스, 슈퍼 클래스)의 속성과 메서드를 새로운 클래스(자식 클래스, 서브 클래스)가 물려받아 사용할 수 있도록 하는 기능이다. 이를 통해 코드의 재사용성을 높이고 유지보수를 용이하게 할 수 있다.
Java에서 상속을 구현할 때는 extends 키워드를 사용한다.
class Parent {
String name = "부모 클래스";
void display() {
System.out.println("부모 클래스의 메서드");
}
}
class Child extends Parent {
String childName = "자식 클래스";
void show() {
System.out.println("자식 클래스의 메서드");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display(); // 부모 클래스의 메서드 호출
System.out.println(child.name); // 부모 클래스의 필드 접근
child.show(); // 자식 클래스의 메서드 호출
}
}
위 코드에서 Child 클래스는 Parent 클래스를 상속받아 name 필드와 display() 메서드를 그대로 사용할 수 있다.
1.2 상속의 특징
- 코드 재사용성 증가
- 부모 클래스의 멤버(필드 및 메서드)를 자식 클래스에서 사용할 수 있어, 코드 중복을 줄일 수 있다.
- IS-A 관계
- 상속은 "IS-A 관계"를 가진다. 즉, 자식 클래스는 부모 클래스의 일종이다.
- 예를 들어, Dog extends Animal이라면 Dog는 Animal의 한 종류라고 볼 수 있다.
- 단일 상속(Single Inheritance)
- Java는 다중 상속을 지원하지 않는다. 즉, 하나의 클래스는 오직 하나의 부모 클래스만 가질 수 있다.
- 다중 상속을 허용하면 **다이아몬드 문제(Diamond Problem)**가 발생할 위험이 있기 때문에 이를 방지하기 위해 단일 상속만 허용한다.
- 메서드 오버라이딩(Method Overriding)
- 자식 클래스에서 부모 클래스의 메서드를 재정의(Override)할 수 있다.
class Parent {
void display() {
System.out.println("부모 클래스 메서드");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("자식 클래스에서 오버라이딩한 메서드");
}
}
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display(); // "자식 클래스에서 오버라이딩한 메서드" 출력
}
}
2. 인터페이스(Interface)
2.1 인터페이스의 개념
인터페이스는 클래스가 반드시 구현해야 하는 메서드의 집합을 정의하는 일종의 청사진(blueprint)이다.
Java에서 인터페이스를 정의할 때는 interface 키워드를 사용하며, 클래스는 implements 키워드를 이용해 인터페이스를 구현할 수 있다.
interface Animal {
void makeSound(); // 추상 메서드 (구현 X)
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // "멍멍!" 출력
}
}
위 코드에서 Animal 인터페이스는 makeSound()라는 메서드를 정의하고 있으며, Dog 클래스는 이를 반드시 구현해야 한다.
2.2 인터페이스의 특징
- 메서드의 강제 구현
- 인터페이스를 구현하는 클래스는 반드시 인터페이스의 모든 메서드를 구현해야 한다.
- 다중 구현(Multiple Inheritance)
- Java는 클래스의 다중 상속을 허용하지 않지만, 인터페이스는 여러 개를 동시에 구현할 수 있다.
interface A {
void methodA();
}
interface B {
void methodB();
}
class C implements A, B {
@Override
public void methodA() {
System.out.println("methodA 구현");
}
@Override
public void methodB() {
System.out.println("methodB 구현");
}
}
public class Main {
public static void main(String[] args) {
C obj = new C();
obj.methodA();
obj.methodB();
}
}
- "CAN-DO" 관계
- 인터페이스는 "CAN-DO" 관계를 표현한다. 예를 들어, Flyable 인터페이스가 있다면, 이를 구현한 클래스는 "날 수 있다"는 의미를 가지게 된다.
- 디폴트 메서드(Default Method)와 정적 메서드(Static Method) 지원
- Java 8 이후부터 인터페이스에서도 구현된 메서드(디폴트 메서드)를 가질 수 있다.
interface MyInterface {
default void defaultMethod() {
System.out.println("디폴트 메서드 실행");
}
}
class MyClass implements MyInterface {}
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass();
obj.defaultMethod(); // "디폴트 메서드 실행" 출력
}
}
3. 상속과 인터페이스의 차이점
비교 항목 상속 (Inheritance) 인터페이스 (Interface)
키워드 | extends | implements |
다중 상속 | 불가능 | 가능 (여러 개의 인터페이스 구현 가능) |
목적 | 코드 재사용 및 확장 | 특정 기능 강제 구현 |
IS-A / CAN-DO | "IS-A 관계" | "CAN-DO 관계" |
필드 사용 | 가능 (멤버 변수 가짐) | 불가능 (기본적으로 상수만 선언 가능) |
메서드 구현 | 구현 가능 | 기본적으로 구현 X (단, Java 8 이후부터 디폴트 메서드 허용) |
4. 상속과 인터페이스의 활용 사례
4.1 상속 활용 사례
- Animal 클래스를 상속받아 Dog, Cat 등의 구체적인 클래스 구현
- GUI 라이브러리에서 JFrame을 상속하여 새로운 윈도우 창 구현
- 공통적인 기능을 가진 유사한 클래스에서 코드 중복 제거
4.2 인터페이스 활용 사례
- Runnable 인터페이스를 사용한 멀티스레드 구현
- Comparable 인터페이스를 활용한 객체 정렬
- Flyable, Swimmable 등의 기능을 나타내는 인터페이스 구현
5. 결론
상속과 인터페이스는 각각 다른 목적을 가지며, 적절한 상황에서 선택하여 사용해야 한다. 상속은 IS-A 관계를 나타내며, 인터페이스는 CAN-DO 관계를 나타낸다.
일반적으로 공통적인 기능을 공유할 때는 상속을 사용하고, 특정 기능을 강제하고 싶을 때는 인터페이스를 사용하는 것이 좋다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
RPA란? (UiPath, Brity 등) (0) | 2025.03.06 |
---|---|
대만 타이중 맛집투어(라고 쓰고 피할 가게 알려드림) (0) | 2025.03.05 |
[HTML] iframe이란? (0) | 2025.02.27 |
구글 시크릿모드란? (특징, 사용법 등) (0) | 2025.02.24 |
애자일 스크럼(Scrum) 기법이란? (0) | 2025.02.17 |