촬리의늘솔길

Interface란?(i/f) 본문

✍~2022/java

Interface란?(i/f)

리촬리 2022. 8. 19. 23:53

 

오늘의 목표 잠시 정리 :

1. java interface 가 뭔지 jdbc가뭔지

jdbc는 인터페이스 덩어리인데 이게 왜 인터페이스로 선언하는지를 깨달아야 한다.

라이브러리들이 다 인터페이스 덩어리들인데

 

2. 자바 인터페이스 같은것을 알아야

자바는 다 인터페이스들로 이루어짐

클래스 없음

 -> 왜 인터페이스로?

 -> 이유는? 

 

oop관점에서의 interface를 

interface란 무엇이고 왜쓰는가

 

자바 awt라고 하는 패키지는 ui를 그릴수 있는데

윈도우 x버튼 누르면 클로즈 하는거 만들기

클로즈하게 하려면 윈도우 이벤트 리스너를 상속받아야하는데

윈도우 애드 윈도우 리스너 얘가 핸들링 하는건데 델리게이션 위임용모델이라고함

윈도우 리스너 인터페이스 타입

import java.awt.*;
        import java.awt.event.*;

public class ex {
    public static void main(String[] args) {
        Frame f = new Frame("Frame Test3");
        f.setSize(300, 200);
        f.addWindowListener(new EventHandler());
        f.setVisible(true);

    }
}

class EventHandler extends WindowAdapter {

    @Override
    public void windowClosing(WindowEvent we) {
        we.getWindow().setVisible(false);
        we.getWindow().dispose();
        System.exit(0);
    }

}

윈도우애드 리스너에 어댑터클래스가 있는데 그걸 찾아서 공부하기

왜 인터페이스를 써야하는지, 문제점, 문제점 극복법

 


자. 시작해보자

객체지향 프로그래밍의 관점은 크게

- 추상화

- 상속

- 은닉성

으로 알고있는데 찾아보니

-캡슐화

-다형성 도 있다고 한다.

다형성

은 상속을 통해 기능을 확장하거나, 변경하는 것을 가능하게 해주는것을 의미한다.

다형성이 가능하도록 oop에서는 상속,추상화,인터페이스라는 개념이 등장한다.

다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.

( 같은 이름이지만 서로 다른 동작 방법을 가지고 있기 때문에 오버로딩은 다형성의 한 예라고 할 수 있다)

 

추상화 

데이터나 프로세스 등을 의미가 비슷한 개념이나 표현으로 정의해 나가는 과정을 의미한다.

각 개별 개체의 구체적인 구현에 대한 상세함은 갖추는것을 의미한다. 

 

 

자식클래스가 여러 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것이다.

하지만 클래스를 이용하여 다중 상속을 할 경우, 메소드 출처의 모호성 등 여러가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중상속은 지원하지 않는다.

하지만 다중상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스를 통해 다중상속을 지원하고있다.

 

OOP관점에서 보는 인터페이스의 여러 정의

인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상클래스를 의미한다.

 

인터페이스는 대표적인 규제로서, 어떤 객체가 있고 그 객체가 특정한 

 

모든 기능을 추상화로 정의만 하고 구현은 하지 않은것을 의미한다.

모든 멤버가 추상메소드인 타입이며, new 할 수 없다.

추상클래스의 일종으로 추상 클래스보다 인터페이스가 추상화 정도가 높다.

자바에서 추상클래스는 추상 메소드 뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있다.

하지만 인터페이스는 오로지 추상 메소드와 상수만을 포함할 수 있다.

인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다. 

 인터페이스를 이용해서 서로가 동일한 메소드를 만들도록 규약을 만들어서 공유한 결과 각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 에플리케이션을 구축 할 수 있었다.

 

인터페이스의 몇가지 규칙

1. 하나의 클래스가 여러개의 인터페이스를 구현할 수 있다.

2. 인터페이스도 상속이 된다.

3. 인터페이스의 멤버는 반드시 public이다.

 

 

<참고>

인터페이스 안의 모든 메소드들은 추상 메소드이다. 인터페이스는 final을 붙일 수 없고, 인터페이스 변수들은 static이어야 한다. 한마디로 인터페이스는 일반변수들을 가질 수 없다.

인터페이스는 하나 이상의 인터페이스들을 상속할 수 있는데, 여러개일때는 콤마를 사용하며

이때는 클래스에서 상속받는게 아니라 인터페이스에서 상속받으니 즉 내용이 없는 메소드들을 그대로 두는것이니 구현이 아니라 인터페이스간의 상속이므로, 일반클래스끼리 상속할때처럼 extends 를쓴다.

인터페이스는 생성자를 가질 수 없다. 인터페이스는 인스턴스를 만들 수 없지만, 인터페이스를 구현한 클래스를 통하면 인스턴스 화가 가능하다.

 

예를 들자면 "인터페이스 명 ab = new 클래스명()" 이런 형태가 될 것이다.

인터페이스의 접근지정자는 아예없거나, public 이거나, 아님 abstract 만 가능하다.

어떤 클래스가 인터페이스를 상속받을때는(구현할때는) implements 를쓴다.

물론 클래스가 다른 클래스를 상속하면서 인터페이스를 구현하는것도 가능하다.

그럴때는 extends 를쓰고, implements를 순서대로 쓰면 된다.

 

추상클래스와 어떻게 무엇이 다를까?

추상클래스는 트리형식으로 상위클래스와 하위클래스로 나뉘어지는 트리 구조이다.

하위 클래스는 상위클래스에서 추상화 시킨 생성자 혹은 메소드를 정의하면서 더 구체화된다.

