ㅇTL

Interfaces and Inner Classes 본문

2-1/객체지향 - java

Interfaces and Inner Classes

정노르레기 2022. 6. 2. 18:28

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