티스토리 뷰
추상 클래스 ( 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 키워드를 사용합니다.
코드로 이해하기
인터페이스 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();
}
}
'JAVA > 이론' 카테고리의 다른 글
[JAVA] 제네릭 ( Generic ) <> (0) | 2019.12.03 |
---|---|
[JAVA] 컬렉션 ( Collection ) Framework - List, Set, Map (0) | 2019.12.03 |
[JAVA] [OOP] 상속 ( Inheritance ) 과 다형성 ( Polymorphism ) (0) | 2019.11.28 |
[JAVA] [OOP] 생성자 ( Constructor ) 에 대하여 (0) | 2019.11.27 |
[JAVA] [OOP] 클래스 , 객체 , 인스턴스 란 ? (2) | 2019.11.27 |