OOP - 추상클래스 vs 인터페이스

devdo·2022년 1월 5일
0

Java

목록 보기
26/56

추상클래스(abstract class)

  • 한 개 이상의 추상메서드를 가진 클래스
  • 이름이 추상클래스답게 구체적이지 않고 일반화하여 정의 된 걸로 함. ex. Person, Cat 등등
  • 추상메서드는 선언만 하고 구현이 되지 않는 불완전한 메서드이므로 객체로 생성되어서는 안된다.
  • 추상메서드를 사용하기 위해서는 반드시 상속할 구현클래스가 해당메서드를 강제 재정의(확장)해줘야 한다.

추상클래스 형식

접근제한자 abstract class 클래스명{
    추성메서드();
}

추상메서드 형식

접근제한자 abstract 반환타입 메서드명(매개변수){
     내용,,,
}

추상클래스 구현 예제

추상클래스 -> 자식 클래스 확장

Animal.class (추상 클래스)

public abstract class Animal {

    private String masterName;

    public abstract void bark();

    public void eat() {
        System.out.println("먹는다.");
    }

    public String getMasterName() {
        return "dsg";
    }

}

Dog.class

public class Dog extends Animal {

    @Override
    // 일반 메서드여도 오버라이딩 가능, override annotation을 붙여주면 좋다. 컴파일 에러 잡아줌
    public void eat() {
        System.out.println("개처럼 먹는다.");
    }

    @Override
    public void bark() {
        System.out.println("멍멍");
    }
}

AbstractClassTest

public class AbstractClassTest {

    public static void main(String[] args) {

        Animal dog = new Dog();

        dog.bark();
        dog.eat();
        System.out.println(dog.getMasterName());
    }

}

결과)


인터페이스

  • 추상클래스와 비슷한 기능 + 역할(접점)로서만 그친다. 구현은 implements한 구현클래스에서만.
  • 구성은 추상메서드상수로만 이루어짐
  • 다중 상속이 가능하다.
  • JAVA8부터 디폴트메소드, 정적메소드가 추가되었다.
  • 확장은 아니고 강제구현을 위해 쓰인다!
    (디폴트메소드, 정적메소드를 통해, 구현 강제성 안에 유연함을 심었다 오픈소스에서 이미 작동하는 것을 수정하기 번거롭기 때문이다.-자바의신 인터페이스 편 참고)

디폴트 메서드

디폴트 메소드를 정의하고 기본 구현부를 제공하고 만약 기본 구현부가 맘에 들지 않으면 각자가 오버라이딩을 하여 재구현할 수 있도록 선택적인 메소드를 가이드한다면 시스템 운영 유지보수성이 확보가 될 것이다.


인터페이스 형식

interface 인터페이스명 [extends 상속받을 인터페이스명,,,,]{

    //상수
    타입 상수명 =;

    public abstract void 추상메서드명1();
    // public abstract 생략 가능
    void 추상메서드명2();
    
    //디폴트 메소드
    default 타입 메소드명(매개변수, ... ){
      //구현부
   }
 
   //정적 메소드
   static 타입 메소드명(매개변수) {
     //구현부
   }
}

인터페이스를 참조할 구현 클래스 형식

class 클래스명 extends 상속받을클래스명 implements 인터페이스명{
    내용
}

인터페이스 구현 예제

package interfaceTest;

public class mainTest {
    public static void main(String[] args) {
        Cat cat = new Cat();

        cat.breath("hhhmmm");
        cat.eat("생선");
        cat.sleep("zzz");
        cat.work("wkwn");
    }
}

interface animals{
    public void eat(String bab);

    public void work(String move);

    public void sleep(String zzz);
}

interface lifes {						// 또다른 인터페이스
    public void breath(String hum);
}

class Cat implements animals, lifes {	// 다중상속
    
    // 인터페이스에서 만든 메서드를 구현클래스가 다 구현해야함.
    @Override
    public void eat(String bab) {
        System.out.println("고양이는 "+bab+"을 먹어요.");
    }

    @Override
    public void work(String move) {
        System.out.println("고양이는 "+move+"걸어요.");

    }

    @Override
    public void sleep(String zzz) {
        System.out.println("고양이는 "+zzz+"자요.");

    }

    @Override
    public void breath(String hum) {
        System.out.println("고양이는 "+hum+"합니다.");
    }
}

결과)

고양이는 hhhmmm합니다.
고양이는 생선을 먹어요.
고양이는 zzz자요.
고양이는 wkwn걸어요.

정리

  • 추상클래스 - 변수, 상속을 통한 확장 목적이 큼
  • 인터페이스 - 기능(메서드), 구현 강제, 조합, 기능 명세화 목적이 큼


참고

https://private.tistory.com/20 [공부해서 남 주자]

profile
배운 것을 기록합니다.

0개의 댓글