학원/JAVA

10/5 15-1 추상클래스

도원결의 2022. 10. 5. 18:22

Abstract Class

클래스이니까 객체를 만드는 설계도의 일종인데 이것은 조금 불완전한 설계도라고 생각하자
이것은 상속을 목적으로 만드는 클래스로추상메소드를 가지고 있는 클래스(없어도가능)

특징-class 앞에 abstract를 붙이면 추상클래스가 됨
-어떤클래스가 추상 메소드를 가지면 그 클래스는 반드시 추상클래스가 되어야 함!
-추상메소드가 없어도 abstract만 붙이면 추상클래스 됨
추상 메소드란?
- 메소드 앞에 abstract키워드가 붙은 것
- 메소드 원형만 있고 구현부{ }가 없는것
ex) abstract void abstractMethod();
추상메소드의 목적은 오버라이딩이 목적!! 구현부가 없으니 뭐 할 수가 없음.....(틀은 제공해 줄 테니 가져다 바꿔서 쓰세요~ 느낌 ??)
-추상 클래스를 상속받은 자식클래스(sub class)에서 추상 메소드를
가지고 있다면 반드시 오버라이딩 해야 한다
즉 , 동일한 API를 사용할 수 있다. API (application Programing Interface?)
예를들면.. 동일한 면적구하기 API를 이용 ---> 사각형, 원, 삼각형 각각 오버라이딩해서 면적구하는 연산방식은다르게 구현하는거!!!!

만약 자식클래스에서 부모클래스의 추상메소드를 오버라이딩 하지 않으려면 자식도 추상 클래스로 만들어야 한다고 하는데 그러면 의미가 과연 있을까...?

추상클래스는 new해서 인스턴스화 할 수 없지만(메소드에 구현부가 없음) 추상클래스 타입의 인스턴스 변수에
자식클래스의 메모리를 할당 할 수 있다.(Heterogenious 이질화)
오늘은 설명이 길다....후


1. 추상클래스1 - 추상메소드가 없는 추상 클래스
abstract class NoHavingAbstractMethod{
[멤버상수]
public static final int MAX_INT = Integer.MAX_VALUE;
[멤버변수] - 인스턴스,정적 다 갖네
int instanceVar;
static int staticVar;
[멤버 메소드] - 마찬가지로 인스턴스, 정적 갖고
void instanceMethod() { }
  static void staticMethod() { }
}

2. 추상클래스2 - 추상메소드를 가진 추상 클래스 (추상메소드 멤버로 가지면 그 클래스는 반드시 추상클래스!!!)
abstract class HavingAbstractMethod{
void abstractMethod(); 얘는 추상 메소드가 아님... 추상메소드도 아닌것이 감히 구현부도 없어서 에러 뜸
abstract void abstractMethod( );
}

3.추상클래스3 - 추상메소드를 가지지 않은 추상클래스를 상속받은 (일반)클래스
class NoHavingChild extends NoHavingAbstractMethod{
int newVar;
++멤버 메소드들을 강제적으로 오버라이딩 할 의무는 없다.
정적 메소드는 오버라이딩 자체가 불가하고
@Override
void instanceMethod() { } =>이거 강제사항 아님- 걍 임의로 오버라이딩 한 것
}

4.추상클래스4 - 추상메소드를 가진 추상클래스를 상속받은 클래스
class HavingChild extends HavingAbstractMethod{
@Override => 부모클래스를 보니 추상메소드가 있네. 그래서 그 메소드를 의무적으로 오버라이딩 함!!
void abstractMethod( ) { } =>오버라이딩된거

void newMethod() { } ==> 이건 걍 자식에서 새롭게 추가한 메소드
} ///////////

cf) 위에서도 말했 듯 자식클래스에서 의무적으로 오버라이딩 안하려면 자식클래스도 추상클래스로 만들면 되는데 ... 의미없어보임...
abstract class HavingChildNoOverriding extends HavingAbstractMethod{
abstract void abstractNewMethod();
}
이거봐... 이거 어디다가 쓸거야.. 밑에꺼 상속하는데 쓰겠지....
class HavingNewChild extends HavingChildNoOberriding{
저 위에서 상속 받은거랑해서 두개를 오버라이딩해야함!
@Override
void abstractNewMethod() {} =>HavingChildNoOberriding여기 있던 메소드
@Override
void abstractMethod() {} =>쟤가 상속받은 HavingAbstractMethod여기있던메소드

}


< 메인에서 정리하기 >
추상클래는 인스턴스불가
NoHavingAbstractMethod nam = new NoHavingAbstractMethod
대신 자식타입으로는 객체생성 가능(이질화)
NoHavingAbstractMethod nam = new NoHavingChild();
HavingAbstractMethod ham = new HavingChild();
ham.abstractMethod();
((HavingChild)ham).newMethod();

추상클래스의 정적멤버 접근하는 법 : (부 혹은 자식).클래스명.정적멤버로 접근
NoHavingAbstractMethod.staticMethod();
NoHavingChild.staticMethod();