추상 메소드와 추상 클래스
추상 메소드
abstract가 붙어있고, 중괄호가 없다. 즉, 실행문을 넣을 곳이 없는데, 이를 동작시키기 위해선 오버라이딩을 사용
추상 클래스 2종류
- 추상 메소드가 있는 클래스와 없는 클래스가 있음
- 추상 메소드가 있으면 반드시 클래스 앞에 abstract를 붙여야 함(추상 메소드 없어도 붙일 수 있음)
2가지 종류의 추상 클래스
1. 추상 메소드를 가지는 추상 클래스
2. 추상 메소드를 안가지는 추상 클래스
- 이게 지금까지 우리가 만들던 클래스
추상 클래스의 객체 생성
추상 클래스는 객체 생성을 하지 않는다.
위 식에서는 추상 클래스로 객체생성을 하려는 과정에서 오류가 발생한다.
추상 클래스의 상속
1. 단순 상속
서브 클래스는 Line으로 Shape에서 상속을 받았다.
여기서 추상 메소드는 draw로 상속은 받았는데, 서브 클래스에 구현은 하지 않았다.
즉, 상속만 받은 것에서 끝이다.
2. 구현 상속
- 구현 상속은 오버라이딩을 한 것.
- 오버라이딩을 하면 추상 클래스는 더이상 추상 클래스가 아니다.
- 오버라이딩을 통해서 구현을 함
추상 클래스의 구현 및 활용 예
추상 클래스로 바꾸는 이유는 일단 간단하게 나타낼 수 있기 때문. 또한, 위에서는 "Shape"를 굳이 출력할 일이 없으며, 각 상속 받는 서브 클래스에 오버라이딩을 사용해서 각자의 값을 출력할 거면 추상 클래스로 사용하는 것이 편하다.
설계는 추상 클래스에서, 구현은 오버라이딩으로
<예제>
추상 클래스 / 인터페이스
각 서브 클래스 메소드에 중복되는 부분도 있지만 클래스마다 차이점이 있다.
각 서브 클래스에서 공통되는 메소드는 슈퍼 클래스로 올려줌
모두에게 공통이 아니더라도 몇 개의 클래스 마다 같이 겹치는 메소드도 존재.(날기, 수영과 같은 것)
날기, 수영은 모두에게 공통은 아니지만 몇몇 클래스는 겹치는 부분이 있는 메소드
여기서 날기, 수영을 추상 메소드로 주고, 해당 클래스에 오버라이딩?
추상 클래스로부터도 상속 받고, 슈퍼 클래스로 부터도 상속 받는 것은 다중상속이라서 불가능하다.
이런 경우에서 깔끔하게 설계하기 위한 것이 인터페이스.
날기, 수영을 인터페이스로 만드는 경우 다중 상속이 가능해진다.
비둘기, 펭귄은 클래스 1개, 인터페이스 1개
오리는 클래스 1개, 인터페이스 2개
타조는 클래스만.
<예제>
인터페이스와 추상클래스는 객체 생성이 불가능하다.
(인터페이스 타입은 하나만 만들어두고, 여러 객체를 그때 그때 수정해서 선택해 사용 가능
하지만 인터페이스 타입이 아니면 각각 하나씩 따로 만들어야 함)
자바 인터페이스
선언
ex) public interface InterfaceEx{ ... }
변화
- 위의 빨간 체크는 멤버의 허용 범위
- TIMEOUT는 상수
- sendCall, receiveCall은 추상메소드
- printLogo는 디폴트 메소드
- 괄호친 것은 생략이 가능한 부분
- 타임아웃의 경우 final을 생략하면 변수인지 상수인지 구분이 어렵다.
- 테스트해보기 위해서는 여기에 다른 수를 넣어서 변하면 변수, 변하지 않으면 상수
자바 인터페이스 전체적인 특징
- 인터페이스의 객체 생성은 불가능(new PhoneInterface(); - x)
- 인터페이스 타입의 레퍼런스 변수는 가능하다.(PhoneInterface galaxy; - ㅇ)
- 인터페이스는 중괄호 안에 추상 메소드를 가지고 있으며, 이 메소드의 구현은 오버라이딩으로
- 다중 상속 가능(클래스는 불가능 하지만, 인터페이스는 가능)
<예제>
인터페이스 상속
1.
인터페이스에서 인터페이스의 상속이 일어났는데, 이 경우에는 extends를 사용
(클래스일 경우에는 implements)
두 개의 메소드는 추상메소드로 abstract가 생략
2.
MP3Interface 안에는 1과 마찬가지로 abstract가 생략된 추상 메소드 2개 존재
MusicPhoneInterface는 2개의 인터페이스를 다중 상속받고 있다.
이 안의 메소드 역시 추상메소드다.
다중 인터페이스 구현
AIInterface와 MobilePhoneInterface는 인터페이스, Alphone는 클래스다.
AIPhone가 클래스라서 implements로 인터페이스 둘을 상속받는다.
6개의 메소드는 모두 오버라이딩 된 메소드들이다.
마지막의 int touch는 AIPhone클래스에 추가로 만든 메소드이며, public를 생략 가능하다.
하지만 인터페이스에서 오버라이딩 된 메소드들은 앞의 public를 생략하면 오류가 발생한다.
추상 클래스와 인터페이스 비교
- 추상 메소드는 두 경우 다 만들 수 있다.
- 일반 메소드의 경우는 추상 클래스에서는 만들 수 있지만, 인터페이스에서는 불가능
*일반 메소드 : public private protected 생략된 default
(단, default메소드의 경우는 오류가 나지 않고 만들 수 있는데, 이를 일반메소드라고 보면 인터페이스도 일반 메소드를 사용할 수 있다고 봐야할 것. - 여기서 default는 추상메소드로 인식되지 않도록 쓰는 용도)
- 다중 상속은 인터페이스만 가능하다.
<예제>
<예제>
'학원 > JAVA - 학원' 카테고리의 다른 글
패키지 (0) | 2022.02.16 |
---|---|
내부 클래스, 무명 클래스 (0) | 2022.02.16 |
상속 (0) | 2022.02.11 |
클래스와 객체 (0) | 2022.02.07 |
예외 처리(Exception) (0) | 2022.02.04 |