밤빵's 개발일지
[TIL]20240628 인터페이스 본문
오늘부터 주특기 주차가 시작!
Spring 강의를 듣고 과제를 해야해서 긴장 바짝한 상태에서 듣고있는중..
과제를 제출할 수 있을까란 걱정에 오늘 종일 한숨만 푹푹 쉰거같다.
오늘은 인터페이스 정리!
[인터페이스]
인터페이스는 일종의 추상클래스다. 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드, 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있고, 그 외의 다른 어떠한 요소도 허용하지 않는다.
추상클래스는 일반클래스인데 추상메서드를 가지고있고 생성자와 멤버변수를 가질수있는 부분적으로만 완성된 '미완성 설계도' 이고, 인터페이스는 아무것도 없고 추상메서드만 가지고있는 구현이 전혀 없는 밑그림만 그려진 '기본 설계도'라고 할 수 있다. 또는 껍데기. 인터페이스도 추상클래스처럼 완성되지않아서 그 자체 만으로 사용되기 보다는 다를 클래스를 작성하는 데 도움 줄 목적으로 작성된다.
인터페이스를 작성하는건 클래스를 작성하는 것과 같지만, 키워드로 'class' 대신 'interface'를 사용한다는 것만 다르다. 그리고 인터페이스에도 클래스처럼 접근제어자로 public 이나 default만 사용할 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값; // 변수는 가질수없다. only 상수
public abstract 메서드이름(매개변수목록); // 추상메서드
}
▶ 인터페이스 멤버들의 제약사항
- 모든 멤버 변수는 public static final. 생략가능
- 모든 메서드는 public abstract. 생략가능 ( static메서드와 default메서드는 예외!)
생략된 제어자는 컴파일 시 컴파일러가 자동으로 추가해준다.
interface PlayingCard {
// 상수 (public static final → 생략)
public static final int SPADE = 4;
final int DIAMOND = 3;
static int HEART = 2;
int CLOVER = 1;
// 추상메서드 (publc abstract → 생략가능)
public abstract String getCardNumber();
String getCardKind();
}
▶ 인터페이스의 상속
인터페이스는 인터페이스로부터만 상속받을 수 있고, 클래스와는 달리 다중상속이 가능하다.
여러개의 인터페이스로부터 상속을 받는 것이 가능. ( 추상메서드는 충돌해도 문제가 없다.)
▷ 충돌?
선언부가 다르면 둘 다 상속받으면 그만인데, 선언부가 같고 내용 { } 이 다르면 어느쪽을 상속 받을지
결정할 수 없다.
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable {}
}
클래스의 상속과 마찬가지로 자식 인터페이스는 부모 인터페이스에 정의 된 멤버들을 모두 상속받는다.
" 인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상이 없다."
▶ 인터페이스의 구현
추상클래스 처럼 그 자체로는 인스턴스 생성이 불가능하고, 추상클래스가 상속을 통해 추상메서드를 완성하는 것 처럼, 인터페이스도 자신에 저의된 추상메서드의 구현부를 만들어주는 클래스를 작성해야한다. 추상클래스가 자신을 상속받는 클래스를 정의하는 것과 다르지않다. 클래스는 확장한다는 의미의 extends를 사용하지만 인터페이스는 구현한다는 의미의 implements를 사용한다.
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야한다. (완성하는것!)
}
class Fighter implements Fightable {
public void move(int x, int y) { 내용 생략 }
public void attack(Unit u) { 내용 생략 }
}
class Fighter extends Unit implements Fightable {
public void move(int x, int y) { 내용 생략 }
public void attack(Unit u) { 내용 생략 }
}
구현하는 인터페이스의 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야하고, 위 처럼 상속과 구현을 동시에 할 수도 있다.
▶ 추상클래스와 인터페이스
▷ 공통점 - 추상클래스를 가지고있다(미완성 설계도)
▷ 차이점 - 인터페이스는 인스턴스 변수를 가질 수 없다.
▶ 인터페이스를 이용한 다형성
인터페이스도 해당 인터페이스 타입의 참조변수로 이를 구현한 클래스의 인스턴스를 참조할 수 있고, 인터페이스 타입으로의 형변환도 가능하다 . 인터페이스는 메서드의 매개변수의 타입으로도 사용될 수 있다.
메서드의 리턴타입으로 인터페이스를 저장하는 것도 가능한데, 리턴 타입이 인터페이스라는건 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
▶ 인터페이스의 장점
→ 두 객체간의 연결을 돕는 중간역할을 한다.
→ 선언(설계)과 구현을 분리시킬수 있게 한다.
→ 변경에 유리한 (유연한) 설계가 가능.
→ 개발시간을 단축시킬 수 있다.
→ 표준화가 가능하다.
→ 독립적인 프로그래밍이 가능하다.
→ 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.
class B {
public void method () {
System.out.println("methodIn B");
}
}
선언이 껍데기고, 구현이 알맹이라면 위의 코드는 껍데기 + 알맹이
같이 붙어있어서 변경이 힘들다. 유연하지 않고 변경이 불리.
// 새로운 인터페이스선언
interface I { // 껍데기 : 선언부만 떼어내기
public void method();
}
↑ 구현하게 만든다
class B implements I { // 알맹이
public void method() {
System.out.println("methodIn B");
}
}
밑에 코드가 변경에 유리하고 유연한 코드이다.
밑 코드 의 class B implements I { ... 와 제일 위 코드는 거의 같다.
🫨오늘의 회고
오늘은 Spring들은 첫 날인데... 아직까지는 재미있다! 진행하는 속도도 좋고 하나하나 가르쳐주는 느낌이라 친절하다. 그럼 잘 알아들어야 하는데, 어려운건 어려운거고 웹미니프로젝트 때 생각이 나는것 같기도하고 과제를 해야한다는 부담감에 열심히 강의를 듣고있다. 꼴등으로 제출해도 좋으니까 과제는꼭 할 수 있었으면 좋겠는데! api 랑 다이어그램? 이런 부분들이있어서 과제 요구사항보면서 머리가 아파오지만 주변분들이 너무 잘 알려주셔서 조금조금씩 힘을 얻고있다!! 내가 제일 잘하는걸 해야지....
'개발Article' 카테고리의 다른 글
[WIL]20240630 페어프로그래밍은 너무 좋은 커리큘럼이였다! (1) | 2024.06.30 |
---|---|
[TIL]20240629 JAVA 4주차 (0) | 2024.06.30 |
[TIL]20240627 3주차 마무리 ② (0) | 2024.06.28 |
[TIL]20240626 3주차 마무리 ① (0) | 2024.06.27 |
[TIL]20240625 3주차부터 천천히...!! (0) | 2024.06.26 |