Java/모두의 자바

Chapter 07-39 추상 클래스

계란💕 2022. 2. 8. 20:27

07-39.1 추상 클래스란?

 

  Def) 추상 클래스: 무엇을 만들려는데 어떻게 만들어야할지 모르겠을 때 사용한다. 

  Ex) '새' 라는 추상클래스 만들어 보자.

  - 클래스 앞에 "abstract"라는 키워드를 이용한다.

  - 추상클래스는 미완성의 추상 메서드를 포함할 수 있으나 객체를 생성할 수는 없다.

 

 

07-39.2 추상클래스 만들기

 

  (1) Bird 클래스 정의

<hide/>

package javaStudy;

public abstract class Bird {
	
    
}

 

  (2) 추상 클래스 정의하기

<hide/>


package javaStudy;

public abstract class Bird {
	public abstract void sing() ;
	
}

  - 추상 클래스에 상속의 장점을 활용한다면 추상 클래스를 부모 클래스로 사용 가능하다. 

  - Bird 클래스에 새의 속성을 메서드로 정의한다.

  - 메서드 sing()가 추상클래스 라는 걸 알려주기 위해 반환자료형 앞에[키워드"abstract"을 쓴다.

  - 클래스 앞에서 추상 클래스 라는 의미로 abstract를 붙인다.

  - 이제 Bird는 추상클래스이다. 

  - 그러나 추상 클래스 라고 해서 반드시 추상 메서드만을 가지는 것은 아니다. 

 

  (3)새로운 메서드 fly 정의

<hide/>

package javaStudy;

public abstract class Bird {
	public abstract void sing() ;
	public void fly() {
		System.out.println("날다");
	}
}

  - 거의 모든 새는 날 수 있으므로 fly()라는 메서드를 일반 메서드로 정의했다. 

  - 이제 추상 클래스를 상속 받은 오리를 만들자.

 

  (4) 새로운 Duck클래스 생성

  - class 이름 Duck, Superclass: javaStudy.Bird  > finish

<hide/>

package javaStudy;
public class Duck extends Bird {
	@Override
	public void sing() {
		// TODO Auto-generated method stub
	}
}
<hide/>

package javaStudy;

public class Duck extends Bird {

	@Override
	public void sing() {
		// TODO Auto-generated method stub
		System.out.println("꽥꽥!!");
	}
}

  - 꽥꽥!! 하고 울도록 sing()메서드 구현한다.

 

  (5) DuckExam 클래스 만들어서 메서드 테스트

  - duck 객체를 하나 만들어서 테스트 한다. 

<hide/>

package javaStudy;

public class DuckExam {

	public static void main(String[] args) {
		Duck duck = new Duck();
		duck.sing();
		duck.fly();	
	}
}

  Note) 출력결과: 꽥꽥!! 날다

   - fly 메서드는 Duck클래스에서는 구현하지 않았지만 Bird클래스를 상속받았기 때문에 사용 가능하다.

  - 그렇다면 Bird객체를 생성할 수도 있을까?

 

 

07-39.3 Bird객체를 생성한다면?

<hide/>

package javaStudy;

public class DuckExam {

	public static void main(String[] args) {
		Duck duck = new Duck();
		duck.sing();
		duck.fly();	

		Bird b = new Bird();
	}
}

  Note) 출력 결과: Cannot instantiate the type Bird .. 에러가 발생한다.

  - 이처럼 추상 클래스는 부모 클래스로 사용할 수는 있지만 객체를 생성할 수는 없다. 

 

 

07-39.4 추상 클래스 실습 ) 추상클래스인 Machine 클래스는 turnOn과 turnOff라는 추상 메서드를 가지고 있다. 

Machine 클래스를 Car가 상속 받도록 하고 Car 클래스에 turnOn과 turnOff를 구현하라.

<hide/>

package javaStudy;

public abstract class Machine {

	public abstract void turnOn();
	public abstract void turnOff();
	
}
<hide/>

package javaStudy;
public class CarExam {
	public static void main(String[] args) {		
		
		Car car = new Car();
		
		if( car instanceof Machine) {
			System.out.println("Car가 Machine을 상속 받았습니다.");
		}
		else {
			System.out.println("Car가 Machine을 상속 받지 않았습니다.");	
		}
	}
}

  Note) 출력 결과 : Car가 Machine을 상속 받았습니다.

  - 미완성된 메서드를 하나라도 포함하는 클래스는 추상클래스이다. 

  - 추상클래스는 미완성 클래스이므로 객체를 생성할 수 없다. (일반 클래스와 유일한 차이점)

  - 자식클래스에 상속할 수도 있고 타입으로서의 역할도 가능하다. 

  - 키워드 "extends"라고 이용한다. 

  - 추상클래스를 상속한 클래스는 추상 클래스가 가진 추상 메서드를 반드시 구현해야 한다. 

  - 하나라도 구현하지 않으면 크 클래스도 추상클래스가 된다.

  - 메서도 안에 아무 내용이 없어도 {}중괄호를 열고 닫으면 컴파일러는 메서드를 구현했다고 받아들인다.

'Java > 모두의 자바' 카테고리의 다른 글

Chapter 07-41 오버라이딩(Overriding)  (0) 2022.02.08
Chapter 07-40 super과 부모 생성자  (0) 2022.02.08
Chapter 07-38 접근 제한자  (0) 2022.02.08
Chapter 07-37 상속이란?  (0) 2022.02.08
Chapter 06-36 패키지  (0) 2022.02.07