일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- usedebugvalue
- 위상정렬
- 타입스크립트
- 리액트
- 프로그래머스 #알고리즘 #자바스크립트
- Suspense
- React
- 리코일
- 자바스크립트
- 완전탐색
- useContext
- 알고리즘 #코딩테스트 #프로그래머스 #자바
- javascript
- react-beautiful-dnd
- 알고리즘
- useLayoutEffect
- 백준
- 다이나믹프로그래밍
- 드래그앤드롭
- recoil
- 백준 #알고리즘 #자바스크립트
- 프로그래머스
- 스티커
- 훅
- useRef
- 알고리즘 #프로그래머스 #코딩테스트 #자바스크립트
- 덕타이핑
- Today
- Total
몽환화
230126 인터페이스, 제네릭 본문
인터페이스 Interface
서로 다른 두 시스템에서 상호작용을 위한 규격 약속
ex) USB, HDMI
Java에서는?
객체와 객체가 상호작용을 해
완벽히 추상화된 설계도 : 인터페이스가 갖는 모든 메소드는 추상 메소드! (약속)
추상클래스는 일반메소드랑 추상메소드 둘다 가질 수 있었잔아
모든 메소드는 public abstract이며 생략가능
모든 멤버변수는 public static final이며 생략가능 말은 변수인데 약간 상수로서의 역할
interface 키워드를 이용해서 선언함
클래스에서는 implements 키워드를 이용해서 인터페이스를 구현할 수 있음
public interface MyInterface {
public static final int MEMBER1 = 10;
int MEMBER2 = 10;
// 위 둘 다 사용가능. public static final 생략가능
public abstract void method1(int param);
void method2(int param);
// 위 둘 다 사용가능. public abstract 생략가능
추상클래스 받았을때도 얘가 갖고있는 메소드 오버라이드 했어야했잔아
인터페이스도 마찬가지임
클래스에서 인터페이스를 구현할 때 그 인터페이스가 갖고있는 메소드를 오버라이드해야함
저기 봐바 또 두줄 있는데
메소드 오버라이드 하거나 아님 이 클래스 자체를 추상으로 하래잔아
MyIterface 에서 저 MEMBER_1 같은 int들을 정의할 때 static으로 했었어서 저 타입의 이름으로 바로 접근가능함
>> 인터페이스를 만들고 클래스에 구현해서 객체를 만들어 보았습니당<<
인터페이스를 구현한 클래스로는 객체를 만들 수 있징
1. interface 키워드를 이용하여 선언한다.
2. 선언되는 변수는 모두 상수로 적용한다.
>>>>>>> static
3. 선언되는 메소드는 모두 추상 메소드이다.
4. extends를 이용해서 상속이 가능하다(다중상속 가능, 구현부 없음).
5. 객체 생성이 불가능하다.
>>>>>>> 인터페이스를 구현한 클래스로는 객체 생성 가능
6. 클래스가 인터페이스를 구현한 경우에는 implements키워드를 이용한다.
>>>>>>> extends 가 아님, implement 여러개 가능(다중구현)
인 => 인 : 다중상속 (extends)
클 => 인 : 다중구현 (implements)
7. 인터페이스를 구현하는 하위클래스는 추상메소드를 반드시 오버라이딩해야한다
오버라이딩 구현 안할거면 추상클래스로 남겨야한다.
8. 인터페이스는 다형성이 적용된다.
인터페이스 타입으로 인터페이스를 구현한 클래스의 객체를 참조할 수 있움
Interface
HdmiInput HdmiOutput 두개 있어
Computer => HdmiInput
Monitor => HdmiOutput
HdmiInput이라는 인터페이스가 있고 Computer라는 클래스가 있어
Computer는 HdmiInput이라는 인터페이스를 구현했어 (implements)
근데 HdmiInput에는 메소드가 있어<== 당연히 추상메소드
그래서 Computer라는 클래스가 Hdmi를 구현 할거면
Computer클래스 자체가 abstract이 되거나
아니면 Hdmiinput의 메소드를 싹다 오버라이드 해야돼ㅐㅐㅐㅐㅐㅐ
Computer는 HdmiInput을 참조를 했으니까
HdmiInput을 참조하지만 Computer의 객체인 computer를 만들 수 있어서
Computer의 메소드(HdmiInput의 메소드를 오버라이드 한 메소드)를 실행할 수 이써
왜 인터페이스를 사용해야돼???
설계도가 새로 나올때마다 모든 코드를 고쳐야 하나??????
어떤 클래스의 객체여도 사용할 수 있어
인터페이스를 구현하기만 하며는
쪼아
test03
다중구현 multiple implements
클래스 하나가 여러개의 인터페이스를 구현
오버라이드 잊지말기
Eagle 은 AbleToFly AbleToHunt
Duck 은 AbleToFly AbleToSwim AbleToHunt
둘의 차이를 알아야돼!!!!!
fly 에서는 fly()만 보이지만
d 에서는 fly() hunt() swim() 다 보여
test 04
다중 상속 multiple extends
하나의 인터페이스가 여러개의 인터페이스를 상속
DuckInterface라는 인터페이스를 새로 만든 후
AbleToFly, AbleToHunt, AbleToSwim이라는 세 인터페이스를 상속받게 했어
이후 기존에 저 세개의 인터페이스를 구현하던 Duck 클래스에서
DuckInterFace를 구현하라고 바꿔봤더니 오류떴어
당욘하징 DuckInterFace 에는 void playInnocent라는 새로운 메소드가 있우니까!!
이것도 오버라이드를 해줘야 Duck이 인터페이스를 제대로 구현할 수 있엉
public class Duck implements DuckInterface
@Override
public void hunt() {
}
@Override
public void swim() {
}
@Override
public void fly() {
}
@Override
public void playInnocent() {
System.out.println("오리발을 내밀엉");
}
public class UglyDuckling implements DuckInterface
@Override
public void hunt() {
}
@Override
public void swim() {
}
@Override
public void fly() {
}
@Override
public void playInnocent() {
System.out.println("저는 미운 오리가 아니라구용");
}
public class DonaldDuck implements DuckInterface
@Override
public void hunt() {
}
@Override
public void swim() {
}
@Override
public void fly() {
}
@Override
public void playInnocent() {
System.out.println("저는 진짜 오리가 아니양");
}
클래스 | 인터페이스 | |
특징 | - class 키워드를 사용하여 정의 - 필드와 메소드, 생성자로 이루어짐 |
- interface 키워드를 사용하여 정의 - 상수와 추상메소드(메소드 선언부)로 이루어짐 - public static final , public abstract 생략가능 |
관계 | 인터페이스를 구현함 | 클래스에 의해 구현됨 |
멤버 변수 | 선언 가능 | 상수만 가능 |
다중 상속 | 클래스는 하나의 클래스만 상속 가능, 다중상속 불가 | 인터페이스는 여러 개의 인터페이스 상속 가능 (구현부가 없으므로 헷갈리지 않음) |
다중 구현 | 클래스는 여러개의 인터페이스를 다중으로 구현 가능 | |
인스턴스 | 생성 가능 | 생성 불가 |
타입 | 타입으로 사용 가능 => 다형성! |
추상 클래스 | 인터페이스 | |
객체 생성 | 불가 | 불가 |
일반 메소드 | 가능 | 불가 (추상 메소드만 가능) |
일반 필드 | 가능 | 불가 (상수만 가능) |
메소드 | abstract를 붙여야만 추상 메소드 | 모든 메소드는 추상 메소드 |
사용 | - 추상적인 클래스의 성격을 가질 때(일부 메소드만 미완성인 설계도) - 서로 유사한 클래스 사이에 코드를 공유하고 싶을 때 |
- 서로 관련없는 클래스 사이에 공통으로 적용되는 인터페이스를 구현하기를 원할 때 - 객체의 성격이라기보다 어떤 기능을 구현하고 있다는 약속의 성격이 있을 때 |
공통점 | 특정 기능의 구현을 강제하고 싶을 때 |
제네릭 Generic
타입 파라미터를 이용하여 클래스, 인터페이스, 메소드를 다양한 타입을 처리할 수 있도록 작성하는 기법
'JAVA 때려잡기' 카테고리의 다른 글
230127 컬렉션 (0) | 2023.01.28 |
---|---|
230125 추상클래스 (0) | 2023.01.25 |
#가위바위보 게임(5판3선승, 3판2선승, 단판승) (0) | 2023.01.24 |
230119 객체배열관리 (0) | 2023.01.21 |