추상 클래스와 인터페이스

김회민·2023년 2월 11일
0

Java

목록 보기
7/16

추상 메서드 ( Abstract Method )

public abstract String getName(); // 추상 메서드
public abstract String fail() { return "fail"; } // 추상 메서드 X

abstract 키워드와 함께 원형만 선언하고, 내부를 구현하지 않은 메서드

추상 클래스 ( Abstract Class )

public abstract class Member {
	public abstract void logic();
}

public class SpecialMember extends Member {
	@Override
	public void logic() { /* 구현 */ }
}
  • abstract 키워드로 선언된 클래스
    • 추상 메서드를 최소 한 개 이상 가지고 abstract로 선언된 클래스
    • 추상 메서드가 없어도 abstract로 선언한 클래스
  • 구현
    • 자식 클래스에서 부모 클래스의 모든 추상 메서드를 오버라이딩하여 구현
    • 자식 클래스는 extends 키워드로 상속받는다.
      • 단 하나의 클래스만 상속이 가능하다. (단일 상속)
  • 목적
    • 객체를 생성하기 위함이 아닌, 상속으로 부모 클래스를 활용하기 위함
    • 여러 클래스들의 공통된 부분을 추상화하여 상속받는 클래스에게 구현을 강제화
      • 메서드의 동작을 자식에게 위임
    • 확장의 의미가 있다.

인터페이스 ( Interface )

public interface IMemberList {
	int MAX_COUNT = 100; // 상수 필드 public static final 이 생략되었다.
  void push(); // 추상 메서드 abstract public void 가 생략되었다.
}

public class SpecialMemberList implements IMemberList {
	public void push() { /* 구현 */ }
}
  • 특징
    • interface 키워드로 선언.
    • 상수 필드와 추상 메서드만으로 구성된다.
    • 모든 메서드가 추상 메서드로서, abstract public 속성이 default로 생략 가능하다.
    • 상수public static final 속성이 default로 생략 가능하다.
    • 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있다.
      • extends 키워드를 사용하여 상속받는다.
      • 인터페이스 간의 상속은 한 번에 여러 인터페이스를 상속받을 수 있다. (다중 상속)
  • 구현
    • 인터페이스를 상속받고, 추상 메서드를 모두 구현한 클래스를 작성한다.
    • implements 키워드를 사용하여 상속받는다.
      • 클래스간의 상속과는 달리 한 번에 여러 인터페이스를 상속받을 수 있다. (다중 상속)
  • 목적
    • 상속받을 클래스에게 구현할 메서드들의 원형을 모두 알려주어,
      클래스가 목적에 맞게 메서드를 구현하도록 한다.
    • 구현 객체의 같은 동작을 보장하기 위한 목적이 있다. ( 리스코브 치환 원칙 )
    • 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다.

default 메소드

interface DefaultInterface {
  void abstractMethod();
  default void defaultMethod(){ // 디폴트 메소드 //오버라이드해도되고 안해도됨
    System.out.println("Default method"); // 구현을 해주어야함
  }
}
  • JDK 1.8 이후에 default 메소드를 구현할 수 있다.
    • default 메소드는 항상 public이다.
    • default 메소드는 구현체에서는 반드시 구현할 필요는 없다
interface IHuman {
	default void call() { System.out.println("우어어"); }
}

class Parents {
	void call() { System.out.println("부모가 부른다"); }
}

class Child extends Parents implements IHuman {} 
// Child c = new Child();
// c.call(); // 부모가 부른다
  • 상속받은 클래스와 인터페이스에 같은 이름의 메서드가 있다면 부모클래스의 메서드가 실행된다.

출저

profile
백엔드 개발자 지망생

0개의 댓글