상속과 포함, Is-a와 has-a 이해

파이 ఇ·2024년 6월 18일
1
post-thumbnail

상속

상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미합니다. 이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.

상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메서드를 물려받아, 새로운 클래스를 생성할 수 있습니다. 이때 기존에 정의되어 있던 클래스를 부모 클래스(Parent Class) 또는 상위 클래스(Super Class)라고도 합니다. 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(Child Class) 또는 하위 클래스(Sub Class)라고도 합니다.

Java의 상속 방법

추상 클래스 (abstract class)

추상클래스는 하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스라고 합니다. 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메서드의 집합을 정의할 수 있도록 해줍니다. 즉, 반드시 사용되어야 하는 메서드를 추상 클래스에 추상 메서드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서 이 추상 메서드를 반드시 재정의 해야 합니다.

추상 클래스 문법

abstract class 클래스이름 {
	abstract 반환타입 메서드이름();
}

추상 클래스 활용 예시

abstract class Animal { 
	abstract void cry(); 
}

class Cat extends Animal { 
	void cry() { 
    	System.out.println("냐옹냐옹!");
	}
}

class Dog extends Animal { 
	void cry() {
		System.out.println("멍멍!");
	}
}

 

public class Main {
    public static void main(String[] args) {
    
		// 추상 클래스는 인스턴스를 생성할 수 없음.
        // Animal a = new Animal(); 
        
        Cat c = new Cat();
        Dog d = new Dog();
        
        c.cry();
        d.cry();

    }
}

실행결과
냐옹냐옹!
멍멍!

인터페이스 (interface)

인터페이스는 일종의 추상 클래스로, 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아 추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없습니다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용되지 않습니다.

추상 클래스를 부분적으로만 완성된 "미완성 설계도"라고 한다면, 인터페이스는 구현된 것은 아무것도 없는 그냥 스케치만 되어 있는 "기본 설계도"라 할 수 있습니다.

인터페이스 문법

class 클래스이름 implements 인터페이스이름 { ... }

인터페이스 활용 예시

interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }
 
class Cat implements Animal, Pet {
 
    public void cry() {
        System.out.println("Cat : 냐옹!");
    }
 
    public void play() {
        System.out.println("Cat : 쥐 잡기 놀이하자");
    }
}
 
class Dog implements Animal, Pet {
    public void cry() {
        System.out.println("Dog : 멍멍!");
    }
 
    public void play() {
        System.out.println("Dog : 산책갈까?");
    }
}
 
public class Test1 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();
 
        c.cry();
        c.play();
        d.cry();
        d.play();
    }
}

📌 상속과 포함, Is-A와 Has-A ?

추상 클래스는 Is-A (상속) 관계, 인터페이스는 Has-A (포함) 관계라고 정의합니다.
상속과 포함은 비슷한데, 언제 상속관계를 맺어야 할지 언제 포함관계를 맺어야할지 결정하는데에 어려움을 겪게 된다면 다음과 같은 문장을 떠올려 보면 됩니다.

상속 : 'A는 B이다'에서 '~이다'와 같습니다. = (is-a)
ex. 고양이는 동물이다.
➡️ A는 B를 상속하고 있습니다.

Has-A : 'A는 B를 가지고 있다'에서 '~를 가지고있다'와 같습니다. = (has-a)
ex. 자동차는 바퀴를 가지고 있다.
➡️ A는 B를 포함하고 있습니다.

이렇게 문장을 만들어 비교하면 상속 관계와 포함 관계를 비교하기 쉬워집니다.

끝!

profile
⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆

0개의 댓글