Java 프로그래밍기초 230222 #10 추상클래스/추상메서드/인터페이스/느슨한결합

김춘복·2023년 2월 22일
0

Java 공부

목록 보기
13/20

객체지향 Part.2 마지막

추상클래스

  • 미완성 클래스. 인스턴스 생성 불가. 미완성 메서드인 추상메서드를 포함하는 클래스
    상속을 통해 자손클래스에 의해서만 완성될 수 있다. 추상메서드를 제외하고는 일반 클래스와 같다. 추상클래스 안에 일반 메서드도 쓸 수 있다.
    abstract를 앞에 붙이면 된다.

추상메서드

  • 메서드의 선언부만 작성하고 구현부{}블럭이 없다.
    설계만 해두고 실제 수행될 내용은 작성하지 않는다.
    abstract 추상메서드명(매개변수는 넣을 수 있음); 이게 끝. {}블럭 없다.

  • 추상클래스를 상속받는 클래스는 추상메서드를 모두 오버라이딩을 통해 완성시켜야 한다.
    상속받은 모든 추상메서드를 완성하지 못하면 해당 클래스는 abstract를 붙여 추상클래스가 된다.
    구현부만 없을 뿐이지 다른 메서드에서 호출은 가능하다.


인터페이스

: 추상메서드의 집합. 구현된 것이 전혀 없는 설계도. 모든 멤버가 public.
일반 메서드와 멤버변수(인스턴스 변수, 클래스 변수)는 가질 수 없고
추상메서드와 상수(final)만 가질 수 있다.
였지만 java1.8부터 defalut메서드와 static(정적)메서드를 인터페이스에서 쓸 수 있다.

인터페이스의 모든 멤버변수는 public static final이며, 생략 가능하다.
인터페이스의 모든 메서드는 public abstract이어야 하며, 생략 가능하다.

interface 인터페이스이름 {
          public static final 타입 상수이름 =; // 상수
          public abstract 메서드이름(매개변수목록); // 추상 메서드
}

인터페이스의 역할

  • 인터페이스를 이용하여 개발코드를 직접 수정하지 않고도 사용하고 있는 객체만 변경할 수있도록

  • 인터페이스의 장점 : 두 객체간 연결을 돕는 중간다리 역할. 선언(설계)와 구현을 분리.
    개발시간단축. 표준화. 독립적인 프로그래밍 가능. 서로관계없는 클래스들에게 관계를 맺어줄 수 있음.

  • 느슨한 결합 : 인터페이스를 사용하면 클래스간 관계를 느슨하게 유지할 수 있다.
    클래스간 관계가 느슨하면 다른 클래스로 교체할 때, 수정할 코드가 줄어든다.

다중상속

인터페이스는 인터페이스만 조상으로 둘 수 있다. 클래스처럼 Object가 최고 조상이 아니다.
추상메서드는 상속받으면서 구현부를 작성하기때문에 충돌해도 상관없어 다중상속이 가능하다.

implements

class 클래스이름 implements 인터페이스이름 {...}
클래스에서 implements 키워드를 통해 미완성상태인 인터페이스를 오버라이딩으로 구현한다.
만약 인터페이스를 상속받은 클래스에서 구현을 다 못한다면 미완성인 클래스로 취급하기 때문에 해당 클래스는 abstract를 붙여 추상클래스가 된다. (추상클래스는 구현 부담이 적다.)

인터페이스의 다형성

  • 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
    즉, 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다.
interface Fightable extends Movable, Attackable {
    String getName();
    Fightable getFighter(String name); // 반환 타입이 인터페이스인 Fighter를 반환하는 추상 메서드
}
  • 인터페이스의 참조변수를 해당 인터페이스를 구현한 클래스의 인스턴스로 형변환이 가능하다.
// class Fighter implements Fightable 일때
Fightable f = new Fighter();	// new앞에 (Fightable)은 생략 가능.
  • 구현클래스가 여러 인터페이스를 구현했을 때, 그중 하나의 부모 인터페이스 타입의 참조변수와 구현클래스를 연결한다면 다른 부모 인터페이스로부터 구현한 기능은 사용할 수 없다.

default메서드와 static메서드 + private메서드

  • java 1.8에서 인터페이스가 추상메서드 외에 static메서드와 default메서드를 사용할 수 있게 되었다. private메서드는 java9버전에 인터페이스에서 사용가능하게 되었다.

  • default 메서드 : 추상메서드가 아니라 기본 구현을 가지는 메서드. 접근제어자 default아님.
    구현하는 클래스에서 재정의를 할 수 있다. 접근제어자는 항상 public이다.
    이미 운영중인 프로그램에 새로운 기능을 추가하려고 할 때, 추상메서드로 구현을 하면 구현을 완료한 클래스는 추가된 추상메서드를 강제로 구현해야하는 비효율이 생긴다.
    그래서 이미 운영되고 있는 시스템에서 추가요건으로인해 불가피하게 반영을 해야 할 때 디폴트 메서드를 쓰면 효과적이다.

  • static 메서드 : 클래스 메소드와 동일하게 사용 가능하다. 인터페이스명.메서드명()

  • private 메서드 : 인터페이스 내에서 사용하기 위해 구현한 메서드로 구현하는 클래스에서 재정의를 할 수 없다.

참고사이트

profile
꾸준히 성장하기 위해 매일 log를 남깁니다!

0개의 댓글