Interface
- 추상 메소드의 집합, 일종의 추상 클래스 (extreme case of 추상클래스)
- 실제로 구현된 게 전혀없는 기본 설계도
- 객체 생성 불가 !
- 클래스 작성에 도움을 줄 목적으로 사용. 미리 정해진 규칙에 맞게 설계하도록!
• 클래스와 공통
- 여러 메소드 포함 가능
- .java 확장자 가진 파일로 저장
- 파일이름과 인터페이스 이름 일치해야함
- byte code는 .class파일에
• 클래스와의 차이
- 인터페이스는 인스턴스화 불가
- 생성자 포함xx
- 인스턴스 변수 포함 불가 ; static final 만 가능 !!
- 모든 메소드는 추상메소드
규칙
• 인터페이스는 객체화 불가!!(당연)
• 인터페이스는 무조건 public
• 인터페이스는 type임 -> 함수의 매개변수로 사용 가능 -> 이 인터페이스 사용한 class를 인자로 받을수잇는것 !!
♡구성멤버
• 인터페이스의 메소드는 무조건 public - 추상 메소드만 가능 -> public abstract void method(); 이렇게만 !
- public abstract 전부 생략가능. 생략해도 저절로 그렇게 됨ㅇㅇ
• 변수는 상수만 가능 ! public static final type name;
- 이때 public static final다 생략 가능. 생략해도 저절로 붙어서 해석됨 ㅇㅇ
♡인터페이스 사용
• 인터페이스를 사용하는 클래스 -> implements inter이름 이렇게 !
• 여러개 implements 가능! implements A, B
• 클래스는 인터페이스의 추상메소드들 다 정의해야함!
• 상속(extends)하면서 동시에 implement(구현) 가능함 (당연;)
♡인터페이스 상속
• 인터페이스도 extends를 통해 상속 가능 ; 당연히 인터페이스 간에만 상속 가능
• 클래스와 달리, 다중 상속 허용! 여러개 동시에 상속받을 수 있다 extends A,B 이런식으로
인터페이스의 장점, 사용 이유
1. 개발 시간 단축 가능
2. 표준화가 가능 - 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발 가능
3. 서로 관계없는 클래스들에게 관계를 맺어줄 수 ㅇ - 상속관계, 같은조상클래스갖지 x인 관계없는 클래스들도 하나의 이넡페이스 공통적으로 구현함으로써 관계를 맺어줄수잇다
4. 독립적인 프로그래밍 가능 - 클래스의 선언(설계)과 구현을 분리할 수 잇기땜에 실제 구현과 독립적인 프로그램을 작성하는게 가능해짐
Comparable interface
- java.lang에 잇습니다 -> import없이 자동 사용 가능 ^.^
* Integer, Double, String 같은 기본 클래스들에는 이미 Comparable 인터페이스가 구현되어있다
- 사용자 정의 class에는 알아서 Comparable객체 구현해서 저 함수 구현해줘야함!
-> 비교할때 a(객체).compareTo(다른객체) 해서 양수면 a가 더 크고 음수면 a가 더 작다 이런식으로 판단 가능!
* Arrays.sort함수는 Comparable객체들을 활용하여 오름차순으로 sort함!!
(Comparable배열 받아서 compareTo 함수 써서 정렬하는 듯)
Arrays.sort(comparable배열) -> 정렬됨 !!
** 이건 import해야함 !! import.util.Arrays !!
이 인터페이스를 implement하면..
• public int compareTo(Object other) 을 구현해야함!!
- this 해당 객체가 입력받은 other보다 크면 양수반환
- 같으면 0 반환
- 작으면 음수 반환
- this클래스와 parameter의 타입이 다름 -> ClassCastException이 throw!
@Override public int compareTo(Object anotherAccount)
{ return this.balance - anotherAccount.balance; }
현명한 방법 ! 빼기하면 알아서 + 0 - 이 됨!
** 이때 입력을 Object로 받기 때문에, 형변환을 해줘야함 !!~~!!!
Bank a = (Bank)anotherAccount; 이런식으로!
바로하면 ((Fruit)apple).getQuantity(); 이런식으로 !!
sort함수 짜보기 - Comparable 이용해서
sort는 Comparable를 구현한 클래스의 배열임
알고리즘은
맨 처음 인덱스와 해당 배열에서 젤 작은값의 자리를 바꿔준다
이걸 끝-1까지 반복!
public void sort(Comparable[] a, int num){ //num==개수인듯
int index, indexOfNextSmallest;
for(index=0;index<num-1;index++){
indexOfNextSmallest=indexOfSmallest(index, a,num); //해당 a배열에서 해당 index부터 젤 작은값찾음
interChange(index, indexOfNextSmallest, a);
}
}
int indexOfSmallest(int startInd, Comparable[] a, int num){
// 해당 인덱스부터 끝까지중에 젤 작은거 찾는 함수
Comparable min=a[startInd];
int indexOfMin=startInd; //0으로 해놓으면 안됨!!
for(int i=startInd+1;i<num;i++){
if(a[i].compareTo(min)<0){ //이게더 작으면
min=a[i];
indexOfMin=i;
}
}
return indexOfMin;
}
//interChange함수는 그냥
temp=a[j];
a[j]=a[i];
a[i]=temp;
Cloneable Interface
우선 clone (객체를 복사해서 리턴하는 것) 함수는 Object에 정의되어 있는데, 이를 사용하고 싶으면 Cloneable(인터페이스)를 구현해야 한다 !!
사실 이 인터페이스 내에는 아무런 메소드도 없다.
그치만 Cloneable을 구현 (implements)한 클래스의 객체에서 clone을 호출하면 복사한 객체를 반환하지만,
implement안한 클래스에서 clone 호출하면 에러를 던진다 ! - CloneNotSupportedException 이 throw된다.
* clone() 메소드 : 원본 객체의 필드값과 동일한 값을 가지는 새로운 객체를 생성합니다. 즉 한마디로 말하면 복제하는 메서드입니다.
멤버변수로 immutable밖에 없으면 그냥 super.clone()만 해줘서 리턴하면 됨
만약 클래스같은 mutable타입이 있음 -> super.clone() + 해당베리어블.clone한걸 멤버변수에 저장해주기 까지 해야함 !!
public class A implements Cloneable{
private DataClass cvar;
public Object clone(){
A copyObj=(A)super.clone(); //super.clone한건 기본적으로 object타입이므로 형변환 해줌
copyObj.cvar=(DataClass)cvar.clone(); //해당 객체의 clone불러줌 (cvar=this의 cvar)
return copyObj;
}
}
저런 mutable 인스턴스없으면 그냥
return super.clone (반환형은 Object) 하면 됨
Inner Class
안녕하세용 진지하게 써봅니당~
: 클래스 안에 선언된 클래스. 특정 클래스 내에서만 주로 사용되는 클래스를 - 내부 클래스로 선언 !
-> 내부 클래스에서 외부 클래스의 멤버들에 쉽게 접근 가능 !
( private 으로 선언 !! )
* inner의 키워드가 private이든 public이든 outer class에서 다 접근 가능!
클래스 종류
1. 인스턴스 클래스 : 멤버변수 선언위치에 선언함 -> 인스턴스 멤버로 다루어짐
2. static 클래스 : 멤버변수 선언위치에 선언 -> static멤버로 다루어짐
3. 지역(local) 클래스 : 메서드나 초기화 블럭 안에 선언, 해당 선언된 영역 내부에서만 사용가능
4. 익명(anonymous) 클래스 : 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스 (일회용)
// anonymous는
1. 조상 클래스로 바로 생성하거나
2. 인터페이스로 바로 해야함
ex) Car이라는 인터페이스가 있을때, 멤버로
Car a = new Car() { /* 클래스 내용 작성 */ }
// 이렇게 해당 인터페이스 상속한 클래스를 바로 구현 가능 !! 이름은 없음
inner classs 컴파일하면
-> ClassName$InnerName.class
이렇게됨 !!
'2-1 > 객체지향 - java' 카테고리의 다른 글
Design pattern - Singleton (0) | 2022.06.13 |
---|---|
14- ArrayList , Generics (0) | 2022.06.13 |
19- Threads (0) | 2022.05.31 |
Chap 9. Exception handling (0) | 2022.05.30 |
Polymorphism and abstract classes (0) | 2022.04.20 |