데이터 과학

추상 클래스와 오버라이딩 본문

프로그래밍 언어론/JAVA 기초

추상 클래스와 오버라이딩

티에스윤 2022. 11. 13. 21:06

추상(Abstract) 클래스에 대한 예제를 보면서 추상화에 대한 개념을 설명해 봅니다. 

자바 프로그램을 작성하다 보면 상속 이후에 사용하지 않는 메소드들이 나타납니다. 

 

아래 예제는 보면 도형이라는 클래스안에 그리다라는 메소드가 정의되어 있습니다. 이 그리다라는 메소드는 삼각형이라는 클래스에서 재정의가 이루어집니다. 이를 오버라이딩(Overriding)이라고 합니다. 

오버라이딩. 재정의를 하면 메소드의 본문이 변경됩니다. 

오버라이딩. 재정의 목적은 부모클래스의 메소드의 본문을 변경하는데 있습니다. 

 

class 도형{   
 double 면적;
   public void 그리다() {
    System.out.println("도형을 그린다");   // 이 구문은 실행되지 않습니다. 
   }
   public double 면적구하기(){
 return 면적;
 }
}

class 삼각형 extends 도형{ // 도형 클래스를 상속받습니다.
 double 밑변, 높이;
   public 삼각형(int a, int b){ // 생성자
    밑변=a;
    높이=b;
    면적=밑변*높이/2;
  }
 public void 그리다(){   // 부모클래스에 있는 그리다 메소드를 오버라이드(Override), 재정의합니다.

   System.out.println("삼각형을 그린다");
 }
}

public class Abstract2{
 public static void main(String[] args){
   도형 tr=new 삼각형(100,200);
     System.out.println(tr.면적구하기());
     tr.그리다();
 }
}

 

 

 

오버라이딩을 하다 보면 메소드 안에 있는 본문이 실행되지 않습니다. 

결과가 나오지도 않는 본문을 가지고 있어야 할 이유가 없겠죠. 

그래서 메소드의 본문 {   } 을 삭제합니다. 

 

메소드의 본문이 삭제된 메소드를 추상(abstract)메소드라고 합니다. 

이렇게 본문이 없는 추상메소드가 선언되면 그 클래스는 추상(abstract)클래스가 됩니다. 

 

그렇다면 추상클래스는 추상메소드가 있기에 선언되는 것이겠죠. 

그래서 추상클래스는 추상메소드도 가지고 있고, 일반 메소드도 가질 수 있습니다. 

 

그렇지만, 추상클래스는 객체가 될 수 없습니다. 

도형을 추상클래스로 정의하면 추상화를 만들 수 없습니다. 

 

도형 a=new 도형();

 

이렇게 하면 컴파일 할 때 에러가 납니다. 

 

아래 예제는 도형을 추상 클래스, 부모클래스로 정의 한 후 작성한 예제입니다.

삼각형과 사각형은 자식클래스가 되겠지요. 

 

 

 

abstract class 도형{   // 추상 클래스
 double 면적;
   public abstract void 그리다();   // 추상 메소드
   public double 면적구하기(){
 return 면적;
 }
}

class 삼각형 extends 도형{ // 상속
 double 밑변, 높이;
   public 삼각형(int a, int b){ // 생성자
    밑변=a;
    높이=b;
    면적=밑변*높이/2;
  }
 public void 그리다(){    // 상속받은 추상 메소드를 오버라이드 합니다.

   System.out.println("삼각형을 그린다");
 }
}

class 사각형 extends 도형{ // 상속
 double 가로,세로;
   public 사각형(int a, int b){ // 생성자
    가로=a;
    세로=b;
    면적=가로*세로;
 }
 public void 그리다()
   System.out.println("사각형을 그린다");
 }
}

public class Abstract1{
 public static void main(String[] args){
   도형 tr=new 삼각형(100,200);
   도형 re=new 사각형(100,200);
     System.out.println(tr.면적구하기());
     tr.그리다();
     System.out.println(re.면적구하기());
     re.그리다(); // tr과 re는 모두 그리다()를 사용하여 그린다. }
 }
}

 

결과

 

10000.0

삼각형을 그린다
20000.0

사각형을 그린다

 

 

 

위 예제를 보면 

 

   도형 tr=new 삼각형(100,200);
   도형 re=new 사각형(100,200);

 

이렇게 선언되어서 사용합니다. 이 부분은 가능하겠죠. 

도형은 데이터 타입 형태로 선언됩니다. 각각 tr과  re라는 객체가 만들어지는데 이는 삼각형과 사각형을 참조합니다. 

 

추상클래스는 데이터 타입으로는 가능하고, 그 대상으로는 선언이 안됩니다. 어려운가요. 

쉽게 생각하면 구체화가 되지 않으면 만들어 질 수가 없습니다. 그래서 메소드 오버라이딩을 통해 추상메소드의 본문(body, {   } )를 생성하여서 구체화를 해야 객체의 대상으로 정해 질 수 있습니다. 

 

구체적인 상태가 되어야만 객체의 능력을 부여 할 수 있는 것입니다. 

 

이상 추상 클래스와 오버라이딩에 대해 알아보았습니다. 

 

 

 

'프로그래밍 언어론 > JAVA 기초' 카테고리의 다른 글

static 메소드  (0) 2023.03.19
인터페이스 (interface)  (0) 2022.11.13
상속(Inheritance)  (10) 2022.11.06
메소드 오버로딩  (7) 2022.11.05
생성자 (constructor)  (8) 2022.10.30