반면 인터페이스는 트리 구조와 같은 수직적 구조가 아닌 수평적 구조를 가지게 된다.

(하나의 클래스에서 여러개의 인터페이스 호출 가능)

 

* 추상클래스

없거나 하나 이상의 추상 메소드를 가지고 있는것이 추상클래스이다.

추상메소드는 안이 아직 구현되지않은 abstract 로 정의된 메소드이다. 클래스 안의. 메소드가 단 한개라도 추상메소드가 있다면 그 클래스 앞에는 반드시 abstract 클래스 명으로 표기되어야 하며 abstract 와 final키워드를 동시에 표기 할 수 없다.

추상클래스는 일반적인 메소드도 있을 수 있고, 추상메소드가 있을수도 있다. 추상 클래스는 일반 변수들을 가질 수 있다.

 

추상메소드로 선언만 해놓고, 안의 내용은 상황에 맞게 자식 클래스에서 알아서 다시 구현해 쓰라고 선언만 해놓고 구현을 기다리는 방식(오버라이드 해서 재정의)이 바로 추상클래스와 인터페이스이다.

 

 

추상 메소드만 선언할꺼면 인터페이스,

다른 일반 메소드나 필드도 필요하면 추상클래스

 

 

왜 사용할까?

개발을 하며 클래스안의 메서드 형식을 맞추기 위한 틀로 사용한다.

 

인터페이스는 메서드의 틀을 미리 만들어 개발자 간의 의사소통 혼선을 줄여주고 다형성 개발에 유리함을 가져다주는 객체이다.

 


Java Adapter클래스

<참고1>

<참고2>

 

1. 이벤트를 처리하기 위해서는 반드시 인터페이스를 사용해야 함

==이벤트를 처리하기 위하여 이벤트 리스너를 등록하여 처리해주어야한다.

리스너가 인터페이스로 되어있어 리스너로 선언되어있는 추상메서드를 모두 오버라이드 해야 사용이 가능하다. 즉, 사용하지 않는 메소드 까지도 모두 오버라이드 하여 완성을 시켜야 사용할 수 있다.

==

ex ) 윈도우 창을 닫는 이벤트 처리는 windowlistener 인터페이스를 사용하여 7개의 추상메소드를 모두 구형해야 하는 비효율적인 방법으로 처리해야함.

 

2. 모든 인터페이스에는 구현해야 하는 추상 메소드가제공됨.

이 문제점을 해결하는 방안이 adapter클래스 사용하는 것.

 

3. 이벤트 처리를 하는 인터페이스 중에는 추상메소드가 2개 이상인 인터페이스는 반드시 adapter 클래스가 제공됨.

-> adapter 클래스가 인터페이스를 구현하였기 때문에 이벤트 처리를 구현할 시 인터페이스 대신에 adapter클래스를 사용하면 원하는 메소드만을 오버라이딩해서 사용하면됨.

 

 

https://brunch.co.kr/@kd4/6

 


JDBC란?

- 추상화, 상속, 오버로딩, 오버라이딩, 다형성 이 모든개념이 녹아있는 API가 JDBC이다.

- 자바 응용프로그램과 DBMS를 연결하기 위한 인터페이스이다.

- 자바 프로그램 내에서 db와 관련된 작업을 처리할 수 있도록 도와주는 api이다.

 

DB의 규칙을 interface 만들어 놓은것 + class로 인터페이스 구축 = 디비와 연결

인터페이스는 규약을 정하는 것이다 

인터페이스는 단독으로 동작할 수 없고, 반드시 추상메소드를 구현시키기 위해서는 하위 클래스가 있어야 한다.

인터페이스를 가지고있는 하위클래스가 반드시 재정의 하기 때문에 부모 자식 관계라며녀 하위클래스의 동작방식을 모르더라도 인터페이스로 하위 클래스를  100% 동작시킬 수 있는 기능이 인터페이스에 있다.

 

인터페이스와 JDBC가 관계가 왜 있을까? <참고>

자바에서 jdbc프로그래밍을 하려면 db벤더(공급자)의 db를 써야한다. 예를 들어 oracle, mysql, mssql 각각의 데이터베이스를 자바에서 활용하려면 api가 있어야 한다. 그 api 는 벤더들이 만든다.

자바에서는 jdbc 프로그래밍을 위해서는 벤더에서 제공하는 클래스를 이용해야 하는데, 이것이 통일되어있지 않으면 자바개발자들은 모든 데이터베이스의 동작을 알고 있어야 jdbc프로그래밍이 가능하다는 의미이다. 

이는 인터페이스를 적용해서 개선할 수 있다.

자바에서 데이터베이스 연동을 위한 java.sql패키지 안에 데이터베이스와 관련된 객체를 인터페이스와 만들어 놓는다. 이 인터페이스를 벤더들이 가지고 구현 클래스를 만들게 한다.

자바 개발자 입장에서는 인터페이스가 있으면 인터페이스를 통해서 하위클래스를 핸들링할 수 있다.

하위클래스가 동작방식이 달라도 이름이 같다고 하면 동작방식을 몰라도 쓸 수 있을 것이다.

 

728x90

'✍~2022 > java' 카테고리의 다른 글

객체 지향 개념  (0) 2022.08.03
java 강의  (0) 2022.08.02
spring부트와 aws로 구현하는 웹서비스 따라하기(1)  (0) 2022.07.29
java 에서의 소켓 프로그래밍[서버]  (0) 2022.06.01
java socket 통신 스레드 이해하기  (0) 2022.06.01