Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Min's dev-log

[JAVA] 추상 클래스 이야기 본문

JAVA

[JAVA] 추상 클래스 이야기

minyy 2023. 5. 13. 21:11

추상 클래스를 쓰는지 먼저 알아보자.

※ JAVA는 다중 상속을 허용하지 않는다!

공통점을 가지는 자식 클래스들의 부모 클래스가 없는 경우,

이 부모 클래스를 제작하기 위해 탄생한 문법이 추상 클래스이다.

하지만 현재에는 "설계"가 최우선 시 되므로 이런 경우가 없다.

즉, 지금 추상 클래스는 부모 클래스를 제작하기 위해 사용하지는 않는다.

 

★ 현재는 여러 개의 자식 클래스들을 만들고 싶을 때, 이들의 공통점들을 선 제작하는 용도로 사용한다.

: 추상 클래스로는 객체를 만들지 않음

: 왜? 클래스들의 공통점에 관심이 있기 때문! 붕어빵(객체)에는 관심이 없다.

: 붕어빵틀(클래스)들의 틀 

 

추상 클래스는 클래스들(자식)이 어떻게 정의되어야 하는지에 관심 있는 것

정의당한 클래스들로부터 객체를 만드는것

객체들이(자식) 무엇을 가져야하는지 클래스들을(객체들을) 정의하는데 관심이 있는것이다!!

 

추상 클래스(abstract class)

하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 한다.

추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.

즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면,

이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다. (★ 오버라이딩 강제 ★)

 

문법

abstract class 클래스이름 {

...

abstract 반환타입 메소드이름();

...

}

 

여기서 abstract을 왜 썼나?

하위로 여러 클래스들을 정의하기 위해서 사용한다.

abstract 키워드는 해당 클래스를 추상 클래스로 만들어준다.

: 객체화가 불가능해진다. 객체화를 못하도록 강제성을 부여한다.

: "강제성"은 좋은 것이다. 실수로 객체화를 할 수도 있는데 그것을 방지해준다.

: 즉 개발이 용이해진다.

 

추상 클래스는 객체화가 불가능하고 추상 메서드를 가질 수 있다.

추상 메서드를 만들었다면 클래스도 추상 클래스로 만들어 줘야 한다.

 

☆ 만약 추상 클래스의 메소드를 실행시키고 싶다면?

☆ 추상 클래스의 어떤 메서드가 모든 자식클래스에게서 오버라이딩된다면?

: 추상 클래스의 해당 메서드는 사용할 수 없다..!!

 

package class01;

// 클래스들을 위한걸 만들것 -> abstract
abstract class Shape{
	String name;
	double area; // 모양마다 넓이가 다르고
	
	void draw() { // 
		System.out.println(this.name+" 그림 그리는중...");
	}
	
	abstract void setArea(); // 내 하위클래스들이 꼭 오버라이딩했으면..!
		// 각 클래스마다 다르다 -> 오버라이딩 필수 -> abstract사용
	
	@Override
	public String toString() {
		return this.name+"의 넓이: "+this.area;
	}
	
	Shape(String name){
		this.name=name;	 
	}
}
class Circle extends Shape{
	// 1- 추상메서드가 오버라이딩을 강제
	// 2- 부모클래스에게 기본생성자가 없는 상태
	int radius;
	@Override
	void setArea() {
		this.area=this.radius*this.radius*3.14;
	}
	Circle(int radius){
		super("원");
		this.radius=radius;
		this.setArea(); // 멤버변수를 초기화한후에 사용하는게 맞는상황이라
		// 마지막에 사용한것 => 결국 멤버변수 전체 초기화한것
	}
}

class Rect extends Shape{
	int x;
	int y;
    
	@Override
	void setArea() {
		// TODO Auto-generated method stub	
	}
	
	Rect(int x, int y) {
		super("네모");
		this.x=x;
		this.y=y;
		this.setArea();
	}
}

public class Test02 {
	public static void main(String[] args) {
		Circle c=new Circle(1);
		c.draw();
		System.out.println(c);
		
		Rect r=new Rect(10,20);
		r.draw();
		System.out.println(r);	
	}
}

 

'JAVA' 카테고리의 다른 글

[JAVA] 컬렉션 프레임워크  (0) 2023.05.18
[JAVA] 배열 리스트  (0) 2023.05.15
[JAVA] 문자열 비교 equals()와 Object  (1) 2023.05.11
[JAVA] 동적바인딩  (0) 2023.05.04
[JAVA] 상속  (0) 2023.05.04
Comments