ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 추상 클래스(추상 클래스)1-1
    개발언어/JAVA 2023. 11. 3. 14:54

    추상 클래스

    //{}안의 내용이 함수의 몸체
    int add(int x, int y){
       return x + y;
    }

     

    추상 클래스는 항상 추상 메서드를 포함한다. 추사 메서드는 구현 코드가 없다. 함수의 구현 코드가 없다는 것은 함수 몸체(boby)가 없다는 뜻이다.

     

    추상 메서드

    abstract int add(int x, int y);

    증괄호{}로 감싼 부분을 함수의 구현부(implementation)라고 한다. 이 부분이 없는 함수는 추상 함수(abstract function)이고 자바에서는 추상 메서드(abstract method)라고 한다. 추상 메서드는 위와 같이 선언만 하며 abstract 예약어를 사용한다. 그리고 " { } "대신 " ; "  를 사용한다.


    int add(int x, int y){}

    위와 같은 메서드는 추상 메서드가 아니다 "{ }"를 사용한 것만으로도 메서드를 구현한 셈이다. 다만 { }안에 코드가 없는것이다.

     

    정리하자면, 자바에서 추상 메서드는 abstrac 예약어를 사용하여 선언만 하는 메서드이다. 

     

    메서드 선언의 의미

    프로그램 개발에서 로직을 구현하는 것보다 더 중요한 것은 어떻게 구현할지 결정을 하는 것이다. 이런 과정을 설계라고 한다. 물론 설계 과정은 더 복잡하고 다양한 방법이 있을 수 있다. 

     

    int add(int num1, int num2);

     

    위 코드처럼 선언한 메서드를 보면 두 개의 정수를 입력받은 후 더해서 그 결과 값을 반환한다는 것을 유추할 수 있다. 즉 이 메서드의 선언부(declatration)만 봐도 어떤 일을 하는 메서드인지 알 수 있는 것이다. 함수의 선언부 즉 반환 형(type), 함수 이름, 매개변수를 정의한다는 것은 함수의 역활이 무엇인지, 어떻게 구현해야 하는지를 정의한다는 뜻이다. 따라서 함수 몸체를 구현하는 것보다 중요한 것은 함수 선언부를 작성한는 것이다. 자바에서 메서드 역시 마찬가지이다. 메서드를 선언한다는 것은 메서드가 해야 할 일을 명시 해 두는 것이다.

     

    추상 클래스 구현하기

    위 그림의 다이어그램에서 Computer클래스는 추상 클래스이며 이를 상속받은 두 클래스 중 DeskTop 클래스는 일반 클래스이고 NoteBook클래스는 추상 클래스입니다. 마지막으로 NoteBook클래스를 상속받은 MyNoteBook 클래스도 일반 클래스이다. Computer클래스가 제공하는 메서드 중 두개는 기울임꼴 서체로 표시했다. 이는 추상 메서드임을 나타낸다.  즉 display()와 typing()은 추상 메서드이고 turnOn()과 turnOff()는 구현 코드가 있는 메서드이다.

     

    package abstractex;
    
    public abstract class Computer{
    	public abstract void display();
        public abstract void typing();
        public void turnOn(){
        	System.out.println("전원을 켭니다.");
        }
        public void turnOff(){
        	System.out.println("전원을 끕니다.")
        }
    }

     

    Computer 클래스를 위와 같이 구현한 것은 'Computer를 상속 받는 클래스 중 turnOn()과 turnOff()구현 코드는 공통이다. 하지만 display()와 typing()은 하위 클래스에 따라 구현이 달라 질 수 있다. 그래서 Computer에서는 구현하지 않고, 이 두 메서드 구현에 대한 책임을 상속받는 클래스에 위임한다.'라는 의미이다. 따라서 Computer 클래스의 추상 메서드는 추상 클래스를 상속받은 DeskTop과 NoteBook에서 실제로 구현하게 된다. 해당 클래스의 상위 클래스에서는 하위 클래스도 공통으로 사용할 메서드를 구현하고, 하위 클래스마다 다르게 구현할 메서드는 추상메서드로 선언해 두는 것이다.

     

    추상클래스를 상속 받은 DeskTop클래스

    package abstractex;
    
    // 오류 발생
    public class ⛔DeskTop extends Computer{
    }

     

    Computer는 추상 클래스 이다. 추상 클래스를 상속받은 클래스는 추상 클래스가 가진 메서드를 상속받는다. 따라서 상속받은 상위 클래스의 추상 메서드를 모두 구현하던가 아니면 DeskTop도 추상 클래스로 만들던가 둘 중 하나를 해야한다.

    예를 들어 추상 메서드가 두 개인데 그 중 하나만 구 현하면 이 역시 구현이 안 된 추상 메서드를 포함하는 것이므로 추상 클래스 입니다. 

     

    package abstractex;
    
    public class DeskTop extends Computer{
    	
        @Override
        public void display(){
        	System.out.println("DeskTop display()");
        }
        
        @Override
        public void typing(){
        	System.out.println("DeskTop typing()");
        }
    }

     

    추상클래스를 상속 받은 추상 클래스 NoteBook 클래스

    package abstractex;
    
    public abstract class NoteBook extends Computer{
       @Override
       public void display(){
       	System.out.println("NoteBook display()");
       }
    }

     

    위 클래스에서는 상속받은 추상 메서드를 모두 구현하지 않고 display()하나만 구현했다. 그러므로 NoteBook 클래스는 추상 메서드를 하나 가지고 있기 때문에 추상 클래스가 된다. 

     

    추상클래스를 상속 받은 추상 클래스 NoteBook를 상속 받은 MyNoteBook 클래스 구현

    package abstractex;
    
    public class MyNoteBook extends NoteBook{
       @Override
       public void typing(){
       	System.out.println("MyNoteBook typing()");
       }
    }

     

    NoteBook을 상속받은 MyNoteBook 클래스는 다음과 같이 구현할 수 있다. 또한 MyNoteBook은 모든 추상 메서드가 구현된 클래스이므로 abstract 예약어를 사용하지 않이도 된다.

     

    💡 tip) 모든 추상 메서드를 구현한 클래스에 abstract 예약어를 사용한다면?

    문법상으로 모든 메서드를 구현했어도 abstract 예약어를 사용하면 추상 클래스이다. 
    package abstractex;
    
    public abstract class AbstractTV{
    	public void turnOn(){
        	System.out.println("전원을 켭니다.");
        }
        
        public void turnOff(){
        	System.out.print("전원을 끕니다.");
        }
    }​


    AbstractTV 클래스는 모든 추상 메서드를 구현한 클래스입니다. 하지만 이것으로는 완벽한 TV 기능이 구현된 것이 아니고 TV의 공통 기능만을 구현해 놓은 것이다. 이 클래스는 생성해서 사용할 목적이 아닌 상속만을 위해 만든 추상 클래스이다. 이 경우에는 new 예약어로 인스턴스를 생성할 수 없다.

     

    [출저 - Do it! 자바 프로그래밍 입문 , 박은종]

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    www.easyspub.co.kr

     

    댓글

Designed by Tistory.