일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 변수
- node.js
- 바이트 단위 스트림
- 예외 처리
- 백엔드
- SSR
- 개발자
- Java
- 초보개발자
- 상속
- FileInputStream
- 새벽공부
- 문자 단위 스트림
- 코딩
- 자바
- 졸리다
- 인터페이스
- 배열
- ArrayList
- throws
- MPA
- 파이팅
- try-catch
- 자료형
- 인스턴스
- exception
- 보조 스트림
- 메서드
- 코린이
- 다형성
- Today
- Total
SHUSTORY
09-1 추상 클래스 본문
추상 클래스
추상 클래스를 영어로 표현하면 abstract class이고, 추상 클래스가 아닌 클래스는 concrete class라고 한다.
추상 클래스는 항상 구현 코드가 없는 추상 메서드를 포함한다.
{ }로 감싸진 함수의 구현부, 즉 함수 몸체가 없는 함수를 추상 메서드라고 한다.
추상 메서드는 abstract 예약어를 사용하며, { } 대신 ; 를 사용한다.
참고로 { } 를 사용하면 그것만으로도 메서드를 구현한 셈으로, 다음과 같은 메서드는 추상 메서드가 아니다.
자바에서 추상 메서드는 abstract 예약어를 사용하여 선언만 하는 메서드이다.
우리가 프로그램을 구현하고자 코딩을 하는 과정에서 로직을 만들고 기능을 구현할 때, 가장 중요한 것은
어떻게 구현할지를 결정하는 개발 설계 과정이다.
예를 들어 위와 같이 선언한 메서드를 보면 두 개의 정수를 입력받은 후 더해서 그 결과 값을 반환할 것이라고
이 메서드의 선언부만 봐도 어떤 일을 하는 메서드인지 유추할 수 있다.
함수의 선언부( 반환 값, 함수 이름, 매개 변수 )를 정의한다는 것은 곧 함수의 역할과 어떻게 구현해야 하는지를 정의하는 것이다. 그렇기 때문에 함수 몸체의 구현보다 중요한 것은 함수 선언부를 작성하는 것이다.
추상 클래스 구현하기
* 추상 클래스와 추상 메서드는 기울임꼴로 표시한다.
추상 클래스 Computer를 상속받는 일반 클래스 DeskTop 클래스와 추상 클래스 NoteBook 클래스가 있다고 해보자.
또한 NoteBook 클래스를 상속받는 NyNoteBook 클래스는 일반 클래스이다.
그리고 Computer 클래스는 두 개의 추상 메서드와 두 개의 ( 구현 코드가 있는 )일반 메서드를 가지고 있다.
위와 같이 추상 메서드 두 개를 선언하고 구현된 메서드 두 개를 작성하였다.
그러면 완전하게 구현되지 않은 두 추상 메서드에서 오류가 발생하는 것을 볼 수 있다.
메서드의 몸체를 작성하거나, abstract 예약어를 작성하라는 오류가 발생하는 것을 확인할 수 있다.
두 번째를 클릭하여 abstract 예약어를 만들어주었는데도 계속 오류가 발생하는 이유는
추상 메서드가 속한 클래스를 추상 클래스로 선언하지 않았기 때문이다.
클래스명 앞에 abstract 예약어를 만들어주면 오류가 사라진다.
상속받는 클래스 중 공통된 구현 코드는 turnOn( ) / turnOff( ) 메서드와 같이 작성하고,
하위 클래스에 따라 구현이 달라지는 코드는 display( ) / typing( ) 메서드와 같이 추상 메서드로 작성해준다.
이는 '메서드 구현에 대한 책임을 상속받는 클래스에 위임한다.' 라는 의미이다.
따라서 Computer 클래스의 추상 클래스를 상속받은 DeskTop 클래스와 NoteBook 클래스에서 실제로 구현하게 된다.
상위 클래스에서는 하위 클래스도 공통으로 사용할 메서드를 구현하고,
하위 클래스마다 다르게 구현할 메서드는 추상 메서드로 선언해 두는 것이다.
추상 클래스를 상속받은 클래스는 추상 클래스가 가진 메서드를 상속받는다.
그렇기 때문에 추상 메서드를 모두 구현하든가 혹은
상속받는 클래스도 추상 클래스로 만들든가 해야 하며 그렇지 않으면 오류가 발생하는 것이다.
Add unimplemented methods를 클릭하면 위와 같이 비어 있던 클래스 내부에 코드가 생성된다.
* 참고로 모든 메서드를 구현했어도 abstract 예약어를 사용하면 추상 클래스가 된다.
완벽한 기능이 아닌 공통 기능만을 구현해 놓을 경우 모든 추상 메서드를 구현했더라도 추상 클래스로 작성할 수 있다.
이럴 경우 해당 클래스를 생성해서 사용할 목적이 아닌 상속만을 위해 만든 추상 클래스인 것으로,
new 예약어로 인스턴스를 생성할 수 없다.
추상 클래스를 만드는 이유
위의 예제들을 바탕으로 프로그램을 실행하는 테스트 프로그램을 작성하여 살펴보자.
여기서 5, 7행에서 오류가 발생하는 이유는 무엇일까?
추상 클래스는 인스턴스로 생성할 수 없다.
추상 클래스는 모든 메서드가 구현되지 않았으므로 인스턴스로 생성할 수 없다.
만약 Computer.display( ) 메서드를 호출한다면 코드가 없으므로 수행할 수 있는 내용이 없다.
그렇기 때문에 추상 클래스는 인스턴스로 만들 수 없다.
하지만 추상 클래스에서도 형 변환을 사용할 수는 있다.
위 추상 클래스 테스트 코드에서도 볼 수 있듯이 DeskTop, NoteBook, MyNoteBook 클래스는 상위 클래스
Computer를 상속받았으므로 Computer형으로 선언하여 사용할 수 있다.
추상 클래스에서 구현하는 메서드
생성할 수 없는 추상 클래스는 어디에 사용하는 것일까?
추상 클래스는 상속을 하기 위해 만든 클래스이다.
추상 클래스에서 구현하는 메서드는 하위 클래스에서도 사용할, 즉 하위 클래스에서도 구현 내용을 공유할 메서드를 구현한다. 실제 하위 클래스에서 내용을 다르게 구현해야 한다면, 구현 내용을 추상 메서드로 남겨 두고 하위 클래스에 구현을 위임하는 것이다.
구현된 메서드 | 하위 클래스에서 공통으로 사용할 구현 코드 하위 클래스에서 재정의할 수도 있다. |
추상 메서드 | 하위 클래스가 어떤 클래스냐에 따라 구현 코드가 달라진다. |
* 추상 클래스는 많은 프레임워크에서 사용하고 있는 구현 방식이다.
'프로그래밍 > JAVA' 카테고리의 다른 글
09-3 템플릿 메서드 응용하기 (0) | 2023.03.04 |
---|---|
09-2 템플릿 메서드 (0) | 2023.03.02 |
08-6 다운 캐스팅과 instanceof (0) | 2023.03.02 |
08-5 다형성 활용하기 (0) | 2023.02.25 |
08-4 다형성 (1) | 2023.02.25 |