추상메소드는 자식클래스에서 오버라이딩을 해야만!(필수야 필수) 사용할 수 있는 메서드야.
이게 뭐냐면 추상메서드는 선언만 할 수 있고 구현하는 공간은 없어.
abstract int abc(); 뭐 이런식으로 작성이 되어지고 있어.
일반적으로 우리는 객체를 만들어 클래스를 만들고 하는데 추상클래스는 객체생성을 하지않고 추상적인 데이터를 담고 있는 클래스라고 보면 돼. 그래서 추상메서드를 가지고있으면 추상클래스가 되는거야. 추상클래스를 선언할 때는 abstract라고 붙이면 되는거고 추상클래스를 하위 자식들이 상속받아 필요한 메서드만 상속하고 추상클래스는 자식에서 재정의 하는 방식을 통해 효율성을 높이고 있지.
말로만 하면 모르니까 예시를 보자
class Main {
public static void main(String[] args) {
무기 a무기 = new 칼();
a무기.공격();
}
}
class 무기 {
}
class 칼 extends 무기 {
void 공격() {
System.out.println("칼 공격");
}
}
일단 여기서 우리가 처음보는듯한 친구가 있을거야..
바로 무기 a무기 = new칼(); 이라는 형태인데
이거는 a무기라는 객체를 만들고 무기라는 부모 클래스와 칼이라는 자식 클래스를 만들겠다~ 라는 의미야! 그럼 다음으로 a무기.공격();을 하면 어떻게 될것같니? 정답은 오류가 나버려.. 왜냐하면 무기와 칼이라는 클래스는 서로 다른 공간을 가지고 있기 때문이야.. 이걸 해결하려면 어떻게 하냐!!
class 무기 {
void 공격(){System.out.println("칼 공격");}
}
이렇게 무기라는 클래스에 공격이라는 메서드를 만들어주면 돼! 그러나... 그러면 밑에 있는 자식클래스인 칼이랑 똑같은 메서드를 가지게 되잖아..?
class 무기 {
void 공격(){
System.out.println("칼 공격");
}
}
class 칼 extends 무기 {
void 공격() {
System.out.println("칼 공격");
}
}
이런식으로 말이야. 근데 여기서 칼공격이라는걸 2번 하는거야 그럼 중복이잖아 그리고 자식클래스에서 void()공격을 오버라이딩을 한 형태잖아? 결국은 부모클래스인 무기에서 어떤 값을 집어넣어도 자식클래스가 가지고 있는 메서드가 실행될거야 그러므로 효율적으로 쓰기 위해
class 무기 {
void 공격(){}
}
이렇게 쓰긴해 그런데 통상적으로 이렇게 쓰지는 않고 바로 abstract를 활용하는거야!
class Main {
public static void main(String[] args) {
double d = 1;
System.out.println(d);
무기 a무기 = new 칼();
a무기.공격();
}
}
abstract class 무기 { // abstrcat는 오버라이딩 필수
abstract void 공격(); // 칼에서 어쩌피 재정의 해서 void공격 메서드 body는 아무거나 있어도 상관없음
// 그래서 빈칸으러 놔도 됨. 구현 하지마! 그래서 여기에 쓰지말라고 abstract을붙임 대신에 부모 클래스에도 abstract을 붙임 그리고 공격 메서드는 무조건 오버라이드 해야됨.
//
//
class 칼 extends 무기 {
void 공격() {
System.out.println("칼 공격");
}
}
이렇게 클래스 앞에 abstract를 붙여서 추상클래스를 만들고 추상클래스 안에는 abstract void공격();이라는 메서드를 만들어 주는거지!
추가적으로!! 언제까지 할거에요..
인터페이스는 약간 순도높은 추상클래스만 있을때? 인터페이스를 사용해.
class Main {
public static void main(String[] args) {
무기 a무기 = new 칼();
a무기.공격();
a무기.방어();
}
}
abstract class 무기 {
abstract void 공격();
abstract void 방어();
}
class 칼 extends 무기 {
void 공격() {
System.out.println("칼 공격");
}
void 방어() {
System.out.println("칼방어");
}
}
이런식으로 추상클래스가 있어. 그러면 지금 딱 봤을때 공격과 방어메서드가 추상이지! 이럴때 interface를 사용하는거야!
interface 무기 { // 순도 100퍼센트 추상클래스일대 interface임
void 공격();
void 방어();
}
class 칼 implements 무기 { //그럼 extends를 implements로 변환 extends는 다중구현 처럼 보이는 무언가가 가능
public void 공격() {// 메소드에는 public 붙이고
System.out.println("칼 공격");
}
public void 방어() {
System.out.println("칼방어");
}
}
무슨말인지 알겠지?