버글버글

Java 수업 기록 (12) 상속-abstract 본문

java/java 수업 기록

Java 수업 기록 (12) 상속-abstract

Bugle 2022. 8. 3. 00:00
반응형

추상클래스 (abstract class) 

- 자주 사용 되지는 않는다.

* 추상 메소드

1. 본문이 없는 메소드
2. 호출용으로 사용되는 메소드
3. 중괄호{} 자체를 없애고 세미콜론(;)을 추가함
4. public abstract(추천) 또는 abstract public

 

* 추상 클래스

1. 추상 메소드가 1개 이상 존재하는 클래스.

2. public abstract class

3. 본문이 없는 메소드를 포함하기 때문에 객체 생성이 불허됨.

4. 추상 클래스를 상속 받는 클래스는 "반드시" "모든" 추상 메소드를 오버라이드 해야 함. 

 

- 추상 메소드가 있기 때문에 추상 클래스가 있는 것이다.

 

예시) 아래에서 Shape 클래스타입의 객체는 존재할 수 없는 객체이다.

public class Shape {
	
	private String type;

	public Shape(String type) {
		this.type = type;
	}

	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	
	public double getArea() {		
		return 0;
		// shape를 상속 받는 객체들이 호출할 때 사용하는 메소드.
		// = 사용되지느 않는다. → 추상 메소드로 바꿔준다.
		// 모든 도형은 넓이가 있지만, 결정된 도형이 없어서 리턴 0
		// 넓이가 없는데 굳이 0을 넣은 이유는 호출 때문이다.
		// 0이라도 없으면 호출이 안된다. 0을 넣은 이유는 오직 호출 때문이다.
	}								
	

}

여기서 getArea를 아래와 같이 바꿔주면 추상 메소드로 바꾸는 것이다.

public class Shape public abstract class Shape
public double getArea() {
return 0;}
public abstract double getArea();
public abstract class Shape {
	
	private String type;

	public Shape(String type) {
		this.type = type;
	}

	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	
	public abstract double getArea();

}
public class Circle extends Shape {
	
	private double radius;

	public Circle(String type, double radius) {
		super(type);
		this.radius = radius;
	}

	// Shape 클래스는 추상 클래스이므로, 반드시 double getArea() 메소드를 오버라이드 해야 함.
	@Override
	public double getArea() {
		return Math.PI * Math.pow(radius, 2);
	}
public class Main {

	public static void main(String[] args) {

		// Shape 클래스타입의 객체는 존재할 수 없는 객체이다.
		// abstract 처리해서 객체의 생성을 막을 수 있다.
        
		/* 아래는 추상 클래스기 때문에, 오류가 뜬다. 객체 생성이 불허 됨.
		Shape s1 = new Shape("도형");
		System.out.println(s1.getType());
		System.out.println(s1.getArea());
		*/
		
		Shape s2 = new Circle("원", 1);
		System.out.println(s2.getType());
		System.out.println(s2.getArea());

	}

}
반응형