추상메소드
- 미완성된 메소드로 몸통부({})가 구현되어 있지 않은 메소드
추상클래스
- 미완성된 클래스
- 일반필드 + 일반메소드 [+ 추상메소드]
=> 추상메소드를 가진 클래스는 반드시 추상클래스로 명시 해야됨
* 추상메소드가 굳이 없어도 추상클래스로 만들 수 있음
언제사용되나요?
> 개념적 : 단지 이 클래스가 미완성된 클래스다 라는걸 부여할 목적 => 덜 만들었을때
> 프로그래밍적 : 객체 생성이 불가 하게끔 라고자 할 때
* 추상메소드가 존재하는 추상클래스를 쓰는 이유
- 부모클래스에 추상메소드가 존재할 경우
자식클래스에서는 강제로 오버라이딩 해서 동일한 패턴의 메소드를 가지게 됨!!
=> 각 자식 클래스마다 실행시킬 내용은 다르지만 동일한 형태의 메소드로 구혔했으면 할 때
=> 메소드 통일성 확보 목적
=> 표준화된 틀을 제공할 목적
Sports Class
package com.kh.chap02_abstractAndInterface.part01_easy.model.vo;
public abstract class Sports {
private int people;
public Sports() {
}
public Sports(int people) {
this.people = people;
}
public int getPeople() { // 머리부
return people; // 몸통부 => ** 이게 없으면 완벽한 메소드가 아님
}
public void setPeople(int people) {
this.people = people;
}
@Override
public String toString() {
return "people : " + people;
}
// 추상 메소드(미완성된 메소드) 만들기
// public void rule(); // 머리부만 있음.. 몸통부가 없다고 에러가남
public abstract void rule();
// 미완성된 메소드가 있다는 소리는 이 클래스도 아직 미완성 이라는 이야기
// 그럼 언제 완성하나요..? => 해당 추상클래스를 상속 받는 자식에서 !!!
}
FootBall Class
package com.kh.chap02_abstractAndInterface.part01_easy.model.vo;
public class FootBall extends Sports {
@Override
public void rule() {
System.out.println("공을 발로만 다뤄야한다.");
}
}
BasketBall Class
package com.kh.chap02_abstractAndInterface.part01_easy.model.vo;
public class BasketBall extends Sports {
// 자식클래스에 강제성을 부여하기 위함
// basketball, football 이든 무조건 rule 이 있으니 반드시 rule 을 구현했으면 해서...
// 추상메소드가 존재하는 추상클래스를 상속받는 순간
// 부모클래스에 있던 추상메소드를 강제로 오버라이딩 해야됨
@Override
public void rule() {
System.out.println("공을 항상 손으로만 다뤄야한다.");
}
}
실행 Class
package com.kh.chap02_abstractAndInterface.part01_easy.run;
import com.kh.chap02_abstractAndInterface.part01_easy.model.vo.BasketBall;
import com.kh.chap02_abstractAndInterface.part01_easy.model.vo.FootBall;
import com.kh.chap02_abstractAndInterface.part01_easy.model.vo.Sports;
public class EasyRun {
public static void main(String[] args) {
// 추상클래스 객체 생성 불가 (왜? 미완성 클래스기 때문에!!)
// Sports s = new Sports();
// Sports s; // 객체 생성이 안될 뿐이지 래퍼런스로는 사용 가능
// Sports s = new BasketBall(); // 다형성 적용 시켜서 부모타입으로 자식객체를 받아주는 형태는 가능
Sports[] arr = new Sports[2]; // 배열만 만든거
// 부모 자식
arr[0] = new BasketBall();
arr[1] = new FootBall();
// 단순 for문
for(int i=0; i < arr.length; i++) {
arr[i].rule();
}
// 향상된 for 문
for(Sports a : arr) { // a = arr[0], a = arr[1]
a.rule();
}
// 여기서도 동적바인딩!!!
/*
* 동적바인딩 : 컴파일 시점에서는 정적바인딩으로 현재 레퍼런스의 자료형의 클래스에 있는 메소드를 가리키긴함
* 런타임 시점(실행시점)에서는 동적바인딩으로 각각의 자식클래스에 오버라이딩 된 메소드가 있을 경우 그거 실행됨
*/
}
}
실행 결과