[자바] 상속과 인터페이스

박지운·2023년 8월 13일
0

자바 꽉 자바

목록 보기
7/12

진행하고 있는 프로젝트에서 상속의 개념을 처음 써보게 되었다. 하지만 c++로 이론 수업만 들었던 것이 다였기 때문에 자바의 상속개념을 정리해본다.

상속

상속은 부모 클래스를 자식 클래스에게 물려준다, 코드 중복을 줄일 수 있다 등 많이 알고 있을 것이다. 자바의 상속 방식을 알아보자.

자바 클래스 간의 상속은 여러 개의 부모를 상속하는 다중 상속 방식을 제외하고는 모두 허용한다.

  • 다단계 상속 : 부모 - 자식 - 자식 - ....
  • 계층적 상속 : 부모 - 자식
    - 자식

자바의 상속 방법

extends를 사용한다.

class 부모class {

}
class 자식 extends 부모 {

}

예제

class people{
	//필드
	String name;
    Long age;
	//메소드
    public void printMyself() {
    	sout("이름: " + name);
        sout("나이: " + age);
    }
}

class students extends People {
	//필드
    Long drinkCapacity;
    
    //생성자
    Student(String name, int age, Long drinkCapacity) {
    	super.name = name; // 부모필드
        super.age = age;  // 부모필드
    	this.drinkCapacity = drinkcapacity;
    }
    
    //메소드
    public void printDrinkCapacity() {
    	sout("나의 주량: " + drinkCapacity);
    }
}

public class Main {
	public static void main(String[] args) {
 	Student student = new Student("김준식", 20, 5);
    student.printMyself(); //부모 메소드 호출
    student.printDrinkScore(); //자식 메소드 호출
}

super 키워드

예시 코드에서 super 키워드는 자식 클래스에서 부모 클래스를 가리킬 때 사용한다.

부모 클래스에서 상속이 안되는 것

  • 부모 클래스의 private은 물려받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지에 있다면 부모의 default접근 제한 을 갖는 필드 및 메소드도 물려 받을 수 없다.

default 접근제한자를 잘 모르겠으면 여기!

자바의 다중 상속 불가 이유

예를 들어 상속 받은 여러 개의 부모 클래스들에서 동일한 명칭의 필드나 메소드가 있다면 어떤 클래스를 상속받고 어떤 클래스에 어떻게 접근하는 지 모호함이 생긴다. 따라서 자바에서는 다중 상속이 불가하다.


그럼 자바에서는 다중 상속을 아예 쓸 수 없을까 ?

인터페이스

자바의 인터페이스는 객체의 사용방법을 가이드라인 하는 것이다.

특징

  • 다중 상속 가능
    인터페이스는 껍데기만 존재하기에 클래스 상속시 발생한 모호함이 없다.
  • 추상 메소드와 상수만 사용 가능
    인터페이스에는 구현 소스를 생성할 수 없다.
    (자바 8부터는 디폴트 메소드 개념으로 구현 내용도 포함시킬 수 있다.)
  • 생성자 사용 불가
  • 메소드 오버라이딩 필수
  • 가독성과 유지보수, 확장에는 열려있고 변경에는 닫혀있다.

코드에서 먼저 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킨다.

인터페이스끼리 상속을 통해서 확장이 가능하다.
인터페이스로 객체 구현시 implements라는 키워드를 사용, 인터페이스끼리 상속 시 extends 키워드를 사용한다.

실제 예시는 현재 프로젝트에 인터페이스를 통한 상속을 하고 있어 추후에 정리할 예정이다..!

정리

상속은 확장, 조상의 멤버를 그대로 자식이 물려받아 추가한다. 즉 자식으로 내려갈수록 조상보다 멤버의 범위가 더 넓어지는 느낌이다. 인터페이스는 확장의 의미보다는 인터페이스에서 정의된 것을 클래스에서 대신 구현하겠다는 느낌으로 받아들이면 될 것 같다.


출처 : 코드 팩토리 상속
코드 팩토리 인터페이스

profile
앞길막막 전과생

0개의 댓글