티스토리 뷰
추상 클래스
추상 클래스를 이용하려면 우선 추상 메소드의 개념부터 이해해야 한다. 추상 메소드를 하나라도 포함하고 있는 클래스는 반드시 추상 클래스로 정의되어야 하기 때문이다.
추상 클래스는 대표적인 불완전 클래스이다.
추상 메소드
abstract 리턴타입 메소드명();
abstract void move();
추상 메소드란 메소드 정의부만 존재하고 메소드를 구현하지 않은 형태의 메소드를 의미한다. 즉, 메소드 이름뒤에 구현부{}가 없는 메소드를 의미한다.
상단의 문법을 보면 알 수 있듯이 추상 메소드를 의마할 때는 abstract 예약어를 이용한다. 추상 클래스를 정의할 때도 클래스 앞에 abstract 예약어를 붙여야 한다.
정리
추상 클래스는 불완전한 클래스.
추상 클래스는 상속에 충실하게 만들어진 클래스이다.
부모와 자식 클래시간에 모든 클래스가 같은 종류여야 한다.
추상 메소드는 abstract 란게 붙어있고 구현부{}가 빠져있다.
부모 클래스에 new 라는 연산자를 아예 막아버리는 클래스가 추상 클래스이다.
완전 클래스를 놓으면 문제점이 생길 수 있는 부분을 막기 위해 사용한다.
tip.
ab 입력 후 "Ctrl + Space" 하면 abstract 메소드를 부를 수 있다.
9번째 줄
왼쪽에 AbstractChildClass 는 완전 클래스이다. 오른쪽에 extends 클래스는 추상 클래스이다.
그렇기 때문에 @Override 를 준 것이다. 다형성을 사용하기 위해서!
main 에서 실행된 Method 를 보면 "자식 클래스 -> 부모 클래스" 순으로 실행했는데,
잘 실행된 모습이 보인다.
그런데 만약 main 에서
AbstractClass ac = new AbstractClass(); 라는 클래스를 만들면 오류가 난다.
AbstractClass ac = 까지는 문제없이 되지만
new AbstractClass(); 에서 문제가 되는 것이다.
AbstractClass 는 부모 클래스인데 추상 메소드인
abstract void abstractMethod(); 를 했기 때문에 메모리에 공간을 만들 수 없다.
23번째 줄을 보면 자식 클래스로 공간을 만들었는데, 저건 가능하다.
저걸 사용할려고 추상 메소드를 사용하는 것이다.
굳이 메모리에 부모 클래스의 공간을 다시 만들 필요가 없기 때문.
문제없이 자식 클래스의 메소드가 실행되었다.
추상 클래스의 다형성 테스트
인터페이스
이렇게도 가능하다
인터페이스는 상속 관계에 있는 클래스에서 몇가지를 추가해야 할때와 같이
업데이트가 필요한 경우 사용한다.
기존에 있는 클래스를 건드리지 않고 추가할 수 있기 때문.
클래스 상속과 동시에 인터페이스 구현
이렇게도 사용 가능
인터페이스 간의 상속
인터페이스는 메소드를 정의만 하는 것이지 구현은 하지 않기 때문에 여러 인터페이스에서 정의된 메소드를 클래스가 구현한다고 해도 실질적으로 메소드가 구현된 부분은 클래스이지 인터페이스가 아니므로 인터페이스는 명세만 지원할 뿐이다. 따라서 실질적으로 호출되는 메소드는 heap영역에 생성되어 있는 클래스 객체안의 메소이기 때문에 상속이 모호해질 문제가 일어나지 않는다. 또한 인터페이스는 일반변수는 선언할수 없고 상수만 선언할수 있으므로 상수는 상속되는 것이 아니고 해당 인터페이스에 속하는 개념이므로 상속의 모호함이 발생하지 않는다.
Anonymous 내부 클래스
new Command 는 원래 절대 못쓰는 얘기인데,
Anonymous 덕분에 가능한 것이다.
컴파일러가 스스로 일회용 코딩을 하기 때문에 가능한 것이다.
class anonymous extends Object implements Command {
@override
public void execute() {
system.out.println("글작성");
}
}
Anonymous anonymous = new Anonymous();
라는 코딩을 했기 때문임.
"내용 보기 실행" 마찬가지임.