자바의 정석 7장 (16일차) - 추상클래스 abstract class

728x90

추상클래스

미완성 메서드: 몸통 { } 이 없는 미완성 메서드 = 추상클래스; 미완성 설계도

  • 목적: 다른 클래스 작성에 도움을 주기 위함
    • 각각의 자손 클래스마다 조건이 다르므로 꼭 필요한 메서드지만 기능을 달리할 필요가 있는 메서드들은 조상에게 상속을 받아오고 자손의 클래스로 넘어올 때 기능을 각기 구현해준다
    • 각기 구현해줌으로써 코드도 간결화되고 유지보수가 쉬워지는 장점

도움이 되는 과정

  • 미완성 설계도가 1개 있다고 치면 추상 클래스는 그 미완성 설계도의 작성을 도와주는 추가 설계도라고 볼 수 있다.
  • 그 설계도만 고침으로써 코드의 중복을 막아주고 나머지 코드를 동일화시켜서 관리가 용이해진다.
  • 또한 각각의 의미있는 단계를을 추상클래스로 정의해 놓으면 나중에 특정 부분을 수정할 때 일처리가 쉬워진다.

 

설명:

  • 클래스 이름, 메서드에 abstract를 붙여야 함
  • 인스턴스 생성이 불가능하지만 상속을 받으면 상속받은 자손 인스턴스통해 인스턴스 생성 가능
public class Unnamed {
	public static void main(String[] args) {
		undefined df = new defined();
	}
}
class defined extends undefined{}

abstract class undefined{}

 

추상 클래스를 조상으로 상속받을 시

  • 상속받은 모든 메서드를 구현해주어야 사용 가능
  • 메서드들을 구현하지 않으면 상속받은 자손 클래스에도 abstract를 붙여줘야 함
	public static void main(String[] args) {
	}
}
class account extends stock{
	int balance;
	int stockprice;
	
	void listup() { //미완성된 메서드를 자손의 클래스에서 구현
	}
	void stockprice() { // 두개다 구현하지 않으면 abstract를 붙여야 에러가 안남
//		총 상속받은 메서드가 2개이므로 꼭 2개를 다 구현해주어야 abstract를 붙이지 않음
	}
}

abstract class stock{
	abstract void listup();
	abstract void stockprice();
}

 

추상 클래스에 일반 메서드 구현 가능

 

이유: 상속받은 자손이 객체를 생성 가능한 조건으로 맞춰주고 메서드 조건을 만들었기 때문에 미리 구현 가능

 

abstract class stock{
	
	int currentprice;
	int date;
	
	abstract void listup();
	abstract void stockprice(int currenprice);
	
	void check() {
		stockprice(currentprice);
	}
}

 

추상 클래스를 조상으로 두고 자손이 클래스를 완성한 경우

 

출력문:

현재 가격은 10000 입니다.
삼성전자 현대차

public class Abstract {
	public static void main(String[] args) {
		stock ac = new account();
		ac.stockprice(10000);
		ac.list = "삼성전자" + " " + "현대차";
		System.out.println(ac.list);
		
	}
}
class account extends stock{
	void listup() { //미완성된 메서드를 자손의 클래스에서 구현
		System.out.println(list);
	}
	void stockprice(int currnetrprice) { // 두개다 구현하지 않으면 abstract를 붙여야 에러가 안남
//	총 상속받은 메서드가 2개이므로 꼭 2개를 다 구현해주어야 abstract를 붙이지 않음
		System.out.println("현재 가격은 " + currnetrprice + " 입니다.");
	}
}

abstract class stock{
	String list;
	
	abstract void listup();
	abstract void stockprice(int currenprice);
}

추상 클래스의 작성

기존 클래스의 공통 부분을 추출하여 abstract, 추상 메서드로 만든 후 선언부만 추출하여

각각의 개별 클래스에 맞는 코드 작성

 

  • 클래스들을 배열화 시켜 각각의 기능에 맞게 값을 도출 - 객체 배열화 (참조변수를 묶음)
  • 아래의 예시는 가격을 달리하여 값을 출력함

출력문:

삼성전자의 현재 가격은 14000원 입니다.
삼성전자의 현재 가격은 22000원 입니다.

package Lecture;

public class Abstract {
	public static void main(String[] args) {
		stock[] ac2 = {new account(), new account2()};
//		클래스를 배열화 시켜 for문으로 각각의 동일한 호출문을 통해 값 도출
		for(int i = 0; i<ac2.length; i++) {
			ac2[i].list = "삼성전자";
			System.out.print(ac2[i].list+ "의 ");
			ac2[i].stockprice(10000);
		}
	}
}
class account extends stock{
	void listup() { //미완성된 메서드를 자손의 클래스에서 구현
		System.out.println(list);
	}
	void stockprice(int currnetrprice) { // 두개다 구현하지 않으면 abstract를 붙여야 에러가 안남
//	총 상속받은 메서드가 2개이므로 꼭 2개를 다 구현해주어야 abstract를 붙이지 않음
		System.out.println("현재 가격은 " + (int)(currnetrprice * 1.4) + "원 입니다.");
	}
}
class account2 extends stock{
	void listup() { //미완성된 메서드를 자손의 클래스에서 구현
		System.out.println(list);
	}
	void stockprice(int currnetrprice) { // 두개다 구현하지 않으면 abstract를 붙여야 에러가 안남
//	총 상속받은 메서드가 2개이므로 꼭 2개를 다 구현해주어야 abstract를 붙이지 않음
		System.out.println("현재 가격은 " + (int)(currnetrprice * 2.2) + "원 입니다.");
	}
}
abstract class stock{
	String list;
	
	abstract void listup();
	abstract void stockprice(int currenprice);
}

 

 

728x90