객체지향언어는 무엇인가?라는 질문을 한다면 개발을 하는 사람 10명 중 8명 이상은 JAVA라고 답할 것입니다. 이러한 객체 지향 방식에는 엄연한 4가지의 특성이 있습니다. 바로 캡슐화, 상속, 추상화, 다형성이 있다. 이러한 4가지 특성을 이용하여 객체 지향 개발 원칙 "SOLID"를 지켜 개발자들은 프로그래밍합니다. 이러한 SOLID 원칙을 잘 지킨 프로그램은 유지보수가 아주 쉬워지는 결과를 갖게 됩니다. 그 이유는 SOLID를 잘 지킨 객체 지향 프로그램은 클래스 간의 영향력을 적게 주고, 클래스 내부적으로 응집하게 됩니다. 따라서 클래스 하나하나가 독립적인 모듈이 되고, 수정이 필요하다면 클래스만 수정하면 되기 때문에 유지보수가 쉬운 완성도 높은 프로그램이 됩니다. 이러한 방식의 프로그래밍을 하기 위하여 인터페이스(interface)를 반드시 알아야 합니다.
인터페이스(Interface)란?
인터페이스는 Java에서 추상 클래스와 달리 추상 메서드와 상수(constant)로만 구성된 "추상화된 클래스"라고 할 수 있습니다. 메서드는 선언만 하고 구현은 하지 않으며, 클래스에서 인터페이스를 상속받을 때는 "implements" 키워드를 사용합니다. 이를 통해 클래스들 간에 특정 메서드들을 공통적으로 사용할 수 있습니다.
인터페이스(Interface)의 역할에 대해 이해하기 위해 쉬운 예시를 하나 들도록 하겠습니다. 8명의 선수가 길이 없는 곳에서 같은 목적지까지 달리는 시합이 있다고 가정하겠습니다. 이러한 상황이라면 모든 선수가 제각기 다른 길을 달려 목적지까지 도착하게 됩니다. 이렇게 된다면 공정하게 순위를 매길 수 없을 것입니다. 이러한 이유로 공정한 심사를 할 수 있는 트랙이 필요하며, 이 트랙의 기능이 JAVA에서의 인터페이스입니다. 인터페이스(Interface)는 즉 클래스 간의 같은 동작을 할 수 있도록 사용되는 추상화된 자료형입니다.
Java의 다형성과의 연관성
인터페이스는 Java에서 다형성을 구현하는 주요 수단 중 하나입니다. 여러 클래스가 같은 인터페이스를 구현함으로써, 각 클래스들은 자신만의 특성을 유지하면서도 동일한 인터페이스 메서드들을 호출하고 상호작용할 수 있습니다. 이는 유연하고 확장성 있는 코드 작성을 가능하게 합니다.
인터페이스(Interface)의 활용
public interface Face {
//최소, 최대 속도
public int MIN_VELOCITY = 7;
public int MAX_VELOCITY = 12;
//추상 메서드 : 속도 증가
void addSpeed(int velocity);
//디폴트 메서드 필요에 따라 오버라이딩 후 수정하여 사용
default String searchAthlete(String name) {
System.out.println("선수의 이름");
return "선수 정보";
}
}
위와 같은 간단한 가이드를 만들었다. 이제 모든 클래스가 이 규칙을 따라야 합니다. 이제 Interface를 상속받은 클래스를 만들어 보겠습니다. 여기서 추가로 알아야 할 내용은 바로 default 메서드입니다. JAVA 8 이후에 default 메서드가 인터페이스(Interface)에서 선언이 가능하다. 이에 따라 개발자의 필요에 맞게 오버라이딩 하여 사용할 수 있다. 물론 필수는 아니다.
public class Athlete implements Face {
@Override
public void addSpeed(int velocity) {
System.out.println("선수의 현재 속도는:" + velocity);
if(velocity < Face.MIN_VELOCITY) {
System.out.println("속도 올림");
}
if(velocity > Face.MAX_VELOCITY) {
System.out.println("속도 내림");
}
}
@Override
public String searchAthlete(String name) {
System.out.println("선수의 이름은" + name);
return "선수정보";
}
}
위의 코드는 가이드를 상속받은 Athlete 클래스이다. 위처럼 인터페이스(Interface)를 사용하면 인터페이스(Interface)에 선언된 추상 메서드를 오버라이드하여 다양하게 사용할 수 있다. 또한 인터페이스(Interface)의 기본 구현 메서드를 사용하지 않고, 필요에 맞게 수정하여 사용하였다.
public void main(String[] args) {
Face face = new Athlete();
face.addSpeed(5);
face.searchAthlete("moonstar");
}
//선수의 현재 속도는:5
//속도 올림
//선수의 이름은:moonstar
인터페이스(Interface) 설계 시 주의사항
인터페이스를 설계할 때는 명확하고 추상화된 메서드를 선택하여 역할과 책임을 명확히 정의해야 합니다. 또한, 인터페이스의 이름과 메서드 이름은 이해하기 쉽고 명확하게 지정하는 것이 좋습니다.
'Languages > Java' 카테고리의 다른 글
[Java]다양한 Exception handling(예외 처리) 알아보기 (38) | 2023.07.23 |
---|---|
[Java]정규식(Regular Expression) - 유용한 문자열 처리를 위한 강력한 도구 (7) | 2023.07.23 |
[Java]제네릭(Generic)을 쉽게 이해하기(문법과 활용) (2) | 2023.07.21 |
[Java]문자열(String)과 리스트(List)의 null, 빈 값인지 확인하는 방법 (15) | 2023.07.20 |
[Java]안정적인 NULL 처리가 가능한 Optional 알아보기(NullPointerException) (4) | 2023.07.16 |