추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미이다.
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다.
추상 클래스
위의 그림을 보면 Animal 클래스는 동물의 특성을 가지고 있지만 독립적인 클래스로 기능을 수행하지는 않는다.
때문에 Animal의 클래스에는 추상 메서드를 사용해서 무의미한 구현을 줄이고 상속 받은 클래스에서 작성하도록 한다.
abstract class Animal {
public abstract void eat();
public abstract void sleep();
}
class Animal {
public void eat() {
System.out.println("냠냠");
}
public void sleep() {
System.out.println("쿨쿨");
}
}
클래스 내부에 abstract 메서드가 있는 상황이므로 자식 클래스는 abstract 클래스로 선언되어야 한다.
클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
하지만 상위 클래스 타입으로써 자식을 참조할 수는 있다.
서로 다른 두 시스템 장치, 소프트웨어 따위를 서로 이어 주는 부분, 또는 그런 접속 장치
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것
최고 수준의 추상화 단계이며 인터페이스 내의 일반 메서드는 모두 abstract
형태를 가지고 있다.
맴버 변수는 public static final
이며 생략 가능
모든 메서드는 public abstract
이며 생략 가능
extends
를 이용해 상속이 가능헷갈릴 메서드 구현 자체 없기 때문에!
implements
키워드를 사용해서 인터페이스를 구현한다.public static void main(String[] args) {
PrintClient client = new PrintClient();
client.setPrinter(new LaserPrinter());
// TODO: client가 LazerPrinter를 사용하도록 하고 클래스의 변화를 확인하시오.
client.setPrinter(new LaserPrinter());
// END:
client.printThis("myfile");
}
위의 코드 처럼 인터페이스는 모듈처럼 사용가능하기 때문에 손쉬운 교체가 가능하다!
개발에서 인터페이스 사용의 예
개발 중 DBMS를 바꿔야 할때 driver(모듈, 인터페이스의 역할)를 사용해서 손쉽게 교체 가능
즉, 코드의 교체 없이 인터페이스만 바꾸면 된다. → 인터페이스는 약속된 규격이기 때문
인터페이스를 통해 상속 관계가 없는 클래스에 다형성을 부여
이를 통해 자바의 단일 상속의 한계를 극복할 수 있다!!!
하지만 클래스의 상속처럼 강한 결합이 아닌 느슨한 결합
!!!
계산기를 구현하는 두 팀의 작업
A 팀 - 클라이언트를 위한 UI
B 팀 - 계산 로직의 구현
public
으로 한정됨method의 우선순위
super class의 method 우선
interface간의 충돌
다양한 타입의 객체를 다루는 메서드, 컬렉션 클래스에서
컴파일 시에 타입 체크
미리 사용할 타입을 명시해서 형 변환을 하지 않아도 됨
public class Class_Name<T>{}
public interface Interface_Name<T>{}
장점 : 여러 데이터 타입을 하나의 박스로 저장할 수 있다.
단점
장점
Object | Generic | |
---|---|---|
여러 데이터 타입 저장 | 가능 | 가능 |
데이터 타입 제한 | 불가능 | 가능 |
데이터 타입 형 변환 | 필요 | 불필요 |
타입 파라미터이름으로 권장되는 것
Box<String> // String으로 타입을 체크
Box<Integer> // Integer으로 타입을 체크
컴파일 시 제너릭이 타입을 체크
String을 기준으로 타입을 체크하기 때문에 Integer타입을 넣으면 오류 발생
(The method setData(String) in the type Box03<String> is not applicable for the arguments (int))
멀티 파라미터!? 제너릭 타입을 두개(이상)도 줄 수 있다구 😜
package com.ssafy.day05.box;
class Box04<K, V> {
private K key;
private V value;
Box04(K key, V value) {
this.key = key;
this.value = value;
}
}
public class Box04Test {
public static void main(String[] args) {
Box04<String, Integer> box = new Box04<String, Integer>("싸피", 1234);
}
}
그러나…!!! 이건 매번 쓰기 귀찮잖아… 😡
List<Integer> list = new ArrayList<>();
Iterator<Integer> ite = list.iterator();
그래서!!! JDK 1.5부터는 객체 타입이 자동으로 설정된다~ <>안의 내용을 생략할 수 있쥐~ 😜
List<Integer> list = new ArrayList<>();
Iterator ite = list.iterator();
public class NumberBox<T extends Number> {
@SuppressWarnings("unchecked")
public void addSomes(T... ts) { // 가변형 변수
double sum = 0;
for (T t : ts) {
sum += t.doubleValue();
}
System.out.printf("총 합은: %f%n", sum);
}
private T some;
public T getSome() {
return some;
}
public void setSome(T some) {
this.some = some;
}
}
제너릭은 상속을 사용하여 타입을 제한할 수 있다!
💡 타입을 여러개 제한도 할 수 있나…? → 🥕클래스와 함께 인터페이스 제약 조건을 이용할 경우 &로 연결하여 사용가능하다!
인터페이스로 제한할 경우도 extends 사용!
제너릭 타입 객체를 할당 받을 때 와일드 카드도 이용 가능하다! (이따 정리합시다!!)
파라미터와 리턴 타입으로 type parameter를 갖는 메서드
[제한자] <타입_파라미터, [...]> 리턴_타입 메서드_이름(파라미터)
여기서 <>는 생략이 가능하다!! 메서드 호출 시점에 P의 타입 결정
💡 `추가학습` 💯어노테이션과 리플렉션
해석되나요???🤔→혼자서 설명해보기🥰