인터페이스 ?
추상 메서드들의 집합
1. 인터페이스의 장점
1-1. 두 대상(객체) 간의 중간 역할을 한다.
inter이라는 말을 한국어로 번역하자면 몇몇 낱말 앞에 붙여서 그 사이 라는 뜻을 더해주는 접두사
예를 들자면 international airport 즉 국제 공항에 inter이 들어간다
나라간의 이동을 도와 사이에 있는 공항이다.
이걸 자바 인터페이스로 바꾸면 이렇게 된다 즉, 중간다리 역할을 해주는 것
다른 예시를 하나 들어보자
프로그래밍을 하다보면 CLI GUI 라는 단어를 들어본 적 있을 것이다. 그중에서 GUI는 그래픽 유저 인터페이스의 약자이다. 우리가 인터넷 버튼만 누르면 인터넷으로 접속 해준다. 새로만들기를 눌러서 파일 버튼만 누르면 파일을 생성해준다. 하지만 cli로 명령어로 하나하나 작성해야 한다면 컴퓨터를 아무것도 모르는 사람은 사용조차 힘들것이다. 즉, gui는 사용자와 컴퓨터 사이에 연결다리 역할을 해주는 것이다.
그림으로 표현하면 이런 느낌이다. 파일 삭제하고 만들고 인터넷 들어가는게 편리하지 않은가 그래서 인터페이스는 변경에 유리하다
만약 프로그램을 업데이트 하거나 하드웨어가 바뀐다고 하더라도 우린 상관이 없다 어차피 인터넷 버튼만 누르면 인터넷이 열릴테니까
1-2. 선언과 구현을 분리시킬 수 있게 한다
// 선언과 구현이 함께 있는 코드
class B {
public void method(){
System.out.println("methodB");
}
}
// 선언과 구현이 따로 있는 코드
// 인터페이스
interface I {
public void method();
}
// 인터페이스 추상 메서드 구현한 클래스
class B implements I {
public void method(){
System.out.println("methodB");
}
}
1-3. 느슨한 결합
1-3-1. 인터페이스가 없는 강한 결합
이렇게 강한 결합으로 되어있는 경우 b를 c클래스로 교체하고 싶을 때
이렇게 a를 직접적으로 만져줘야한다
1-3-2. 인터페이스의 개입으로 느슨한 결합
A 클래스가 B클래스에 직접적으로 개입을 하는것이 아닌 인터페이스를 거쳐서 개입한다면 B 클래스를 C 클래스로 바꾸는게 쉬울 것이다
컴퓨터 하드웨어를 갈아 끼우는거 처럼
이렇게 갈아끼우기만 하면 ok
1-3-3. 코드로 알아보자
public class InterFaceTest{
public static void main(String[] args){
A a = new A();
a.method(new B());
}
}
class A {
public void method(B b) {
b.method();
}
}
class B {
public void method(){
System.out.println("B클래스의 메서드");
}
}
세개의 코드를 만들었다 돌아가는 순서를 보자면
1. A 클래스 인스턴스 생성
2. A클래스의 method 실행 , 인자는 B 클래스의 인스턴스
3. A 클래스의 method라는 메소드는 B클래스의 인스턴스를 받아서 b.method 실행
4. 콘솔에 B 클래스의 메서드가 찍힘
순서다.
새로운 클래스인 C를 만들어보자
class C {
public void method(){
System.out.println("C클래스의 메서드");
}
}
여기서 인터페이스가 개입하지 않은 상태로 메인 메서드의 B 클래스를 새로운 C클래스로 바꿔보자
public class InterFaceTest{
public static void main(String[] args){
A a = new A();
a.method(new C());
}
}
새로운 C클래스의 인스턴스를 호출하는 순간 에러가 냅다 뜰거다. 왜냐면 A 클래스는 B 클래스를 받아서 B 클래스의 멤버를 실행하도록 강한 결합이 설정되어 있는데 부품만 쏙 하고 갈아끼울 수는 없는 것이다. 그래서 하나하나 다 바꿔줘야한다.
이렇게 인자로 받는 타입을 당연히 C클래스 타입으로 생성해야한다.
물론 메인 메서드를 바꾸는 것은 어쩔수 없다 하지만 A도 바꿔줘야 한다는게 문제다. 만약 복잡하고 인자를 여러개 받는다면 골치아플게 분명하다.
하지만 인터페이스가 관여한다면 다른 클래스로 갈아 끼우는건 굉장히 간단한 문제다
A와 강하게 결합되어있는 B를 설계부와 구현부로 나눠주면 된다
public class InterFaceTest{
public static void main(String[] args){
A a = new A();
a.method(new B());
}
}
interface I {
public void method();
}
class A {
public void method(I i) {
i.method();
}
}
class B implements I{
public void method(){
System.out.println("B클래스의 메서드");
}
}
class C implements I{
public void method(){
System.out.println("C클래스의 메서드");
}
}
클래스들 사이에 인터페이스를 넣어주면 많은걸 바꿔야하는 전의 상황과는 다르게 부품만 쏙 빼주면 된다.
인터페이스 I가 중간다리 역할을 하고있고 클래스 A는 I 타입을 받고 있기 때문에 인터페이스 I의 메소드를 구현하고 있는 모든 클래스는
전부 들어올 수 있다. 즉 객체만 갈아 끼워주면 간편하게 기능을 바꿀 수 있다는 것.
변경이 적을 수록 일할 시간이 줄어들고 에러날 확률도 줄일 수 있다!!
그림으로 표현하면 이렇게 된다
클래스 A는 인터페이스 I 안에 뭐가 있는지는 모르겠고 그냥 인터페이스 I의 추상 메서드를 구현한 클래스는 모두 들어와!!! 라고 하고 있는 것이다. 그래서 I의 자식으로 클래스 뭐가 들어가든 A는 모르고 있는 것
1-4. 개발 시간 단축
사실 다 연결되는 이야기지만 A라는 클래스와 B라는 클래스가 강하게 결합되어 있으면 B라는 클래스를 만들어야 A를 만들 수 있다.
왜냐면 A 클래스는 B클래스의 메서드를 호출하고 있기 때문, 하지만 인터페이스가 있다면 B를 만들면서 A를 만들 수 있다. 어차피 A는 인터페이스와 결합되어 있고 B가 오던 C가 오던 상관 없기 때문
1-5. 표준화 가능
이건 나중에 데이터를 임베디드 하면 더 와닿을거 같긴한다
1-5-1. JDBC
회사에서 자바 앱을 만드는데 오라클 DB를 사용하고 있었다고 가정해보자 그런데 오라클에서 갑자기 가격을 올린것이다. 그래서 회사에서는 My SQL로 DB를 바꾸기로 했다
데이터베이스를 바꾸는 것이기 때문에 변경을 왕창 해야한다 위의 예시와 같다 java app(a), 오라클(B), SQL(C)라고 하면 B를 C로 바꾸는데 A를 왕창 바꿔야한다
하지만 중간에 표준(인터페이스)만 있다면 모든 DB는 이것에 맞춰서 작업하고 JAVA app은 표준만 알고있으면 부품(데이터베이스)가 뭐가 오든 상관이 없다.
1-6. 서로 관계없는 클래스들을 관계 맺어줄 수 있다
게임을 하나 만든다고 가정해보자(익숙한건 기분탓임)
이렇게 유닛이 분류가 되는데 기계를 수리하는 메서드를 만들고싶다
void repair(Tank t){
//탱크수리
}
void repair(Dropship d){
//드랍쉽 수리
}
오버로딩을 사용해서 만드는 중에 유닛이 점점 많아지면 너무 중복될거 같아서 다형성을 이용해 지상 유닛을 치료하는 메소드를 만들기로 했다
void repair(GroundUnit gu){
// 매개변수로 넘겨진 지상유닛을 수리한다
}
그래서 GroundUnit 이라는 부모 클래스를 하나 만들고 지상 유닛 타입을 받아서 수리하도록 하였다.
하지만 이렇게 코드를 작성하면 필요한 수송선은 공중 유닛이라 인자로 받지 못하고 필요없는 병사는 받아진다 그래서 관계가 없는 세개의 클래스들의 관계를 맺어주기 위해서 인터페이스를 사용한다
interface Repairalbe{}
class 일꾼 Extends GroundUnit implements Repairable{
//
}
class 탱크 Extends GroundUnit implements Repairable{
//
}
class 수송선 Extends AirUnit implements Repairable{
//
}
이러면 Repairable을 구현했다는 공통적인 관계가 생겨버린다(여러개 메서드를 만들 필요 없이 인터페이스의 추상 메서드로 입맛에 맞게 돌려쓰면 된다)
'IT 연구소' 카테고리의 다른 글
type casting (0) | 2023.08.14 |
---|---|
중첩 인터페이스 (0) | 2023.08.06 |
숫자를 문자로 형변환 하는 세가지 방법 (0) | 2023.07.04 |
getter 와 setter (0) | 2023.06.29 |
float 과 double의 차이 (0) | 2023.06.16 |