Java/Java Study

[객체지향] 추상 클래스 (5월18일 추가내용)

모모토 2021. 5. 16. 12:59
반응형

● 제어자로 abstract 가 붙고, 메서드의 내용이 없는 메서드를 갖고 있는 클래스를 추상 클래스라고 정의한다.

 

처음 추상 클래스란 개념을 맞닥뜨리게 되면 추상 클래스의 정의 자체는 그렇게 어렵지 않지만, 그래서 이 추상 클래스가 뜻하는 바가 무엇이고, 왜 쓰는지가 아마 많이 궁금할 것이다. 이에 대해서 제대로 이해만 한다고 해도 객체지향에 대한 개념은 잘 정립되었다고 봐도 무방하다고 본인은 생각한다. 따라서 이번 포스팅에서 다루어볼 예정이다.

먼저 정의를 조목조목 따져보자.

 

1) 제어자 abstract 

 

우리가 대표적으로 알고 있는 접근제어자는 private protected default public 등이 존재한다. 그 외에 각기 다른 임무를 수행하는 제어자들 중 abstract가 붙으면 추상 클래스라 하는데 abstract가 붙는다는 건 무엇을 의미할까? abstract가 붙는다는 건 바로 '미완성'이라는 의미이다. 아직은 추상적이라는 뜻이기에 우리는 추상 클래스라고 부른다. 

 

추상적이라는 건 무슨 의미인가, 바로 추상 클래스 안에 존재하는 메서드들의 내용이 아직 구현되지 않았다는 걸 의미한다. 이러한 메서드들을 우리는 추상 메서드라 부르고 추상 메서드 앞에도 abstract를 붙여준다.

 

정리하자면 추상 메서드를 갖고 있는 클래스는 추상 클래스이고 제어자로 abstract가 붙어있으면, 이 클래스는 추상 메서드를 갖고 있는 추상 클래스라는 의미이다.

 

+ 5/18일 - abstract 제어자에 관한 추가설명

 

abstract가 붙은 클래스는 추상메서드를 가진 미완성클래스라고 했지만, abstract 가 붙더라도 꼭 추상메서드가 있어야 하는건 아니다. 단지, 좀 더 주의하자는 취지로 설명을 하였던 것이다.

위의 사진을 보면 추상클래스로 선언하였지만 속에는 추상클래스가 없다. 컴파일을 하여도 문제가 일어나지 않는다. abstract라는 제어자를 보면 이 클래스가 추상클래스라는걸 인식하고 추상클래스로써 역할을 잘 할수 있게끔 해주는것이 좋다.

 

 

2) 추상 메서드

 

추상 메서드는 메서드의 이름과 매개변수의 타입, 리턴 타입만 주어진 메서드의 내용은 구현되지 않은 메서드이다.

 

abstract class TestA { // 추상클래스

	abstract void test1 (int x); // 내용을 구현하지않은 추상메서드
    	abstract void test2 ();
    
    }

 

이러한 추상 메서드를 가진 추상 클래스는 인스턴스를 생성할 수는 없다. 그렇다면 인스턴스도 생성할 수 없는 추상 클래스의 목적 은 과연 무엇일까?


추상 클래스의 목적

 

앞서 말했다시피 추상 클래스는 인스턴스를 생성할 수 없다. 추상 클래스가 인스턴스를 생성할 수 없는 이유는 추상 메서드를 가지고 있기 때문이다. 여기서 퀴즈 만약 추상 메서드를 상속받은 클래스는 인스턴스를 생성할 수 있을까?

 

정답은 불가능하다.

 

추상 클래스를 상속받으면 에러를 피하기 위하여 2가지 방법이 강요된다(추상 메서드를 상속받으므로). 첫 번째는 추상 클래스의 메서드를 오버 라이딩하여 구현부를 만들어주던가(Add unimplemented method). 나머지 방법은 상속받은 자손 클래스도 추상 클래스로 만들던가(Make type 'TestB' abstract) 둘 중 하나를 선택해야 하는데, 인스턴스를 생성하기 위해선 상속받은 자손에서 추상 메서드의 내용을 구현해주어야 한다.

 

바로 추상 클래스의 목적은 자손 클래스에서 추상 메서드의 내용을 구현할 것을 강요한다.

 

추상 클래스는 자신을 상속받은 자손들에게 자신에게서 상속받은 추상 메서드를 구현할 것을 강요함으로써, 자손 클래스들이 가져야 하는 요소들에 대한 가이드라인을 제시하는 것이다. 따라서 프로그래머는 상속받은 추상 메서드의 이름(메서드의 용도가 암시하는), 리턴 타입, 매개변수의 타입을 고려하여 메서드의 내용을 자유롭게 구현할 수 있다. 

추상 클래스의 개념으로 인하여 메서드의 선언과 구현을 분리해낸 것이다. 이는 프로그래머에게 있어서 많은 편의성을 제공한다.