[JAVA] day6_3

99winnmin·2022년 7월 5일
0

java

목록 보기
9/10
post-thumbnail

추상 클래스란?

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스(abstract method가 하나라도 있으면 abstract class임 하지만 abstract method가 하나도 없어도 abstract class로 선언가능)
  • 메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수로 구성
  • 메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미 구현부(body) 를 가짐 ({ })
int add(int x, int y); // 선언 
int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
  • abstract 예약어를 사용
  • 추상 클래스는 new 할 수 없음 (인스턴스화 할 수 없음) => 추상클래스는 상속을 하기 위한 목적

추상 클래스의 응용 - 템플릿 메서드 패턴

  • 추상 메서드나 구현 된 메서드를 활용하여 코드의 흐름(시나리오)를 정의하는 메서드
  • final로 선언하여 하위 클래스에서 재정의 할 수 없게 함
  • 프레임워크에서 많이 사용되는 설계 패턴
  • 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의 하고 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현 하도록 함

final 예약어

  • final 변수 : 값이 변경될 수 없는 상수
  • final 메서드 : 하위 클래스에서 override 할 수 없는 메서드
  • final 클래스 : 상속할 수 없는 클래스

템플릿 메서드 예제

	//중요한 시나리오는 final로 override 금지시키기
    //template method pattern
    final public void run(){
        startCar();
        drive();
        stop();
        turnOff();
    }

인터페이스란?

  • 모든 메서드가 추상 메서드로 선언됨 public abstract
  • 모든 변수는 상수로 선언됨 public static final
interface 인터페이스 이름{

    public static final float pi = 3.14F;
    public void makeSomething();
}
  • 자바 8 부터 디폴트 메서드(default method)와 정적 메서드(static method) 기능의 제공으로 일부 구현 코드가 있음

인터페이스 구현과 형 변환

  • 인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음
Calc calc = new CompleteCalc();
  • 상속에서의 형 변환과 동일한 의미
  • 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 ( cf. extends)
  • 형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능함

인터페이스가 하는 일

  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세(specification)
  • 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
  • 인터페이스를 구현한 다양한 객체를 사용함 - 다형성
  • 예) JDBC 인터페이스

인터페이스를 활용한 다형성 구현 (dao 구현하기)

  • 하나의 인터페이스를 여러 객체가 구현하게 되면 클라이언트 프로그램은 인터페이스의 메서드를 활용하여 여러 객체의 구현을 사용할 수 있음 ( 다형성)
  • ex)
  • DB에 회원 정보를 넣는 dao(data access object)를 여러 DB 제품이 지원될 수 있게 구현함
  • 환경파일(db.properties) 에서 database의 종류에 대한 정보를 읽고 그 정보에 맞게 dao 인스턴스를 생성하여 실행될 수 있게 함
  • source hierachy

인터페이스의 여러가지 요소

상수

  • 모든 변수는 상수로 변환 됨 public static final
double PI = 3.14;
int ERROR = -999999999;

추상 메서드

  • 모든 선언된 메서드는 추상 메서드 public abstract

디폴트 메서드 (자바 8이후)

  • 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
  • 인터페이스를 구현한 클래스의 인스턴스가 생성 되어야 사용 가능함
  • default 키워드 사용
default void description(){
        System.out.println("basic operation");
        myMethod();
    }
  • 구현 하는 클래스에서 재정의 할 수 있음
@Override
    public void description() {
        System.out.println("CompleteCalc overriding");
    }

정적 메서드 (자바 8이후)

  • 인스턴스 생성과 상관 없이 인터페이스 타입으로 사용할 수 있는 메서드
static int total(int[] arr) {
	int total = 0;
		
	for(int i: arr) {
		total += i;
	}
	mystaticMethod();
	return total;
}

private 메서드 (자바 9이후)

  • 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
  • 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
  • default 메서드나 static 메서드에서 사용함
private void myMethod(){
        System.out.println("myMethod");
    }
private static void myStaticMethod(){
        System.out.println("myStaticMethod");
    }

여러 인터페이스 구현하기, 인터페이스의 상속

여러 인터페이스 구현

  • 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현 할 수 있음
  • 디폴트 메서드가 중복 되는 경우는 구현 하는 클래스에서 재정의 하여야 함
  • 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능 함

디폴트 메서드가 중복 되는 경우

  • 구현 코드를 가지고 인스턴스 생성된 경우만 호출되는 디폴트 메서드의 경우 두 개의 인터페이스에서 중복되면 구현하는 클래스에서 반드시 재정의를 해야 함
public class Customer implements Buy, Sell{

	@Override
	public void sell() {
		System.out.println("customer sell");
	}

	@Override
	public void buy() {
		System.out.println("customer buy");		
	}

	public void sayHello() {
		System.out.println("Hello");
	}
	//중복되는 디폴트 메서드
    //직접 다시 override해도되고 어떤 interface에서 가져와서 쓸건지 정해줘도됨
	@Override
	public void order() {
    	//Buy.super.order(); or Sell.super.order();
		System.out.println("customer order");
	}
}

인터페이스의 상속

  • 인터페이스 사이에도 상속을 사용할 수 있음
  • extends 키워드를 사용
  • 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 함
//extends 뒤에 다수개가 나올경우 interface라고 생각하면됨
public interface MyInterface extends X, Y{

	void myMethod();
}
profile
功在不舍

0개의 댓글