반응형
1. 상속(Inheritance)
상속은 기존 클래스의 속성과 메소드를 재사용하고, 새로운 기능을 추가하여 확장하는 기능입니다. 한 클래스가 다른 클래스를 상속하면 자식 클래스(서브 클래스)가 부모 클래스(슈퍼 클래스)의 모든 속성과 메소드를 물려받게 됩니다.
- 코드 재사용성: 부모 클래스의 코드를 자식 클래스에서 재사용할 수 있습니다.
- 확장성: 자식 클래스는 부모 클래스의 기능을 확장하거나 오버라이딩(재정의)할 수 있습니다.
- 단일 상속: Java에서는 하나의 클래스만 상속받을 수 있습니다.
class Animal {
void sleep() {
System.out.println("잠듭니다.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("멍멍!!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 클래스의 메소드 호출
dog.bark(); // 자식 클래스의 메소드 호출
}
}
2. 인터페이스(Interface)
인터페이스는 메소드의 선언만을 포함하며, 구현은 하지 않습니다. 이를 구현하는 클래스는 인터페이스에 선언된 모든 메소드를 구현해야 합니다. 인터페이스는 다중 상속이 지원되며, 서로 다른 클래스들이 같은 동작을 구현할 수 있게 합니다.
- 다중 상속: 클래스는 단일 상속만 가능하지만, 인터페이스를 통해 여러 개를 구현하여 다중 상속을 기능적으로 구현할 수 있습니다.
- 완전한 추상화: 인터페이스는 구현을 포함하지 않으며, 모든 메소드가 추상적입니다. 자바 8부터는 default와 static 메소드를 통해 일부 구현을 가질 수 있습니다.
- 구현 강제성: 인터페이스를 구현한 클래스는 인터페이스의 모든 메소드를 반드시 구현해야 합니다.
interface Animal {
void sound(); // 추상 메소드
}
class Dog implements Animal {
public void sound() {
System.out.println("멍멍!!");
}
}
class Cat implements Animal {
public void sound() {
System.out.println("야옹!!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // "멍멍!!"
Animal cat = new Cat();
cat.sound(); // "야옹!!"
}
}
위 Animal 인터페이스는 sound() 메소드를 선언만 하고, 이를 구현하는 클래스들은 각기 다른 방식으로 sound() 메소드를 구현하게 됩니다. 인터페이스는 다형성을 구현하는 중요한 문법입니다.
3. 추상 클래스(Abstract Class)
추상 클래스는 일부 메소드만 선언하고, 나머지는 구체적인 구현을 제공할 수 있는 클래스입니다. 이는 구현의 공통 부분을 상속받는 클래스들에서 재사용하고, 개별 클래스에서는 자신만의 특화된 동작을 돕습니다.
- 부분적인 구현: 추상 클래스는 추상 메소드와 일반 메소드를 모두 가질 수 있습니다.
- 상속을 통해서만 사용: 추상 클래스는 객체화할 수 없으며, 반드시 상속을 통해 자식 클래스에서 구현해야 합니다.
- 단일 상속: 추상 클래스도 단일 상속만 가능합니다.
abstract class Animal {
abstract void sound(); // 추상 메소드
void sleep() {
System.out.println("잠듭니다.");
}
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍!!");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // "멍멍!!"
dog.sleep(); // "잠듭니다." (일반 메소드 사용)
}
}
위 Animal 클래스는 추상 메소드 sound()를 선언하고, 일반 메소드 sleep()을 구현합니다. 자식 클래스인 Dog에서 sound()를 구체적으로 구현합니다.
차이점 비교
특징 | 상속 (Inheritance) | 인터페이스 (Interface) | 추상 클래스 (Abstract Class) |
다중 상속 | X (단일 상속만) | 다중 상속 가능 | X (단일 상속만) |
메소드 구현 | 부모 클래스에서 구현된 메소드를 물려받음 | 메소드의 선언만 존재, 구현 강제 | 일부 메소드는 구현할 수 있고, 일부는 추상 메소드 |
목적 | 상속 통해 코드 재사용 및 확장 | 다형성과 다중 상속을 지원 | 공통 기능을 제공하면서 세부 구현은 자식 클래스에 위임 |
인스턴스화 | 상속받은 클래스는 객체 생성 가능 | 직접 객체 생성 불가능 (구현한 클래스로 객체화) |
직접 객체 생성 불가능 (상속한 자식 클래스로 객체화) |
추상 메소드 | 일반적으로 없음 | 모든 메소드가 추상적 (구현 강제) |
추상 메소드와 일반 메소드 모두 가질 수 있음 |
- 상속은 두 클래스 간에 명확한 is-a 관계가 있을 때 사용합니다. 부모 클래스의 대부분 기능을 그대로 사용하면서 일부 기능을 추가하거나 수정할 때 유용합니다.
- 인터페이스는 클래스들 간에 특정한 동작(기능)을 공통적으로 구현할 필요가 있을 때 사용합니다. 다중 상속이 필요하거나, 여러 클래스에서 공통의 동작을 정의할 때 적합합니다.
- 추상 클래스는 공통적인 기능을 일부 제공하면서, 자식 클래스가 구체적인 기능을 구현해야 할 때 사용합니다. 추상 클래스는 일반적으로 인터페이스보다 구체적인 공통 기능을 많이 제공하는 경우에 사용됩니다.
반응형
'Java' 카테고리의 다른 글
Java 예외 처리 완벽 이해하기 (0) | 2024.09.19 |
---|---|
Java JVM 메모리 구조와 메모리 저장 방식 (1) | 2024.09.18 |
Java 생성자, this()와 super() (0) | 2024.09.16 |
Java 객체지향 프로그래밍의 특징과 개념 이해 (0) | 2024.09.16 |
Java 조건문과 반복문: if, switch, for, while 그리고 break와 continue (0) | 2024.09.10 |