Backend/☕️ Java

예시를 통한 추상 클래스 이해

Hugehoo 2020. 11. 16. 09:50

추상 클래스

한줄 정리: 하위 클래스로 공통된 속성과, 개별 속성(abstract method)을 상속해 줄 상위 클래스

  1. 현대차에서는 다양한 종류의 자동차가 생성된다.
  2. 각각의 자동차는 각각의 고유한 특징을 갖지만, 현대차의 공통된 특성(엠블럼, 규격 등)을 가질 수 도 있다.
  3. 공통된 부분은 취하고, 아닌 부분은 자체(각각의 자동차)에서 구현한다.

이를 자바의 추상 클래스에 빗대어 말하면

 

  1. 추상 클래스는 다양한 종류의 클래스를 생성한다.
  2.  각각의 클래스는 각자의 고유한 속성(인스턴스 속성)을 갖지만, 추상 클래스로부터 공통된 속성을 상속받아 사용하기도 한다.
  3. 상속받은 부분은 그대로 취하고, 그렇지 않은 부분은 자체 메소드로 구현한다.

 

 

- ex) HyundaiCar(추상 클래스) => (개별 클래스) Sonata, Gradeur, ---

- HyundaiCar라는 클래스에서 공통된 부분(변수, 메서드)등은 뽑아내서 사용하고, 개별적인 부분은 하위 클래스에서 자체 구현.

 

1. 추상 클래스 우선 구현 (꼭 순서를 지켜야 하는 것은 아니다, 이해를 위해서)

package pjtTest;

// Bank라는 추상 클래스 구현
public abstract class Bank {
	
	String name;
	String account;
	int totalAmount;
    
	// Bank 생성자 생성	
	public Bank(String n, String a, int t) {
		System.out.println("Bank Constructor");
		this.name = n;
		this.account = a;
		this.totalAmount= t;
	}
	// 공통 메서드
	public void deposit() {
		System.out.println("--deposit() start--");
	}
    
    // 공통 메서드
	public void withdraw() {
		System.out.println("--withdraw() start--");
	}
	
	// 추상 메서드: Bank 추상클래스를 상속받는 클래스에서 꼭 재정의 해줘야한다.
	public abstract void installmentSavings();
	
	// 추상 메서드: Bank 추상클래스를 상속받는 클래스에서 꼭 재정의 해줘야한다.	
    public abstract void cancellation();
    
    // 공통 메서드
	public void getInfo() {
		System.out.printf("name: %s\n", name);
		System.out.printf("account: %s\n",account);
		System.out.printf("account: %d\n",totalAmount);
	}

}

 

2. 추상 클래스를 상속받는 클래스 구현

package pjtTest;

// 추상 클래스 Bank를 상속받은 MyBank 클래스
public class MyBank extends Bank {

	// MyBank 클래스 구현
	public MyBank(String n, String a, int t) {
		super(n, a, t);
	}
	
    // 추상클래스에서 정의하지 못한 메소드(installmentSavings(), cancellation())를 여기서 정의해준다
	public void installmentSavings() {
		System.out.println("--installmentSavings() start--");
	}
	public void cancellation() {
		System.out.println("--cancellation() statr--");
	}
	
}

 

3. 메인 메소드에서 구현

package pjtTest;

public class lecture022{
	public static void main(String[] args) {
		
		// 인스턴스화, 상속받은 MyBank 클래스의 객체를 새로 생성 => 추상클래스 Bank형으로
		Bank myBank = new MyBank("LIM", "1234-1234", 100);
		
        // Bank추상클래스 형의 myBank라는 객체로부터 메서드 구현
        // deposit, withdraw는 MyBank 클래스에선 구현하지 않은 공통의 메서드(from Abstract Class)
		myBank.deposit();
		myBank.withdraw();
		myBank.installmentSavings();
		myBank.cancellation();
		
		System.out.println();
		
		myBank.getInfo();
		
	}
}

 

🔷 잊지 말것

1. 추상클래스는 직접 인스턴스를 구현할 수 없다.

➡ 그렇기 때문에, MyBank 클래스로부터 인스턴스를 구현했다.

Bank myBank = new MyBank("LIM", "1234-1234", 100);

 

2. 상속 받은 클래스는 반드시 추상 메서드를 구현해야 한다.

public void installmentSavings() {
		System.out.println("--installmentSavings() start--");
	}
	public void cancellation() {
		System.out.println("--cancellation() statr--");
	}