추상 클래스
- 개발할때 밑그림 그리는 것 → 미리 구조 짜놓기 + 일반 변수, 일반 메소드 구현된것
- 프로그램에서 설계와 구현으로 분리시키면 설계에 해당
- 키워드 : abstract
추상 메소드
• abstract 키워드를 붙혀 메소드의 선언부만 있고 구현은 되어있지 않은 형태
• 메소드의 중괄호가 없고 ( ; ) 세미콜론으로 끝남
✍🏻 ex)
public abstract String getName();
public abstract String setName(String name);
추상 클래스
• 일반 멤버들과 함께 추상 메소드를 포함하는 클래스
• 추상 메소드가 없지만 abctract 키워드를 붙혀도 추상클래스가 될수 있음
• 추상 메소드가 하나라도 있으면 무조건 추상 클래스
• 클래스 안에 추상 메소드가 있는데 abstract 키워드를 클래스 앞에 기술 안하면 Error❗
✍🏻 ex)
abstract class Shape{ // 추상 클래스(키워드 붙히기)
public Shape(){}
public abstract void draw(); // 추상 메소드
}
- 추상클래스는 객체 생성 불가
불완전한/미완성인 클래스이므로 객체생성 > 메모리에 올릴 수 없다.
✍🏻 ex)
Shape s = new Shape(); (X)
Shape s (O)new로 객체 생성을 하지 않았기 때문에 변수 선언만은 가능
- 상속에서 수퍼클래스로 사용됨. 부모클래스 될수 있음. 상속 키워드 extends 사용
- 추상클래스를 물려받은 서브클래스를 완성 시키려면 메소드 오버라이딩을 해야함
추상클래스를 단순히 상속만 받은 서브클래스는 그 또한 추상클래스가 됨
추상메소드를 그대로 상속받기 때문에 구현하지 않는다면 클래스 앞에 abstract 키워드를 붙여줘야함
✔ 추상 클래스 단순 상속
(추상메소드 구현X) → 추상클래스 → abstract 키워드 클래스 앞에 붙히기
abstract class Rect extends Shape{ int width; public Rect() {} }
✔ 추상 클래스, 추상메소드 구현 → 객체 생성 가능
class Rect extends Shape{
int width; public Rect() {}
@Override // 추상메소드 구현하여 실행 가능한 코드로 오버라이딩
public void draw(){ System.out.println("Rect"); }
}
- 추상 클래스를 상속받은 서브클래스는 개발자들이 추상메소드들을 모두 구현해야 한다.
→ 추상클래스 가이드라인, 서브클래스는 가이드에 따른 구현하여 사용가능한 실제 클래스 - 추상클래스로 만들지 않고 일반 클래스로 상속을 받아 오버라이딩시, 개발자의 실수로 메소드명을 잘못 기술하더라도 프로그램상에서는 오류가 발생하지 않는다.
그런데 추상 클래스로 만들어 상속받아 오버라이딩을 하면 바로 오류가 생겨 개발자의 실수를 미연에 방지해준다.
인터페이스 interface (구격)
- 키워드 : interface
키워드를 사용하여 클래스를 선언하듯이 인터페이스를 선언
interface 인터페이스명 {} - 인터페이스 멤버는 추상메소드와 상수만으로 구성된다.
✔ 인터페이스 기본 구조
interface 인터페이스명 {
public static final 타입 변수명 = 값; // 만들때 값 집어넣기
public abstract 리턴타입 메소드명();
}
✍🏻 ex)
interface PhoneInterface{
public static final int BUTTONS = 20; // 상수
public abstract void sendCall(); // 추상메소드
public abstract void receiveCall();
}
** 인터페이스 멤버는 누구나 접근 가능하게 모두 public 타입이다.
- 모든 메소드는 public abstract 이며, 생략가능하다.
- 상수는 public static final 타입이며, 생략가능하다.
✍🏻 ex)
interface PhoneInterface{
int BUTTONS = 20; // public static final 생략
void sendCall(); // public abstract 생략
void receiveCall();
}
- 인터페이스는 객체를 생성 할 수 없다.
- 인터페이스 타입의 레퍼런스 변수 선언은 가능
PhoneInterface iPhone; (O)
new PhoneInterface(); (X) 객체 생성 X
인터페이스 상속
- 인터페이스는 다른 인터페이스를 상속 받을 수 있다
- 인터페이스는 구격과 같은것이므로 상속을 통해 기존 인터페이스에 새로운 규격을 추가한 새로운 인터페이스를 만들 수 있다.
- extends 키워드 이용
✍🏻 ex)
interface MobilePhoneInterface extends PhoneInterface{
void sendSMS(); // 새로운 추상메소드(규격) 추가
void receiveSMS();
}
❗ 인터페이스의 다중 상속 허용
interface DualCameraPhoneInterface extends MobilePhoneInterface, CameraInterface{
void makeVideo();
}
인터페이스 구현
- 인터페이스의 추상메소드를 모두 구현한 클래스를 작성하는것
- 키워드 : implements
✍🏻 ex)
class IPone implements MobilePhoneInterface{
// 추상메소드 구현
public void sendCall() {}
public void receiveCall() {}
.....
// 추가적으로 다른 메소드, 변수 작성 가능
public int getButtons() {}
public int startApp() {}
}
❗추상메소드 중 하나라도 구현 안하면 Error
인터페이스 목적
골격만 짤거야, 구조만 설계해놓고 내용물은 알아서 구현 → interface (확장성이 좋아서 더 많이 씀)
골격은 짜는데 특정부분은 내가 짜서 줄거야 → 추상클래스
인터페이스의 다중 구현
클래스는 하나 이상의 인터페이스를 구현 가능
✍🏻 ex)
class SamsyngPhone implements MobileInterface, cameraInterface{
}'basic > java 이론' 카테고리의 다른 글
| 자바 문법 배운것 총정리 (0) | 2021.05.13 |
|---|---|
| day 15 - 싱글톤 Singleton, 내부 클래스, 예외처리 Exception handling (0) | 2021.05.12 |
| day 13 - 상속과 생성자, 메소드 오버라이딩, 다형성 (0) | 2021.05.10 |
| day 12 - 상속 inheritance (0) | 2021.05.07 |
| day11 - 생성자 constructor, 접근지정자 (0) | 2021.05.06 |