인터페이스의 특징을 갖고 있는 추상적인 클래스
클래스의 공통된 부분을 뽑아 별도의 추상클래스로 만들어놓고 이것을 상속해서 사용
= 공통된 부분을 추상클래스로 선언만 해놓고 각자 알아서 오버라이드해서 쓰는 방식
특징
멤버변수를 가지고 extends 이용
추상메소드는 상속한 클래스에서 반드시 구현해야함
일반메소드나 생성자도 가질 수 있음
예제 1)
추상클래스
// 추상클래스
public abstract class No11_AbstractClass {
int num;
String str;
// 일반 생성자
public No11_AbstractClass() {
System.out.println("AbstractClass constructor");
}
public No11_AbstractClass(int i, String s) {
System.out.println("AbstractClass constructor");
this.num = i;
this.str = s;
}
// 메소드
public void fun1() {
System.out.println("---fun1() start ---");
}
// ** 추상메소드 선언만 함
public abstract void fun2();
}
추상클래스를 extends한 클래스
// 추상클래스를 extends한 클래스
public class No11_AbstractClass_Main extends No11_AbstractClass{
public No11_AbstractClass_Main() {
System.out.println("MainClass constructor");
}
public No11_AbstractClass_Main (int i, String s) {
super(i,s);// 상위클래스인 추상클래스에 접근
}
// extends한 클래스에서 추상메소드를 반드시 구현해야함
@Override
public void fun2() {
System.out.println("--- fun2()---");
}
}
실행클래스
// 실행클래스
public class No11_AbstractClass_Ex {
public static void main(String[] args) {
// 추상클래스 변수 = new extends한 클래스
// 타입이 추상클래스
No11_AbstractClass ex = new No11_AbstractClass_Main(10, "java");
ex.fun1();
ex.fun2();
}
}
예제 2)
추상클래스
public abstract class No11_AbstractClass_Bank {
String name;
String account;
int totalAmount;
public No11_AbstractClass_Bank() {
System.out.println("Bank constructor1");
}
public No11_AbstractClass_Bank(String name, String account, int totalAmount) {
System.out.println("Bank constructor2");
this.name = name;
this.account = account;
this.totalAmount = totalAmount;
}
// 예금
public void deposit() {
System.out.println("-- deposit() start--");
}
// 출금
public void withdraw() {
System.out.println("-- withdraw()--");
}
// 추상클래스
// 적금
public abstract void installmentSavings();
// 해약
public abstract void cancellation();
// 정보출력
public void getInfo() {
System.out.printf("name : %s\n", name);
System.out.printf("account : %s\n", account);
System.out.printf("totalAmount : %s\n", totalAmount);
}
}
추상클래스를 extends한 클래스
public class No11_AbstractClass_myBank extends No11_AbstractClass_Bank{
public No11_AbstractClass_myBank(String name, String account, int totalAmount) {
super(name, account, totalAmount);
}
@Override
public void installmentSavings() {
System.out.println("-- installmentSavings() start --override");
}
@Override
public void cancellation() {
System.out.println("-- cancellation() start--override");
}
}
실행클래스
public class No11_AbstractClass_Bank_Ex {
public static void main(String[] args) {
No11_AbstractClass_Bank myBank = new No11_AbstractClass_myBank("을지문덕", "123-1222-32122", 30000);
myBank.deposit();
myBank.withdraw();
myBank.installmentSavings();
myBank.cancellation();
System.out.println();
myBank.getInfo();
}
}
인터페이스 vs 추상클래스
공통점) 추상메소드(선언만 한 메소드) 를 가진다, 객체생성이 안되고 하나의 타입으로 사용된다
차이점)
- 인터페이스 : 상수, 추상메소드만 가지고 다형성 지원, implements
- 추상클래스 : 클래스의 모든 속성과 기능을 가지고 단일상속만 지원, extends
'Java' 카테고리의 다른 글
[Java] StringBuffer, StringBuilder (0) | 2021.08.01 |
---|---|
[Java] 람다식 (0) | 2021.08.01 |
[Java] 비트연산 (0) | 2021.07.29 |
[Java] 인터페이스 (0) | 2021.07.27 |
[Java] 내부클래스, 익명클래스 (0) | 2021.07.27 |