관심쟁이 영호

[JAVA] 인터페이스 ㅣ Interface 본문

학교공부/자바의 왕!

[JAVA] 인터페이스 ㅣ Interface

관심쟁이 영호 2021. 5. 22. 00:51
반응형

오늘은 인터페이스에 관해서 공부를 할 예정이다.

(출간된 "자바의 정석" 책을 참고했습니다.)

인터페이스란?

- 추상 메서드의 집합이다. (추상 메서드 : 구현을 하지않은 메서드)

- 모든 멤버가 public이다.

- 구현된 내용이 하나도 없다.

 

이렇게 볼 수 있다.

 

그럼 추상클래스와 무엇이 다른가?

추상클래스는 구현된 메서드도 포함할 수 있다.

(인터페이스도 JDK 1.8 version 부터는 구현된 상수, static 메서드와 같은 멤버변수를 가질 수 있다.)

 

인터페이스 선언방법

interface practice{
	public static final FIRST = 1;
	public abstract abc(int num);
}

 

위와 같이 인터페이스를 선언할 수 있다.

 

인터페이스의 구현

인터페이스를 구현한다는 것은 몸통부분을 완성해준다는 뜻이다.

아래의 코드와 같다.

interface Alive{
	public void breath();
    public void birth(int year);
}

class Human implements Alive{
	public void breath(){
    	System.out.println("숨을 쉰다!");
    }
    
    public void birth(int year){
    	System.out.println(year + "년에 태어났다!");  
    }
}

class Practice{

	public static void main(String[] args) {
    	Human human = new Human();
        
        human.breath();
        human.birth();
    }
    
}

위의 코드처럼 구현하면 된다!

인터페이스 특징

  • 인터페이스의 조상은 인터페이스만 가능하다.
  • 다중 상속이 가능하다.
  • 인터페이스로 객체 생성이 불가능하다.
  • "implements" 라는 구현 키워드를 사용한다.

만약 다중 상속해서 메서드나 변수가 겹치게 된다면?

인터페이스는 결론적으로 구현이 되어 있지 않아서 충돌에 걱정이 없다.

왜 인터페이스를 사용할까?

  • 두 대상(객체)를 연결하는 중간 역할을 한다!
  • 선언과 구현을 분리시킬 수 있게 한다.

더 자세히 알려면 다음 게시글을 보자!

 

[#1 코드로 이해하는 객체지향 설계] 객체, 설계

대망의 첫 장이다. 아 시작하기 전에, 저자님이 핵심적으로 전해주는 말이 있다. 해당 책은 프로그래밍 패러다임의 "객체지향 패러다임"에 대해서 설명하는 책이다. 객체지향 패러다임은 계속해

bestkingit.tistory.com

이것은 변경에 유리한 코드가 될 수 있다. 아래의 코드로 살펴보자.

 

class A{
	public void methodA(B b){
    	b.methodB();
    }
}

class B{
	public void methodB(){
    	System.out.println("methodB()");
    }
}

class InterfaceTest{
	public static void main(String args[]){
    	A a = new A();
        a.methodA(new B());
    }
}

위 코드를 인터페이스를 활용해서 다시 하면,

class A{
	public void methodA(I i){
    	i.methodB();
    }
}

interface I {
	void methodB();
}

class B implements I{
	public void methodB(){
    	System.out.println("methodB()");
    }
}

class InterfaceTest{
	public static void main(String args[]){
    	A a = new A();
        a.methodA(new B());
    }
}

    

이렇게 나눌 수 있다.

- 이 경우는 인터페이스의 다형성 때문에 new B()로 넘기더라도 I i 에 속하기 때문에 넘어간다.

- 하지만 i에서 인터페이스에 정의된 메서드 이외에  B메서드를 사용할 수 없다.

그리고 나중에 새로운 B class대신 C class를 써야한다면?

class C implements I {
	public void methodB(){
    	System.out.println("methodB() is C");
    }
}

 

인터페이스를 활용하지 않을 경우에는,

class A{
	//public void methodA(B b){ 에서
    public void methodA(C c){
    	b.methodB();
    }
}

class B{
	public void methodB(){
    	System.out.println("methodB()");
    }
}

class InterfaceTest{
	public static void main(String args[]){
    	A a = new A();
        
       // a.methodA(new B()); 에서
       a.methodA(new C());
    }
}

- B b -> C c

- new B() -> new C()

이렇게 두개를 변경해주어야 한다.

 

인터페이스를 사용할 경우에는

new B() -> new C()만 바꾸어 주면 된다.

(인터페이스 형태로 받기 때문이다! -> 인터페이스 다형성)

지금은 별거아닌 일같아도 나중에 class가 엄청많아진다면 엄청나게 편리하다!

 

  • 개발 시간을 단축할 수 있다!

인터페이스만 알면 되기때문에, A를 개발하는 팀은 B가 완성이 되지 않아도 코드를 작성할 수 있다.

 

  • 변경에 유리한 유연한 설계가 가능하다.
  • 표준화가 가능하다.

예를 들면, DB를 오라클을 사용한다고 하자.

이 때, 갑자기 오라클에서 MySql로 바꾼다면 코드를 엄청나게 고쳐야한다.

그래서 이것을 해결하기 위해 JDBC를 제공한다.

 

오라클이나 MySql 회사에는 JDBC 인터페이스에 맞춰서 구현하게 된다.

그래서 우리는 JDBC 표준 인터페이스를 이용하기 때문에 따로 코드를 바꿀 필요가 없다.

 

이해가 안되면, 볼트와 너트 크기를 맞추기위해서 표준을 정해두는 것을 생각하자!

 

  • 서로 관계없는 클래스들을 묶을 수 있다.

 

 

300x250
Comments