🤔상속(Inheritance)이란?
상속은 말 그대로 부모 자식 간의 상속을 의미한다. 부모 클래스를 상속 받는 다는 말의 뜻은, 부모 클래스의 클래스 변수, 메서드(private 불가), 를 재사용, 확장한다는 의미이다.
Java에서 상속을 사용한 간단한 예시를 보자.
- Animal 클래스는 클래스 변수로 name필드를 갖고, move(), eat()메서드를 갖는다.
- Cat은 Animal을 상속받고 있으며, move()메서드를 오버라이드하여 “x 만큼 뒤로 움직인다”로 재정의하였다.
class Animal{
protected String name;
public Animal(String name){
this.name = name;
}
public void move(int x){
System.out.println(x + "만큼 앞으로 움직인다.");
}
public void eat(String food){
System.out.println(food + "를 먹는다.");
}
}
class Cat extends Animal{
public Cat(String name){
super(name);
}
@Override
public void move(int x){
System.out.println(x + "만큼 뒤로 움직인다.");
}
}
public class Main {
public static void main(String[] args){
Cat cat = new Cat("mycat");
cat.move(5);
cat.eat("fish");
}
}
- Main함수에서 Cat객체를 생성 후 move()메서드를 호출하면 Cat에서 재정의한 함수가 호출된다.
- eat()메서드는 Animal 클래스에서 상속받은 것이므로 Cat 클래스에서 별도로 구현하지 않아도 사용이 가능하다.
🤔인터페이스란?
인터페이스는 객체의 행위의 추상화이다. 인터페이스는 객체가 무엇을 할 수 있는 지 설명할 뿐 아니라 객체가 특정한 형식을 따르게 강제할 수 있기 때문에 코드의 일관성과 유지 보수성을 높일 수 있다.
Java에서 인터페이스을 사용한 간단한 예시를 보자.
- Swimmable이라는 인터페이스에 swim이라는 메서드를 통해 객체 행위를 추상화하였다.
- A 클래스와 B 클래스는 Swimmable의 구현체로, swim메서드를 오버라이드하여 구현했다.
interface Swimmable {
void swim();
}
class A implements Swimmable {
@Override
public void swim() {
System.out.println("A can backstroke");
}
}
class B implements Swimmable {
@Override
public void swim() {
System.out.println("B can butterfly");
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.swim(); // A can backstroke
b.swim(); // B can butterfly
}
}
A, B 객체를 생성하여 swim()메서드를 각각 실행한 결과, 각 클래스의 메서드를 호출하는 것을 볼 수 있다.
따라서 인터페이스를 만들면, 인터페이스를 구현한 구현 클래스를 통해 각 클래스 특성에 맞게 행위를 구현할 수 있다.
※참고 - 추상클래스 vs 인터페이스
추상 클래스와 인터페이스는 모두 추상화를 통해 구현을 강제하는 방법이지만, 차이가 있다.
추상 클래스는 추상 메서드를 포함한 클래스로, 일반 클래스와 마찬가지로 객체의 상태와 동작을 가질 수 있다. 추상 클래스 안의 추상 메서드는 하위 클래스에서 반드시 구현해야 하지만, 일반 메서드는 반드시 구현할 필요가 없다. 반면에 인터페이스는 메서드와 상수만 가질 수 있으며, 구현 클래스에서 인터페이스에서 정의한 메서드를 반드시 구현해야 한다.
🤔상속과 인터페이스의 차이가 뭘까?
상속은 하나 클래스에 대해서만 가능하지만, 인터페이스는 다중 구현을 할 수 있다.
David에게 부모가 여럿일 수는 없지만 여러가지 행위를 할 수 있는 것처럼 말이다.
아래 예제를 살펴보자.
탈모 여부 클래스 변수를 갖는 Parents 클래스를 생성했다.
public class Parents {
protected boolean hairLoss = true;
public void display(){
System.out.println("IM PARENT");
}
}
Programer와 Driver 인터페이스는 각각 programming(), drive()메서드를 선언해 놓았다.
public interface Programer {
void programming();
}
public interface Driver {
void drive();
}
David는 Parents를 상속받았으며, Programer, Driver인터페이스의 구현체이다.
즉, David는 탈모(상속)이고, 프로그래밍을 할 수 있고, 운전을 할 수 있다.
public class David extends Parents implements Programer, Driver{
public David(){
if(this.hairLoss == true){
System.out.println("I am hairloss..");
}
}
@Override
public void programming() {
System.out.println("I can programming");
}
@Override
public void drive() {
System.out.println("I can drive");
}
}
정리
*상속 : 부모-자식 관계를 나타내며, 부모 클래스의 코드를 재사용하고 확장하는 방법
*인터페이스 : 클래스가 따라야 할 규약을 정의하여 다형성을 구현하는 방법
*상속과 인터페이스의 차이
- 상속의 경우 하위 클래스에서 부모 클래스의 메서드를 전부 오버라이드할 필요는 없지만 인터페이스의 경우 반드시 구현해야 한다.
- 상속의 경우 단일 상속만이 가능하지만, 인터페이스는 다중 상속이 가능하다.
'Languages > Java' 카테고리의 다른 글
[Java] 멀티스레드 환경에서의 동시성 문제와 대책 (0) | 2023.04.12 |
---|---|
[Java] equals(), hashCode()를 재정의 해야 하는 이유 (0) | 2023.04.12 |
[Java] 자바 Collection 개념 정리 & 예제 (0) | 2023.04.10 |
[Java] 불변 객체(Immutable Object)란 무엇인가? (0) | 2023.04.09 |
[Java] static, static method 개념 정리 (0) | 2023.04.09 |
댓글