티스토리 뷰

추상 클래스 ( Abstract Class ) 란 ?

하나 이상의 추상메소드를 가진 미완성의 클래스

 

  • abstract 키워드를 사용합니다.
  • 상속받을 때 extends 키워드를 사용합니다.

 

추상 메소드란 ?

body { } 가 없고, 선언만 되어있는 미완성의 메소드

 

// 추상클래스 Animal
public abstract class Animal {

	// 추상메소드 bark()
	public abstract void bark();
    
	public void eat(String feed) {
        	System.out.println(feed + " 먹는다.");
	}
}

 

  • 이 추상클래스를 상속받는 자식클래스에서 해당 추상메소드를 오버라이딩하여 무조건 구현해야 합니다.

// 자식클래스 Cat
public class Cat extends Animal {

	@Override
	public void bark() {
		System.out.println("냥냥냥냥");
	}
}
// 자식클래스 Dog
public class Dog extends Animal {

	@Override
	public void bark() {
		System.out.println("댕댕댕댕");
	}
}
public class MTest {

	public static void main(String[] args) {
    
		Animal cat = new Cat();
		Animal dog = new Dog();
        
		cat.bark();
		dog.bark();
        
		cat.eat("츄르");
		dog.eat("생닭");
}

실행 결과

 

  • 추상클래스는 new 연산자로 객체 생성을 할 수 없습니다!

Animal a = new Animal();	// 컴파일 에러!

 


 

인터페이스 ( Interface ) 란 ?

추상메소드로만 구성된 추상클래스

 

  • 상수 (static final) 만 멤버로 가집니다.

  • private, protected 사용이 불가능합니다.

  • 인터페이스는 모든 메소드가 추상메소드이므로 abstract 키워드를 생략해도 됩니다.

  • 상속받을 때 implements 키워드를 사용합니다.

  • 다중 상속이 가능합니다. 인터페이스가 인터페이스를 상속받을 땐 extends 키워드를 사용합니다.

 

코드로 이해하기

com.area 패키지의 클래스 다이어그램

인터페이스 Area.java

public interface Area {

	String PRINT = "넓이 : ";
	
	public void print();
	public void make();
}

 

Area 인터페이스를 상속받는 추상클래스 AreaImpl.java

public abstract class AreaImpl implements Area {
	
	private String result;

	@Override
	public void print() {
		System.out.println(PRINT + result);
	}

	public abstract void make();

	public void setResult(String result) {
		this.result = result;
	}
}

 

AreaImpl 클래스를 상속받는 자식클래스 Circle.java , Triangle.java , Square.java

import java.util.Scanner;

public class Circle extends AreaImpl {

	@Override
	public void print() {
		System.out.print("원의 ");
		super.print();
	}

	@Override
	public void make() {
		Scanner sc = new Scanner(System.in);

		System.out.println("반지름을 입력해 주세요 : ");
		int a = sc.nextInt();

		double area = (double) (a * a * Math.PI);

		setResult(Double.toString(area));
	}
}
import java.util.Scanner;

public class Triangle extends AreaImpl {

	@Override
	public void print() {
		System.out.print("삼각형의 ");
		super.print();
	}

	@Override
	public void make() {
		Scanner sc = new Scanner(System.in);

		System.out.println("밑변의 길이를 입력해 주세요 : ");
		int a = sc.nextInt();
		System.out.println("높이의 길이를 입력해 주세요 : ");
		int b = sc.nextInt();

		double area = (double) (a * b / 2);

		setResult(Double.toString(area));
	}
}
import java.util.Scanner;

public class Square extends AreaImpl {

	@Override
	public void print() {
		System.out.print("사각형의 ");
		super.print();
	}

	@Override
	public void make() {
		Scanner sc = new Scanner(System.in);

		System.out.println("가로의 길이를 입력해 주세요 : ");
		int a = sc.nextInt();
		System.out.println("세로의 길이를 입력해 주세요 : ");
		int b = sc.nextInt();

		int area = a * b;

		setResult(Integer.toString(area));
	}
}

 

메인메소드가 있는 MTest.java

import java.util.Scanner;

public class MTest {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		System.out.println("도형을 선택해 주세요 : ");
		System.out.println("[ 1:원 2:삼각형 3:사각형 ]");

		int select = sc.nextInt();
		Area area = null;

		switch (select) {
		case 1:
			area = new Circle();
			break;
		case 2:
			area = new Triangle();
			break;
		case 3:
			area = new Square();
			break;
		}

		area.make();
		area.print();
	}
}

 

실행 결과 1
실행 결과 2
실행 결과 3

최근에 올라온 글
«   2024/07   »
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
Total
Today
Yesterday