Coding/언어-JAVA

JAVA 인터페이스 #Day4

꿀딴지- 2023. 8. 3. 18:21

추상화, 다형성, 캡슐화, 상속이 자바의 "객체"지향의 핵심원리인 건 맞는데, 추상화=인터페이스 이런식으로 단정지으면 안된다. 

접근제어자, 상속, 인터페이스가 유기적으로 4가지 원리를 만족시키기 위해 동작하는 것처럼 보인다.

예로 인터페이스는 메서드들의 가이드 역할(외부로 내보낼 때 가이드 역할과, 내부에서 구현할 때 강제성을 띄며 가이드 역할)을 하며 abstract 메서드들로 추상화를 하고, 동시에 외부 패키지로 부터 내부 소스를 공개하지 않게되니 캡슐화(은닉화)를 만족하며, 인터페이스 자체가 참조자료형이 되며 다형성을 만족한다. 상속의 경우 추상화,다형성,상속을 만족하고 접근제어자가 캡슐화를 지향한다.

어쨌든 객체지향, 느슨한 결합, 유연한 변경 등을 고려한다는 점이 포인트.

 

지난번 공부하며 상속과 인터페이스가 굉장히 유사하게 느껴졌는데 구현할 때는 비슷하게 느껴지더라도 역할이 완전히 다르다.

인터페이스는 어쨌든 GW역할을 하며 느슨한 결합을 추구하고, 상속은 공통된 기능들을 모아서 상위클래스를 만드는데 좀 더 포커스 되어있다.(인터페이스도 공통기능을 모아서 각 클래스에 구현을 강제하긴 하지만 그런의미에서 인터페이스가 좀 더 작은집합으로 이해되긴 함) 또한 상속은 말그대로 inheritance(계층적, hierachy)라는 의미를 가지기 때문에 의미상으로도 하위개념으로 들어가야 한다.(사람-직장인 이런느낌.. 직장인-업무분류,출퇴근시간-> 이런건 인터페이스로 처리)

구현상으로는 extends든 implemet든 어쨌든 가져와서 강제로 구현해야 하는 부분이 있긴하지만 구현된 클래스를 가져다가 쓰게되는 시점에서는 달라진다! extends와 implemet간에 혼재되기 시작하면(...) 

 

 

추상클래스 : 하위클래스들의 공통기능을 모아놓으면서 뭘해야 할지 정의 → 추상메서드를 하나 이상 포함한다는 점 외에 일반 클래스와 동일

인터페이스 : 추상클래스보다 더 높은 추상성을 가짐 → 추상메서드와 상수만을 멤버로 가질 수 있음

1. 인터페이스 기본 구조

interface

필드 : public static final 가 기본

메서드 : public abstract 기본 (static, default 가능)

public interface InterfaceEx {
public static final int rock = 1; // 인터페이스 인스턴스 변수 정의
final int scissors = 2; // public static 생략
static int paper = 3; // public & final 생략
public abstract String getPlayingNum();
void call() //public abstract 생략
}
class 클래스명 implements 인터페이스명 {
... // 인터페이스에 정의된 모든 추상메서드 구현
}
  • 특정 인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상메서드를 구현해야 함(강제) → 오버라이딩하여 바디를 완성

2. 인터페이스 사용(다형성)

  • 다양한 타입의 데이터를 인터페이스 타입으로 변경해서 사용가능함
  • 인터페이스 → 선언은 가능하나/ 초기화는 불가능함(객체 생성이 안됨) 다형성 : 선언할 때 자료형을 상속/구현 대상으로 할 수 있음 (but new에 해당하는 초기화는 안됨)
  • 인터페이스는 생성자가 없다.

Q. 인터페이스를 타입으로 선언하면, 해당 인스턴스는 인터페이스에 정의된 메서드만 사용가능한데 클래스의 고유한 메서드를 사용하려면?? → 이런상황을 만들면 안됨. 인터페이스와 연관된 클래스를 만들어서 클래스가 클래스 내 메소드를 호출하던지..해야됨.

 

3. 인터페이스 다중 구현

  • 상속과 다르게 다중구현이 가능하며, 최고 조상(상속-Object)이 없음
    • 다중 상속이 불가능했던 이유 : 부모 클래스에 동일한 이름의 필드 또는 메서드가 존재하는 경우 충돌이 발생
    • → 인터페이스는 애초에 미완성된 멤버를 가지고 있기 때문에 충돌이 발생할 여지가 없음
  • 특정 클래스는 다른 클래스로부터의 상속을 받으면서 동시에 인터페이스를 구현할 수 있음