추상 클래스와 인터페이스는 왜 등장했나
부모가 자식에게 명령하면 자식이 무조건 동작해야한다. 이것을 다형성 보장이라고 한다.
다형성을 보장허려면, 재정의를 해야한다
[재정의?오버라이딩?
상속받은 메서드를 하위 클래스가 본인에게 맞게 편집해 사용하는 것.
동적 바인딩, 실행해야 안다. 상속과 관련이 있음
동적? 프로그램이 실행중]
재정의된 부모의 메서드는 자식으로 가는 통로 역할을 해준다. 즉, 본래(부모의) 가지고 있던 메시지는 필요가 없어진다.
그럼 부모는 이 메세지를 유지할 필요가 없어진다.
그래서 부모는 메서드의 구현부를 없앤다.
public abstract class Animal {
public abstract void eat();// 추상메서드라고 한다. 불완전 메서드
//:메서드의 구현부가 없다.
//재정의하면 ? 안나옴, 자식을 찾아가는 통로 역할
}
중괄호를 없애고 클래스와 메서드에 abstract를 붙인다. 이것이 추상클래스이다.
추상 클래스는 단독 사용이 불가하다. 하위 클래스가 있어야 한다.
하위에서 eat()을 재정의하지 않으면 에러가 난다.
자식이 오버라이드 하지 않으면 자식 또한 불완전한 클래스가 되는 것이다.
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("dog: eat");
}
}
자식 Dog는 부모의 추상 클래스 eat을 재정의 했다. -> 다형성 보장이 완료됐다.
[@Override 하는 이유? : 가독성, 실수방지, 메서드명 틀리면 에러 띄워줌
컴파일러가 에러를 잡아준다.
어노테이션은 컴파일러에게 기능을 요청. 구문 에러를 잡아주는 역할이다. 실수 방지를 위해 ]
추상 클래스는 다형성을 보장하기 위해 등장한 클래스이다.
추상클래스엔 구현된 메서드도 올 수 있다 (abstract 만 오는 게 아님)
상속받아 재정의를 반드시 해야 하는 경우도 있다.
상위 클래스가 추상 클래스가 되는 경우는 허다하다
Animal을 일반 클래스로 쓴다면,
재정의를 하지 않아도 동작되지만, 오동작일 확률이 높다.
오동작 방지를 위해 반드시 재정의를 유도해야하기 때문에 부모 클래스를 추상 클래스로 만든다.
public class AbstractClassTest {
public static void main(String[] args) {
//추상클래스는 단독으로 객체를 생성할 수 없다.
Animal ani = new Animal();
}
}
animal class = abstract 이다. 불완전한 클래스 이기 때문에 객체 생성이 불가하다.
추상클래스, 인터페이스 모두 다형성을 보장하기 위해 등장했지만, 차이가 있다.
추상 클래스는 비슷한 클래스의 공통 부분을 묶을 때 사용하고, 인터페이스는 서로 다른 클래스들의 공통 부분을 묶을 때 사용한다.
구현 메서드 없이 추상 메서드만으로 이루어진 추상 클래스를 생성해야한다
-> 이걸 인터페이스라고 한다. 구현 메서드 없이 추상만 활용한다.
a,b가 비슷한 클래스 일 때는 c를 추상 클래스로 만들면 된다.
하지만 a,b가 다른 종류의 클래스 일때는 인터페이스를 쓴다
추상 클래스 안에 구현 메서드가 들어갈 수 있어 추상 클래스는 추천하지 않는다
인터페이스는 100% 추상 메서드로 이루어졌기 때문에 다형성을 보장한다. 인터페이스에 구현 메서드는 올 수 없다.
따라서 상속받은 하위 클래스들은 상위 클래스의 모든 메서드를 재정의, 오버라이딩 해야한다 ->이를 인터페이스 규약이라고도 한다.
package fc.java.poly;
//추상클래스 = 추상메서드+ 구현메서드
//기능이 비슷한걸로 묶어야 구현메서드가 들어갈 때 문제가 되지 않음
public interface RemoCon {
//chUp(), chDow(), volUp,volDown
public void chUp();
public void chDown();
public void voUp();
public void volDown();
public void internet();
}
인터페이스는 extends가 아니라 implements를 사용한다. 또한 abstract 키워드 생략이 가능하다
부모가 인터페이스라면 자식의 내부 동작을 몰라도 동작 시킬 수 있다.
추상화는 다형성을 일부 보장하고 인터클래스는 추상화를 100% 보장한다.
RemoCon re = new RemoCon();
인터페이스 또한 자기 객체 생성이 불가하다. (인스턴스 불가)
인터페이스 변수 = final static 상수
final : 종단. 변수의 값 변경 불가. 값을 한 번 세팅하면 절대 변하지 않는다.
인터페이스는 객체를 생성 할 수 없는데 어떻게 메서드에 접근할까
객체를 생성하지 않고 사용하는 방법 = static 을 활용해서
스테틱 클래스 접근 방법은 클래스이름 + 도트 연산자. RemoCon.min
자바는 단일 상속만 지원하는데
extends는 하나
implements는 여러 개상속 받을 수 있다
마치 다중상속 처럼 사용 할 수 있다.
왜 인터페이스를 둘까?
물려주고 싶은 클래스에 인터페이스를 둬서 부분적, 선택적으로 물려주기가 가능하다.
이렇게 상속, 구현한 것들은 업캐스팅으로 받을 수 있다.(인터페이스도 하나의 클래스이기 때문에)
'JAVA > Bootcamp 자바' 카테고리의 다른 글
추상클래스와 인터페이스 (1) | 2024.03.13 |
---|---|
최상위 클래스 Object (0) | 2024.03.13 |
자바 - 다형성 (0) | 2024.02.29 |
Downcasting, 객체형변환 (0) | 2024.02.28 |
Override재정의, Upcasting, 동적바인딩 (1) | 2024.02.28 |