인터페이스와 비슷한 형태
구체화되지 않은 멤버를 이용한 클래스
인터페이스의 특징을 가지고 있는 클래스
extends
사용extends
키워드를 이용햇 ㅓ상속하고 abstract메서드를 구현// AbstractClassEx
package testPjt;
public abstract class AbstractClassEx {
// 일반 클래스 처럼 멤버를 가질 수 있음
int num;
String str;
// 기본 생성자도 있음, 일반생성자와 동일
public AbstractClassEx() {
System.out.println("AbstractClassEx constructor");
}
// 매개변수를 갖고 있는 생성자를 가질 수 있음
// this. 를 활용해 멤버변수를 수정할 수있음
public AbstractClassEx(int i, String s) {
System.out.println("AbstractClassEx constructor with args");
this.num = i;
this.str = s;
System.out.println(this.num);
System.out.println(this.str);
}
// 일반 메서드도 가질 수 있음
public void func1() {
System.out.println("this is function 1");
}
// 이것이 추상메서드
// 반드시 상속받는 클래스에서 재정의 해줘야함
public abstract void func2();
}
// ClassEx
package testPjt;
public class ClassEx extends AbstractClassEx{
public ClassEx() {
System.out.println("ClassEx constructor");
}
// super를 이용해 부모클래스인 추상클래스의 매개변수를 설정가능
public ClassEx(int ii, String ss) {
super(ii, ss);
}
// 추상메서드는 반드시 상속받는 클래스에서 재정의 해줘야함
@Override
public void func2() {
System.out.println("function2 override");
}
}
// MainClass
package testPjt;
public class MainClass {
public static void main(String[] args) {
AbstractClassEx ce = new ClassEx(10, "java");
ce.func1();
ce.func2();
}
}
/*
결과
AbstractClassEx constructor with args
10
java
this is function 1
function2 override
*/
// Bank
package bank;
public abstract class Bank {
String name;
String account;
int balance;
public Bank() {
System.out.println("Bank constructor");
}
public Bank(String name, String account, int balance) {
System.out.println("Bank constructor");
this.name = name;
this.account = account;
this.balance = balance;
}
public void deposit() {
System.out.println("save money");
}
public void withdraw() {
System.out.println("use money");
}
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("balance : %d\n", balance);
}
}
// MyBank
package bank;
public class MyBank extends Bank{
public MyBank(String name, String account, int balance) {
super(name, account, balance);
}
@Override
public void installmentSavings() {
System.out.println("istallmentSavings start");
}
@Override
public void cancellation() {
System.out.println("canceled");
}
}
// MainClass
package bank;
public class MainClass {
public static void main(String[] args) {
Bank myBank = new MyBank("홍길동", "123-123-123", 10000);
myBank.deposit();
myBank.withdraw();
myBank.installmentSavings();
myBank.cancellation();
System.out.println();
myBank.getInfo();
}
}
/*
결과
Bank constructor
save money
use money
istallmentSavings start
canceled
name : 홍길동
account : 123-123-123
balance : 10000
*/
공통점
차이점
다양한 형태를 많이 추구하는 설계를 할땐 인터페이스..
단일 상속을 지원하면서 인터페이스의 기능을 지원하고자 만들땐 추상클래스..
뭐가 낫고 뭐가 별로다는 없다 경우에 따라 어떤걸 사용할지 고민해볼것!