ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상 메서드 (abstract method)
    백엔드/자바 2020. 8. 6. 15:39

    추상이란?

    자바에서 추상이란 구체화와 반대되는 구체적이지 않은 대략적인 미완성을 의미한다.

     

    추상은 abstract라는 제어자를 붙이며 선언할 수 있다.

     

    그리고 추상의 능력을 붙여줄 수 있는 것은 클래스와 메서드이다.

     

    추상 메서드란?

    기존의 함수는 아래와 같은 형식을 가진다.

     

    ◎ 선언부: '접근제어자 + 반환값 + 메서드명 + 파라미터'

     구현부: 대괄호 ( { } ) 안에 메서드의 실행 코드를 입력

     

    class abstract_test{  // 일반적인 클래스 선언
    	
    	public int test() {  // 어디서나 접근 가능한 정수값을 반환해주는 test 메서드 선언
    		return 5;  // 메서드 실행 결과로 정수 5를 반환
    	}
    	
    }

     

    반면 추상 클래스는 다음과 같은 특징을 가진다.

     

     선언부: '접근제어자 + 반환값 + 메서드명 + 파라미터'

     구현부: 없음

     

    abstract class abstract_test{  // 추상 메서드를 갖게되므로 abstract를 붙여서 추상 클래스 선언
    	
    	public int test() {  // 일반 메서드 'test' 선언
    		return 5;
    	}
    	
    	abstract public int test2();
    	// 일반적인 클래스 선언부같지만 앞에 abstract는 붙여서 추상 메서드로서 선언함
        // 선언부는 abstract를 제외하고 일반 클래스와 같이 접근제어자+반환값+메서드명으로 구성
        // 반면 구현부는 아무 내용도 선언되지 않고 심지어 대괄호 ( {} ) 도 없다.
    }

     

    둘을 비교하면 다음과 같다.

     

     

    일반 메서드

    추상 메서드

    형태

    public int test(int a) {return a;}

    abstract public int test2(int a);

    abstract

    X

    O

    접근 제어자

    O

    O

    반환값

    O

    O

    메서드명

    O

    O

    파라미터

    O

    O

    구현부

    O

    X

     

    정리하면 추상 메서드는 형태적으로는 astract 제어자를 달고 구현부가 없는 메서드를 이야기한다.

     

    추상 메서드가 필요한 이유와 사용법

    추상 메서드의 형태는 알아보았는데, 그럼 왜 미완성인 메서드를 사용해야 하는걸까?

     

    코드의 표준화와 중복을 방지하고 작업 효율화를 높여줄 수 있기 때문이다.

     

    추상 메서드는 구현부가 없는 미완성인 관계로 그 자체로 단독으로 써줄 수 없다.

     

    추상 메서드를 사용하기 위해선 다음과 같이 해야한다.

     

    추상 메서드가 있는 추상 클래스를 일반클래스에서 상속한다.

     추상 메서드를 일반 클래스 내에서 오버라이딩으로 구현한다.

     

    이 과정에서 추상 메서드는 구현부가 없으므로 상속받은 자손 클래스마다 구현부를 다르게 할 수 있다.

     

    즉 추상 메서드는 코드를 짤 때 메서드에 대한 최소한의 가이드라인 역할을 하게 되는 것이다.

     

    아래 예시를 보면 더욱 이해가 쉽다.

     

    abstract class Animal{  // 추상 클래스 'Animal' 구현
    	abstract void bark();  // 추상 메서드 'bark' 구현
    }
    
    class Dog extends Animal{  // 'Animal'을 상속받은 'Dog' 클래스 구현
    	void bark() {  // 추상 메서드 'bark'를 오버라이딩하여 일반 메서드로 구현
    		System.out.println("왕왕");  // 실행시 "왕왕"
    	}
    }
    
    class Cat extends Animal{  // 'Animal'을 상속받은 'Cat' 클래스 구현
    	void bark() {  // 추상 메서드 'bark'를 오버라이딩하여 일반 메서드로 구현
    		System.out.println("야옹야옹");  // 실행시 "야옹야옹"
    	}
    }
    
    class Pig extends Animal{  // 'Animal'을 상속받은 'Pig' 클래스 구현
    	void bark() {  // 추상 메서드 'bark'를 오버라이딩하여 일반 메서드로 구현
    		System.out.println("꿀꿀");  // 실행시 "꿀꿀"
    	}
    }

     

    'Animal'이라는 추상 클래스를 선언하고 그 안에 'bark'라는 추상 메서드를 선언했다.

     

    그리고 'Dog', 'Cat', 'Pig' 각각의 클래스가 'Animal'을 상속 받아 'bark'를 각자 방식대로 구현했다.

     

    이런 의문이 들 수 있다.

     

    "일반 클래스의 오버라이딩으로도 가능한데, 굳이 추상으로 해야하는지?"

     

    실제 프로그램을 짤 때는 특히 여러 명의 사람이 코드를 짜게 된다.

     

    그런데 사람마다 쓰는 형식이 제각각이고 내용도 제각각일 수 있다.

     

    그런 상황에서 추상 메서드는 최소한의 가이드 라인을 주고 구현을 자유롭게 만든다.

     

    즉 추상 메서드를 쓰면 작업에 통일성을 부여하는 한편 자유롭게 프로그램을 짤 수 있게 도와준다.

    '백엔드 > 자바' 카테고리의 다른 글

    인터페이스 (interface)  (0) 2020.08.07
    추상 클래스 (abstract class)  (0) 2020.08.06
    상속과 다형성(polymorphism)  (0) 2020.08.05
    초기화  (0) 2020.08.05
    생성자(Constructor)  (0) 2020.08.05
Designed by Tistory.