[객체지향][다형성] Interface

포키·2022년 11월 4일
0

국비과정

목록 보기
26/73

객체지향에서 다형성이 정말 강력한 기능인데 (상속도 그걸 위해 존재)
거기에 날개를 달아주는 게 인터페이스!

💘 상속과 구현 차이? 구분하여 사용하는 이유? (설명 틀릴 수 있음💦)

  • 둘 모두 다형성에 기여하지만, 일반적으로
    객체간 상관관계가 더 클 때(멤버변수, 메서드 내용 공유 O) -> 상속
    상속보다 관련성이 적은(멤버변수, 메서드 내용 공유 X) 관계 -> 구현

Interface

: 접점. 노출되는 부분, 외부로 드러나는 부분.
= 사용자(ex) 유저, 다른 객체)가 사용할 수 있도록 드러난 부분.

정의 (~1.7 ver.)

  1. static 상수와 추상 메서드만 소유 가능
    (static은 실제로 속하는 것이 아니므로, 사실은 추상 메서드만 소유할 수 있는 것)
  2. 접근제한자는 public만 사용 가능
    (추상메서드는 원래 private 사용 불가하지만(private은 상속X), interface는 그 제한이 더 커진 것.)
  • interface는 이름 앞에 I를 붙이며, 보통 -ing, -able로 끝난다. (not 반드시 but 대부분)

1.8부터 interface는 'default 메서드', 'static 메서드'도 가질 수 있다.

interface IFoo {
	public static final int NUM1= 100;
	int NUM2 = 200;
	// 기본적으로 멤버변수가 public + static final이므로 생략 가능
	public abstract void todo();
	void doit();
	// 기본적으로 메서드가 public + abstract이므로 생략 가능
}
  • 구성요소가 한정되어 있으므로, 멤버변수에서 'public static final', 메서드에서 'public abstract'를 생략할 수 있다.

  • 기능만 명시하고 하위 클래스에서 구현하는 용도

implements

interface 또한 is-a 관계를 만들며 그것을 '구현'이라 부른다.
상속에서 extends를 사용한다면 구현에서는 implements를 사용한다.

interface IA {
	// 일반적으로 클래스에서 중요한 것은 멤버변수 (메서드도 멤버변수 보호의 목적)
	// 인터페이스는 반대로 기능에 포커스가 맞춰져있다. : ~able, ~ing 형태로 명명하는 경우가 많음
}
class B {
}
class C extends B implements IA {
}
class Ex2 {
	public static void main(String[] args) {
		
	}
}
  • interface는 상속과 달리 중복구현이 가능하다.
    상속과 달리 충돌이 일어날 여지가 없기 때문이다.

🚗 REVIEW - 중복상속의 개념충돌
중복상속시 멤버변수(정보)와 메서드 내용(기능 구현)이 충돌할 수 있어 문제
= 부모클래스가 같은 이름의 멤버변수, 같은 헤더의 메서드를 가질 때 충돌이 일어남

  • 다르게 보면, 상속은 객체간 관계가 있는데, 구현은 기능 정의만이 전해질 뿐.
    관계없는 클래스가 동일한 하위클래스에 상속을 주는 것은 이상하지만, 관계없는 기능이 하나의 하위 클래스에 전해지는 것은 문제 없다.
  • 구현은 상속보다 덜 까다롭다
    interface는 제한이 많은 만큼 들어갈 수 있는 요소가 적고, 오히려 그만큼 사용할 때 제한이 적다.
    (상속은 상위 클래스에서 정보(멤버변수)와 구체적 기능(일반 메서드)도 물려받지만, interface는 기능 정의만을 받는다)

  • 즉 interface를 사용하면 일반 클래스를 상속할 때 가질 수밖에 없는 한계를 벗어나, 더 다양하고 자유로운 이용이 가능하다.

인터페이스 상속

  • 인터페이스는 인터페이스를 상속할 수 있다.

  • 인터페이스는 인터페이스를 다중상속할 수 있다.

  • 상속받는 하위 인터페이스만 implements해도 되지만, 정의되는 기능을 한 눈에 보기 위해 상속 관계가 있더라도 하나하나 다 적어줄 수 있다.

  • 같으면 extends 사용, 다르면 implements

    class - class : extends
    class - interface : implements
    interface - interface : extends

java 기능, 명명 참고 - java api
구글링보다 먼저 해야 함 (자바 창립자가 만든 자바 설명서니까)

용도

  1. 기능 구현의 약속 -> 느슨한 결합으로 이끌어 양쪽을 자유롭게 한다.
  2. 상수 모음 -> 클래스에 모으는 것보다 사용이 훨씬 편함
    (클래스이름.상수 말고 implements 하는 것으로 자기 것처럼 자유롭게 사용)
  3. 마킹 (Marking) -> 다형성 이용
    ex) 특정 매서드의 패러미터로 넣을 수 있는 객체를 표시

인터페이스 = '클래스 간의 상호작용을 기술하는 규격(약속)'

  • 제조사가 서로 직접 정보를 주고받지 않음에도 불구하고 충전기와 핸드폰이 결합될 수 있는 이유는, 중간에 인터페이스가 존재하며, 그 인터페이스를 서로 알고 있기 때문.
  • 인터페이스 안에는 추상메서드(= only 헤더 = 메서드가 뭘 하는지만 알려줌)만 존재
  • 인터페이스는 추상메서드를 노출시키는 것으로 하위 클래스가 무엇을 하는지(할 수 있는지) 알려준다.
    ex) 리모컨의 버튼 <- 기능이 구현되는 과정은 모르지만 무슨 기능이 있는지 알 수 있다.
  • 인터페이스는 다 비슷하다. 그래야 처음 보는 사람도 바로 쓸 수 있다.

this 개념 재확인

  • 메소드에서 멤버변수/메서드 앞에 아무것도 안 붙이면 언제나 this. 붙인 것과 같은 의미라는 것
class A {
	int num = 4;
}
class B extends A{
	int num = 6;
	public void todo() {
		System.out.println(num);
		System.out.println(this.num);
		System.out.println(super.num);
	}
}
class Ex2 {
	public static void main(String[] args) {
		B b = new B();
		b.todo();
	}
}
profile
welcome

0개의 댓글