728x90
반응형
추상 클래스와 인터페이스의 차이점에 대해 표로 정리해 본다.
추상클래스 | 인터페이스 | 비고 | |
정의 | 클래스 내 '추상메소드'가 하나 이상 포함되어 있거나 abstract로 정의된 경우 | 모든 메소드가 추상 메소드인 경우 | |
목적 | 상속을 받아 기능을 이용하고 확장 하는 것 | 함수의 구현을 강제하기 위함. 이로 인해 구현 객체의 같은 동작을 보장 함. | |
상속, 구현 | 다중 상속 지원하지 않아 1개만 상속 | 구현이라서 여러개의 인터페이스를 구현할 수 있음 | |
구상 메소드 | 구상 메소드가 존재할 수 있다. | 구상 메소드 자체가 있을 수 없다. | |
생성자 | 생성자를 가질 수 있다. | 생성자를 가질 수 없다. | |
변수 | 일반 변수를 가질 수 있다. | 상수만 가질 수 있다. | |
예제
도형
package com.example.demo.abst;
public abstract class Shape {
public abstract void draw();
}
기본적으로 추상클래스 또는 인터페이스에서 구현해야 할 메소드를 '선언'한다.
그리고 나서 해당 메소드를 실제로 구현할 때는 추상적인 내용이 아니라 구상, 구체적인 내용을 기록한다.
@Slf4j
public class Circle extends Shape {
@Override
public void draw() {
log.info("draw circle");
}
}
@Slf4j
public class Rectangle extends Shape {
@Override
public void draw() {
log.info("draw rectangle");
}
}
@Slf4j
public class Triangle extends Shape {
@Override
public void draw() {
log.info("draw triangle");
}
}
각각 구현된 Shape들을 간편하게 가져다가 사용하기 위해서는 Factory Pattern을 사용한다. 간단하게 하기 위해 int를 사용했지만 Enum 값을 사용하여 명시적으로 무엇을 사용할지 표현하는 것이 좋다.
public class ShapeFactory {
public static Shape getShape(int shape) {
switch (shape) {
case 1:
return new Triangle();
case 2:
return new Rectangle();
case 3:
return new Circle();
default:
return null;
}
}
}
사용은 다음과 같이 한다.
public class ShapeTest {
@Test
public void shapeTest() {
Shape shape = ShapeFactory.getShape(2);
shape.draw();
}
}
참조
alecture.blogspot.com/2011/05/abstract-class-interface.html
728x90
반응형
'Java' 카테고리의 다른 글
모든 소프트웨어 개발자가 알아야 할 디자인 패턴 (0) | 2021.03.12 |
---|---|
Hash에 Salt 치기 (0) | 2021.03.11 |
Java 기본 내용을 위한 북마크 (0) | 2021.01.28 |
RequestBody를 Enum 값에 Setting 할 때 생기는 문제 (0) | 2019.11.13 |
Java8의 for, stream foreach, parallelStream foreach 간단 속도 테스트 (0) | 2017.02.14 |