Java

[Java]추상클래스(Abstract Class)와 추상메소드(Abstract Method)

MoZZANG 2022. 3. 16. 19:10
추상 메소드란?
  • 메소드 앞에 abstract키워드가 붙은 것
  • 메소드 원형만 있고 구현부가 없는 것
  • 형식] 접근지정자 abstract 반환타입 메소드명(매개변수); - 여기서 매개변수는 선택사항이다.
  • 추상메소드의 궁극적인 목표는 오버라이딩이다.

 

추상 클래스의 성질
  • class앞에 abstract (modifier)를 붙이면 그 클래스는 추상 클래스가 된다.
  • 어떤 클래스가 추상메소드를 가지면 그 클래스를 반드시 추상 클래스로 만들어줘야 한다.
  • 단, 추상 메소드가 없어도 class 앞에 abstract만 붙이면 추상 클래스가 될 수 있다.
  • 추상 클래스는 인스턴스화 할 수 없다. 즉, 메모리에 객체를 생성할 수 없다 . 즉, new연산자로 메모리를 할당할 수 없다. 구현부가 없기 때문에 구현할 수 없기 때문이다.
  • 추상클래스의 궁극적인 목표는 상속이 목적이다.
  • 추상클래스를 상속받은 자식클래스에서는 만약 추상클래스에 추상메소드가 하나라도 있으면 그 메소드를 오버라이딩 해야한다. 즉 동일한 API를 사용할 수 있다.
  • 만약 자식클래스에서 부모클래스의 추상메소드를 오버라이딩 하지 않으려면 자식클래스도 추상클래스로 만들면된다.
  • 추상클래스는 new해서 인스턴스화 할 수 없지만, 추상클래스 타입의 인스턴스 변수에 자식클래스의 메모리를 할당할 수 있다.(Heterogenious)

 

 

예제를 보면서 이해해보자

▲ 첫번째로 추상 메소드가 없는 추상클래스를 만들자.

 

 

▲ NoHavingChild는 첫번째로 만든 추상메소드가 없는 추상클래스를 상속받았다. 하지만 추상클래스인 부모클래스에 추상메소드가 없기 때문에 필수로 오버라이딩 해야하는 메소드는 없다. 하지만 그냥 하나 오버라이딩 해보았다.

 

 

▲ 이번에는 추상메소드를 가진 추상클래스를 만들자. void abstractMethod();는 우선 구현부가 없기때문에 메소드가 될 수 없고, 구현부가 없다면 abstract를 붙여줘야 한다.

 

 

▲ 추상메소드를 가진 추상클래스르 부모로 하는 클래스를 만들자. 추상클래스인 부모클래스에 추상메소드가 있으므로 자식클래스에서는 반드시 해당메소드를 오버라이딩 해주어야한다.

 

 

 

이제 메인메소드에 사용해보자

▲ 추상클래스는 인스턴스화가 불가능하다! 꼭 기억하자! 하지만 이질화 즉, Heterogenious는 가능하다

    추상클래스의 정적맴버는 일반클래스에서 사용하는 것처럼 클래스명.메소드명() 방식으로 사용하면 된다.

 

 

 

 

 

이제 추상클래스들을 사용하여 도형의 크기를 구하는 메소드를 만들어보자.

 

우리는 원, 사각형, 삼각형의 넓이를 구하는 메소드를 만들 것이다. 하지만 각각의 도형은 넓이를 구하는 공식이 다 다르다 그래서 모든 클래스에서 동일하게 사용할 수 있는 메소드를 만들기 위해 즉 오버라이딩하기위해 추상클래스의 추상메소드를 사용해보자

 

 

 

▲ 우선은 기본생성자와 원의 넓이를 구할 때 사용할 반지름만을 인자로 받는 인자생성자와 삼각형,사각형의 넓이를 구할 때 사용할 길이와 높이를 인자로 받는 인자생성자를 만든 후 모든 도형의 넓이를 구할 때 호출 하기위해 오버라이딩을 위한 추상메소드를 만들었다.

 

 

--Circle 클래스

▲원의 넓이를 구할 때 사용할 반지름을 인자로 받는 인자생성자와 부모클래스에 있던 면적을 구하기 위한 오버라이딩된 메소드를 생성하였다.

 

사각형과 삼각형도 동일한 방법으로 해당 도형에 맞는 인자와 메소드를 만들면 된다.

 

 

--Rectangle 클래스

 

 

 

 

--Triangle 클래스

 

 

 

이제 메인메소드에서 도형의 넓이들을 구해보자

 

▲ Figure클래스는 추상클래스이므로 인스턴스화가 불가능하다 하지만 이질화 즉, Heterogenious는 가능하기 때문에 이질화 방법을 사용한다. 위에서 모든 도형의 area()메소드는 추상클래스인 Figure의 추상메소드인 area()메소드를 오버라이딩 한 것이다. 따라서 area()메소드를 호출하면 오버라이딩된 메소드가 호출된다.

 

Heterogenious포스팅에서도 말했듯이 이질화를 하려면 두 클래스가 상속관계에 있어야한다. Figure클래스는 모든 도형크래스와 상속관계가 있기 때문에 모든 도형으로 이질화를 사용할 수 있지만 Rectangle은 Circle클래스와 상속관계가 전혀없기 때문에 서로 이질화가 안된다. 

 

 

 

이처럼 추상클래스의 궁극적인 사용목적인 메소드의 오버라이딩을 통한 동일한 API를 사용하는 것이다

'Java' 카테고리의 다른 글

[Java]Collection - Set계열(HashSet)  (0) 2022.03.16
[Java]인터페이스(Interface)  (0) 2022.03.16
[Java]Object Class  (0) 2022.03.15
[Java]Heterogenious(이질화) & Homogenious(동질화)  (2) 2022.03.15
[Java]InstanceOf  (0) 2022.03.15