Java에서 extends와 implements 키워드는 객체지향 프로그래밍(OOP) 개념에서 중요한 역할을 하며, 각각 클래스 상속과 인터페이스 구현에 사용됩니다. 두 개념을 명확히 이해하면 Java의 객체지향적인 설계를 보다 효율적으로 할 수 있습니다.
이제 extends와 implements의 차이를 자세하게 설명하겠습니다.
1. extends와 implements의 개념
1.1 extends 키워드
extends는 클래스가 다른 클래스를 상속받을 때 사용됩니다. Java는 단일 상속(single inheritance)만을 지원하므로, 한 클래스는 오직 하나의 부모 클래스만 상속할 수 있습니다.
특징
- 부모 클래스(상위 클래스, Superclass)의 필드와 메서드를 자식 클래스(하위 클래스, Subclass)에서 사용할 수 있습니다.
- 부모 클래스의 기능을 재사용하면서도 새로운 기능을 추가할 수 있습니다.
- 부모 클래스의 메서드를 오버라이딩(Overriding)하여 동작을 변경할 수 있습니다.
- 생성자는 상속되지 않지만, 부모 클래스의 생성자를 호출할 수 있습니다. (super 사용)
예제
class Animal {
String name;
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// Dog 클래스는 Animal 클래스를 상속받음
class Dog extends Animal {
void makeSound() { // 메서드 오버라이딩
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "바둑이";
System.out.println(dog.name);
dog.makeSound(); // 멍멍!
}
}
위 코드에서 Dog 클래스는 Animal 클래스를 extends 키워드로 상속받았으며, 부모 클래스의 makeSound() 메서드를 오버라이딩하여 새로운 동작을 정의했습니다.
1.2 implements 키워드
implements는 클래스가 하나 이상의 인터페이스를 구현할 때 사용됩니다. 인터페이스는 메서드의 시그니처(선언)만 정의하고, 실제 구현은 인터페이스를 구현하는 클래스에서 담당합니다.
특징
- 다중 구현(multiple implementation)이 가능하여 여러 개의 인터페이스를 한 클래스에서 구현할 수 있습니다.
- 인터페이스의 모든 메서드는 반드시 구현해야 합니다.
- 인터페이스는 상속이 아닌 "구현" 개념이므로, implements를 사용한 클래스는 인터페이스와는 다른 관계를 가집니다.
예제
interface Animal {
void makeSound(); // 인터페이스 메서드는 본문이 없음 (추상 메서드)
}
// Dog 클래스는 Animal 인터페이스를 구현
class Dog implements Animal {
public void makeSound() { // 반드시 구현해야 함
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.makeSound(); // 멍멍!
}
}
위 코드에서 Dog 클래스는 Animal 인터페이스를 implements 키워드로 구현했으며, 인터페이스의 메서드를 반드시 재정의해야 했습니다.
2. extends와 implements의 차이점
구분 extends (상속) implements (구현)
적용 대상 | 클래스 -> 클래스 | 클래스 -> 인터페이스 |
개념 | 부모 클래스의 속성과 동작을 물려받음 | 인터페이스의 메서드를 구현해야 함 |
다중 사용 | 단일 상속만 가능 (하나의 부모 클래스만 상속) | 다중 구현 가능 (여러 개의 인터페이스 구현 가능) |
메서드 구현 | 부모 클래스의 메서드를 그대로 사용하거나 오버라이딩 | 인터페이스의 모든 메서드를 반드시 구현해야 함 |
접근 제어 | 부모 클래스의 protected 또는 public 멤버 접근 가능 | 인터페이스는 기본적으로 public 메서드만 가짐 |
키워드 사용 | extends | implements |
3. extends와 implements 함께 사용하기
Java에서는 클래스가 extends로 다른 클래스를 상속받으면서 동시에 implements를 사용하여 여러 개의 인터페이스를 구현할 수 있습니다.
예제
interface Animal {
void eat();
}
interface Pet {
void play();
}
// Dog 클래스는 Animal 클래스를 상속하고, Pet 인터페이스를 구현
class Dog extends Animal implements Pet {
public void eat() {
System.out.println("강아지가 음식을 먹습니다.");
}
public void play() {
System.out.println("강아지가 놀고 있습니다.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 강아지가 음식을 먹습니다.
dog.play(); // 강아지가 놀고 있습니다.
}
}
이처럼 extends와 implements를 동시에 사용할 수 있으며, 클래스 상속을 활용하면서도 여러 개의 인터페이스를 구현할 수 있습니다.
4. extends와 implements의 활용 예시
4.1 extends를 활용한 상속 관계 예시
상속을 사용하면 기존 코드를 재사용하면서도 새로운 기능을 추가할 수 있습니다.
class Vehicle {
void move() {
System.out.println("이동 중...");
}
}
class Car extends Vehicle {
void move() {
System.out.println("자동차가 달립니다.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.move(); // 자동차가 달립니다.
}
}
4.2 implements를 활용한 다중 인터페이스 구현 예시
인터페이스를 활용하면 코드의 결합도를 낮추고 유연성을 높일 수 있습니다.
interface Engine {
void start();
}
interface Wheels {
void roll();
}
class Car implements Engine, Wheels {
public void start() {
System.out.println("엔진이 시작됩니다.");
}
public void roll() {
System.out.println("바퀴가 굴러갑니다.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start(); // 엔진이 시작됩니다.
car.roll(); // 바퀴가 굴러갑니다.
}
}
이처럼 implements를 사용하면 여러 개의 인터페이스를 구현하여 보다 유연한 설계를 할 수 있습니다.
5. extends와 implements 선택 기준
- 상속(extends): 부모 클래스의 기능을 그대로 사용하거나 일부 변경하고 싶다면 상속을 사용합니다.
- 구현(implements): 특정 동작을 보장해야 하는 경우(예: 인터페이스의 메서드를 반드시 구현해야 하는 경우) implements를 사용합니다.
- 둘 다 사용 가능: 클래스 상속을 활용하면서도 다중 인터페이스 구현이 필요하면 둘 다 사용할 수 있습니다.
6. 결론
Java에서 extends와 implements는 객체지향 프로그래밍의 핵심 개념으로, 각각 상속과 인터페이스 구현에 사용됩니다.
- extends는 클래스의 상속을 의미하며, 코드 재사용성을 높이고 부모 클래스의 기능을 확장할 수 있습니다.
- implements는 인터페이스의 구현을 의미하며, 다중 구현이 가능하고 유연한 설계를 도와줍니다.
- 필요에 따라 extends와 implements를 동시에 사용할 수도 있습니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
엑셀 꿀 단축키 모음(feat.단축키 한방 정리) (0) | 2025.02.11 |
---|---|
HTML header 구조 및 예시 간단 설명 (1) | 2025.02.04 |
WAS란 무엇인가? (구조와 기능에 대해서) (0) | 2025.01.05 |
SQL LIKE절 사용방법 완벽 정리 (1) | 2024.12.23 |
Java 스프링 어노테이션이란? (개념 및 정리) (1) | 2024.12.04 |