객체지향 프로그래밍(33강 - 41강)

추상클래스

  • 추상 메서드: 구현 코드가 없이 선언부만 있는 메서드
  • 추상 클래스 : 추상메서드를 포함한 클래스
  • 하위 클래스에 구현의 책임 위임
  • abstract 예약어 사용
  • new로 인스턴스화 할 수 없음

구현

public abstract class Example {
    public abstract void test();
    public abstract void test2();
}
  • 메서드와 클래스에 abstract 키워드 사용
  • 추상 메서드가 포함된 클래스는 추상 클래스로 선언
  • 모든 메서드가 구현되었어도 클래스에 abstract 키워드를 사용하면 추상 클래스

사용

  • 주로 상속의 상위 클래스로 사용
  • 추상메서드: 하위 클래스가 구현해야 하는 메서드
  • 구현된 메서드: 하위 클래스가 공통으로 사용하는 기능의 메서드로 재정의 가능

템플릿 메서드

템플릿 메서드
  • 추상 메서드나 구현된 메서드를 활용하여 전체의 흐름(시나리오)를 정의한 메서드
  • final로 선언하여 재정의 할 수 없게 함
템플릿 메서드 패턴
  • 디자인 패턴의 일종으로 프레임 워크에서 많이 사용되는 설계 패턴
  • 추상 클래스로 선언된 상위 클래스에서 추상 메서드를 이용하여 전체 구현의 흐름 정의
  • 구체적인 각 메서드 구현은 하위 클래스에 위임
  • 하위 클래스가 다른 구현을 했다고 해도 템플릿 메서드에 정의된 시나리오 대로 수행됨

final 예약어

  • final 변수는 값이 변경될 수 없는 상수로 한 번만 값을 할당할 수 있음
  • final 메서드는 하위 클래스에서 재정의 할 수 없음
  • final 클래스는 더이상 상속되지 않음
public static final 상수
  • 프로젝트 구현 시 여러 파일에서 공유해야 하는 상수값은 하나의 파일에 선언하여 사용

인터페이스

요소
  • 추상 메서드: 모든 메서드는 추상 메서드
  • 상수: 선언된 모든 변수로 상수로 처리됨
  • 디폴트 메서드: 기본 구현을 가지는 메서드로 구현하는 클래스에서 재정의 가능(Java 8)
  • 정적 메서드: 인스턴스 생성과 상관없이 인터페이스 타입으로 호출하는 메서드(Java 8)
  • private 메서드: 인터페이스 내에서 사용하기 위해 구현한 메서드로 구현하는 클래스에서 재정의 할 수 없음(Java 9)
구현
public interface Calculator {
    // 인터페이스에서 선언한 변수는 컴파일 과정에서 상수로 변환
    
    double PI = 3.14;
    int ERROR = -999999999;
    
    // 인터페이스에서 선언한 메서드는 컴파일 과정에서 추상 메서드로 변환
    
    int add(int num1, int num2);
    int substract(int num1, int num2);
    int multiply(int num1, int num2);
    int divide(int num1, int num2);
}
  • 인터페이스를 구현한 클래스는 인터페이스 타입으로 변수를 선언하여 인스턴스 생성 가능
  • 인터페이스는 구현 코드가 없으므로 타입 상속이라고도 함
  • 하나의 클래스가 여러 인터페이스 구현 가능
  • 디폴트 메서드의 이름이 중복 되는 경우에는 재정의
역할
  • 클라이언트 프로그램에 어떤 메서드를 제공하는지 알려주는 명세(specification) 또는 약속
  • 한 객체가 어떤 인터페이스의 타입이면 그 인터페이스의 메서드를 구현했다는 의미
  • 클라이언트 프로그램은 실제 구현 내용을 몰라도 인터페이스 정의만 알면 객체 사용 가능
  • 인터페이스를 구현해 놓은 다양한 객체 사용 가능(다형성)
상속
  • 구현이 없으므로 extends 뒤에 여러 인터페이스 상속 가능
  • 타입 상속(type inheritance)라고도 함