본문 바로가기
Java

[Java] 추상클래스

by happyhelen 2021. 7. 29.

인터페이스의 특징을 갖고 있는 추상적인 클래스

 

클래스의 공통된 부분을 뽑아 별도의 추상클래스로 만들어놓고 이것을 상속해서 사용

= 공통된 부분을 추상클래스로 선언만 해놓고 각자 알아서 오버라이드해서 쓰는 방식

 

특징

멤버변수를 가지고 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