반응형
목차
개요
카카오테크캠퍼스 백엔드 과정 주차 관련 공부내용
개념 및 정의
어떤 메서드를 선언해야하는지 알려주는 일종의 명세서다.
구현할 기능의 속성에 맞게 코드재사용성을 고려하여
- 인터페이스를 구현하는 추상 클래스에 모든 메서드를 구현하지 않고 대신에
- 일부 메서드만 구현한 후에 나머지 메서드는 하위 클래스에 구현을 위임하여 다형성을 추구할 수 있다.
교재 활용 예시
Calc.java
public interface Calc {
double PI = 3.14;
int ERROR = -99999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int num1, int num2);
int divide(int num1, int num2);
}
Calculator.java
public abstract class Calculator implements Calc{
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
@Override
public int substract(int num1, int num2) {
return num1 - num2;
}
}
CompleteCalc.java
public class CompleteCalc extends Calculator{
@Override
public int times(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
if( num2 == 0 )
return ERROR;
else
return num1 / num2;
}
public void showInfo() {
System.out.println("모두 구현하였습니다.");
}
}
CalculatorTest.java
public class CalculatorTest {
public static void main(String[] args) {
Calc calc = new CompleteCalc();
int num1 = 10;
int num2 = 2;
System.out.println(num1 + "+" + num2 + "=" + calc.add(num1, num2));
System.out.println(num1 + "-" + num2 + "=" +calc.substract(num1, num2));
System.out.println(num1 + "*" + num2 + "=" +calc.times(num1, num2));
System.out.println(num1 + "/" + num2 + "=" +calc.divide(num1, num2));
}
}
- Calc 인터페이스의 모든 메서드를 구현하지 않은 Calculator 클래스는 추상 클래스로 선언했다.
- 추상 클래스는 일부 메서드의 구현을 포함하며, 나머지 메서드는 하위 클래스에서 구현한다. (인터페이스는 명세서 이기에 전부 구현을 해야만 하는게 아니라 애초에 구현할 메서드만 적어놓는다.)
- 이 예제에서 CompleteCalc 클래스는 Calculator 클래스를 상속받고, 나머지 **times**와 divide 메서드를 구현한다.
- CalculatorTest 클래스에서는 CompleteCalc 객체를 생성하고, Calc 인터페이스로 참조하여 사칙연산을 수행한다.
이렇게 인터페이스를 사용하면 프로그램의 유연성이 향상되며, 다양한 구현 클래스를 쉽게 교체할 수 있다.
그럼 왜 위에 코드에서는 두 연산자를 따로 선언한거지??
- 추상 클래스를 사용하여 인터페이스의 일부 메서드를 구현하는 방법을 설명하기 위해서다!
- 설명을 위한 예제로 **add**와 substract 메서드를 Calculator 추상 클래스에서 구현하고, **times**와 divide 메서드는 CompleteCalc 클래스에서 구현하는 스킬을 보여준것이다.
인터페이스의 기능은 항상 모두 사용해야하나?
자바 프로젝트 진행시에 인터페이스를 사용할때 주의깊게 생각해본 유저라면 쉽게 알 수 있다.
인터페이스를 구현하는 클래스는 인터페이스에 선언된 모든 메서드를 구현해야 하지만 이것은 인터페이스를 구현하는 클래스가 인터페이스에 있는 모든 기능을 실제로 사용한다는 의미는 아니다.
이용 측면에서는 필요한 기능들만 가져다가 이용을 하기만 하면 된다.
다형성 측면에서의 인터페이스
이러한 인터페이스의 사용은 다형성의 원칙에 따라 프로그램의 유연성과 확장성을 향상시키는데 도움이 된다. 사용자는 실제로 모든 메서드를 사용하지 않더라도, 필요한 경우 다른 메서드를 사용할 수 있다는 것을 보장해준다.
활용 예시
Shape.java
- Shape 인터페이스는 하나의 메서드인 **area()**를 선언
public interface Shape {
double area();
}
Circle.java
- 원의 면적 구하는 인터페이스를 구현한 클래스
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
Rectangle.java
- 직사각형의 면적 구하는 인터페이스를 구현한 클래스
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
Main.java
Shape 인터페이스의 구현 클래스인 **Circle**과 **Rectangle**의 인스턴스를 동일한 Shape 타입의 리스트에 저장한다.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Shape> shapes = new ArrayList<>();
shapes.add(new Circle(5));
shapes.add(new Rectangle(10, 5));
for (Shape shape : shapes) {
System.out.println("Area: " + shape.area());
}
}
}
인터페이스를 구현한 여러 클래스를 동일한 방식으로 사용할 수 있는 다형성의 이점을 확인 할 수있다!
'미사용 > KakaoTechCampus' 카테고리의 다른 글
MySQL기초[2]- 캐싱,버퍼풀 전략 (0) | 2023.06.14 |
---|---|
MySQL기초[1]- 고전 3티어 구조 및 MySQL엔진 구성요소 (0) | 2023.06.14 |
Java기초[9] 전략&템플릿 메서드 패턴 (0) | 2023.04.28 |
Java기초[8] 명시적&묵시적 형변환 (0) | 2023.04.28 |
Java기초[7] 자바에서의 상속 구현 (0) | 2023.04.28 |