추상클래스 개념

김지원·2022년 6월 19일
0

Java

목록 보기
36/38

우리는 지금까지 클래스명을 정할 때 추상적인 개념으로 클래스를 만들고 실체화 시켰다.(객체를 만들었음.)

도형 클래스안에 '그리기'라는 기능을 넣는다고 생각해보자.
도형은 추상적인 개념이기 때문에 기능 구현을 할 수 없다.
그렇다면 이 '그리기'를 어디서 구현을 해야할까?

지금까지 우리는 삼각형, 원, 사각형 얘네를 객체로 만들어 객체로 사용하는 것을 배웠다.
근데 이 셋은 그리는 방법이 다 다르다. 각각을 어떻게 그려야 할지 모르기 때문에 매개변수를 받아와 생성자에 뭘 그릴지 넣어주었다.
너무 비효율적이다. 그래서 나온 것이 추상클래스!

👻 이 객체자체를 클래스로 만들어버리자!

  • 이등변 삼각형 정삼각형과 같은 객체를 가진 삼각형 클래스,
    타원 객체를 가진 원 클래스, 직사각형 정사각형 객체를 가진 사각형 클래스를 만들고
  • 추상적인 개념으로만든 도형이라는 추상클래스를 상속받게 하자.
  • 그리기라는 기능은 각 클래스에 재정의해주면 된다.

부모클래스에서 상속받아서 그 안에서 만들어진 메서드를 자식에 맞게끔 재정의하자.


추상클래스 abstract

불완전한 클래스

  • 추상적인 내용만 정의하고 있는 클래스로 구체적인 내용은 하위 클래스에서 구현되도록 해놓은 클래스.
  • 추상클래스는(부모) 클래스들의(자식) 공통요소들을 가상화 시켜놓는다.
  • 객체화는 가능하나 잘 사용하지 않는다. (목적에 어긋난다.)
  • 부모 추상클래스의 역할은 단지 자식 클래스를 만들 때 도와주는 역할을 수행하기 위해 존재한다. (다형성)
  • 자식 클래스에서 재정의할 메서드의 이름만 가지고 있다. 즉 {바디}를 가지지 않는다.
  • 그 메서드를 추상 메서드라고 하며, abstract 키워드가 앞에 붙는다.
    추상클래스는 상속의 개념을 가지고 있다.
abstract 추상클래스명 {
	abstract 추상메서드명();
}

추상클래스에는 어떤 것을 만들 수 있을까?

일반클래스에서는 메서드를 재정의하려면 부모에 선언(중괄호)이 되어있어야 한다.

추상클래스에서 메서드는 void draw(); 이렇게 끝이난다.

추상이기 때문에 abstract 를 붙여서 선언한다 : 추상메서드

abstract void draw();

  • 추상클래스안에는 추상메서드가 있다.
  • 항상 추상메서드만 있는 것이 아닌 일반메서드도 선언 가능하다.

자식클래스에게 '나는 선언만 할테니 너가 만들어' 라고 얘기한다.
안에 바디가 없으므로 무조건 재정의해야한다. 즉, 강제성을 띈다.

👊 추상 메서드는 자식 클래스에서 강제적으로 반드시 재정의 해야한다.

부모클래스에서 만드는 메서드들을 꼭 자식클래스에 상속시키기위해서 (사용하게 하기 위해서) 추상클래스를(부모) 만드는 것이 목적이다. 그래서 이 목적을 잊지 않고 자식클래스들의 공통요소를 생각하면서 만들어야 한다.


  • 클래스 앞에 A라고 붙은 것을 볼 수있다. = 추상클래스
public abstract class Shape {
	double area;
	//추상메서드
	abstract void showArea(double w, double h); //면적구하기 
	//외부에서 가로,세로 높이 가져온다. 
	//바디가 없으니 추상클래스이다.
	//일반메서드 
	final void function() {
		System.out.println("추상클래스의 일반 메서드입니다.");
	}
}
class Rect extends Shape {

	@Override
	void showArea(double w, double h) {
		area = w*h;
		System.out.println("넓이 : " + area);
	}
}
class Tri extends Shape {
	@Override
	void showArea(double w, double h) {
		area = (w*h) / 2;
		System.out.println("넓이 : " + area);
	}
}
public static void main(String[] args) {
		new Rect().showArea(10,50);
		//객체를 만들 필요가 없으니 new를 바로 사용한다.
		new Tri().showArea(30, 15.9);
	}
}

  • 다른 메인에서 불러왔다.

final void function() {}
재정의하지 못하게 하는 것도 있다. 저장공간에 값을 넣었는데 사용하지 못하게 할 때 사용한다.
=> 메서드에 final을 붙여서 재정의하지 말고 사용만해라 라는 의미를 가지게 한다.

자식클래스에서 재정의하는 것을 막기 위해서, 사용만 하기 위한 목적을 가진다.
추상클래스에 추상클래스를 상속할 떄는 재정의할 필요가 없다.


대중교통 실습.
모든 대중교통은 요금이라는 기능이 들어가야한다. => abstract메서드로 사용(강제성)
정류장은 규칙성이 없고 고유의 번호를 가지고 있으니 배열로 만들자.

대중교통 자식클래서 메인에(view단) 이용하실 대중교통을 선택하세요.

0개의 댓글

관련 채용 정보