추상클래스

Byeonghyeon Kim·2021년 6월 24일
0

자바

목록 보기
18/20
post-thumbnail

추상클래스

  • 인터페이스와 비슷한 형태

  • 구체화되지 않은 멤버를 이용한 클래스

  • 인터페이스의 특징을 가지고 있는 클래스

추상클래스란?

  • 클래스의 공통된 부분을 뽑아서 별도의 클래스(추상클래스)로 만들어 놓고 이것을 상속해서 사용
  • 추상클래스의 특징
    • 멤버변수를 가짐
    • abstract 클래스를 상속하기 위해서 extends 사용
    • abstract 메서드를 가지며, 상속한 클래스에서 반드시 구현해야 함
    • 일반 메서드도 가질 수 있음
    • 일반 클래스와 마찬가지로 생성자도 있음
  • 공통된 부분을 추상클래스로 구현하고 각각의 클래스가 다른 부분들은 추상 메서드로 만들어서 각각의 클래스에서 재정의해서 사용
    • 다형성

추상클래스 구현

  • 클래스 상속처럼 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 추상클래스

// 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
*/

인터페이스 vs 추상클래스

  • 공통점

    • 추상 메서드를 가진다.
    • 객체 생성이 불가능 하며 자료형(타입)으로 사용된다.
  • 차이점

    • 인터페이스
      • 상수, 추상메서드만 가진다.
      • 추상 메서드를 구현만 하도록 한다.
      • 다형성을 지원한다.
    • 추상클래스
      • 클래스가 가지는 모든 속성과 기능을 가진다.
      • 추상 메서드 구현 및 상속의 기능을 가진다.
      • 단일 상속만 지원한다.(클래스 이기 때문)
  • 다양한 형태를 많이 추구하는 설계를 할땐 인터페이스..

  • 단일 상속을 지원하면서 인터페이스의 기능을 지원하고자 만들땐 추상클래스..

  • 뭐가 낫고 뭐가 별로다는 없다 경우에 따라 어떤걸 사용할지 고민해볼것!

profile
자기 주도 개발전 (개발, 발전)

0개의 댓글

관련 채용 정보