InterFace(인터페이스) >
인터페이스의 정의
(14일차에 이어서 진행)
개발 코드와 객체가 서로 통신하는 접접이다.
개발코드가 1개의 객체와 값을 주고 받는것이 아닌 다양한 객체와 소통의 창구가 되어주는 것이 인터페이스이다.
그래서 우리는 개발에서 다형성(polymorphism)을 구현해낼수 있다!
인터페이스 멤버 선언
인터페이스또한 필드를 가지며, 인터페이스의 멤버들은 Abstract이다.
그리고 Abstract성질로 인하여 생성자는 멤버로 가질 수 없다.
public interface InterfaceExample{
int a; // 오류 발생!
int A = 0;
}
class선언과 동일한 부분에서 interface만 변경하여 선언을 하여 시작한 후 선언부문법은 동일하다.
그러나 가질수있는 필드에 제한이 있게되는데; 상속과는 다르게 상수값만을 가질수있다.
따라서 선언만하는 필드 a는 컴파일상에 오류가 발생한다(초기값을 정하지않으면 안됨)
그리고 필드 A는 생성이 되는데, 이에 숨어있는 부분이 있다.
우리는 staic이 정적멤버(다른곳에서도 동일하게 사용) , final이 값의 고정상수화 라는것을 알고 있다.
따라서 정적상수로 쓰여야만 한다는 interface 필드 조건에 맞기에
엄밀히 따지면 3번째줄의 초기값 0 선언은
static final int A=0 ;
과 같은 효과를 가지게 되는 것이다.
구현 클래스 선언
자신의 객체가 인터페이스 타입으로 사용할 수 있음??
// ImplementExample 가 InterfaceExample 를 구현하는 클래스이다!
public class ImplementExample implmetns InterfaceExample{
// 구현 클래스를 선언했다면 ★★★ 추상메소드를 Overide로 재정의 해야만 한다★★★
}
이렇게 선언함으로써 우리는 인터페이스를 구현해주는 구현객체를 만들 수 있으며, 해당 클래스를 통해 인터페이스를 구현하는 객체 또한 만들 수 있는 것이다.
익명 구현 객체
위에서 우리는 구현 클래스를 직접 명시해야 구현된 클래스의 객체를 생성 할 수 있었다.
이 객체가 많이 쓰인다면 좋지만 만약 한번만 써도 된다면 굳이 이 클래스를 생성해야할까?
이때 사용하는 것이 익명형태의 구현클래스의 객체를 사용한다.
※문법
인터페이스 변수 = new 인터페이스(){
//인터페이스에 선언된 추상메소드의 실체 메소드를 여기서 선언하자!
};
이런식으로 한번에 새로운 인터페이스 변수를 선언하면서 한번에 overide를 해야하는것 까지 해결해준다.
물론 이렇게 선언된 익명 구현 객체는 다른곳에서 사용할 수 없고, 구현객체의 실행부에서만 사용가능하다.
인터페이스간의 상속
// 문법은 클래스와동일하다 , but 여러개의 상속이 가능!!
public interface KidInterface extends ParentInterFace1, ParentInterFace2{
// 클래스는 원하는것만 오버라이딩하여 사용할 수 있었지만..
// 인터페이스는 상위에서 선언된 Abstract들이 무조건 재정의되어야한다
}
클래스와 문법상으로 큰 차이는 없지만, 부모인터페이스를 자식인터페이스가 선택권 없이 모두 오버라이딩해주어야만 한다.
인터페이스 필드의 사용
인터페이스를 먼저 간단하게 선언해보자.
public interface Inter{
public static final int minNum = 2;
public int maxNum = 5; // static final은 생략해도 동일하게 상수로써 쓰인다
public void method1(); //인터페이스메소드는 실행부가 없을을 잊지말자
}
다음은 인터페이스를 구현해줄 클래스이다.
public class Class1 implemensts Inter{
Inter inter; // 클래스내에서 인터페이스 변수 선언!
inter = new Class1(); // 클래스의
@Override
public void method1(){
System.out.println{"method1 실행"};
}
}
오버라이드를 꼭 해야함을 잊지않고 만들어 준 후 이제 실제로 실행될 Main 메서드로 가보자
public class Class1Main {
public static void main(String[] args){
Class1 myClass = new Class1(); // 구현 클래스의 객체를 만들었다.
myClass.inter.method1(); // 구현 객체 내의 inter라는 인터페이스 객체가 class1의 객체를 대입받았으므로
// class1에서 override된 method1 을 호출한다.
}
}
이러한 구조로 이루어질 경우 우리는 인터페이스를 구현한 객체
Abstract
컬렉션 프레임워크
컬렉션 프레임워크의 주요 인터페이스
List Set Map 3개의 큰 인터페이스로 분류하여 시작하자.
성질이 이렇다는것에는 특별한 이유가 없고, 중요하게 알아야할 내용이 잘 기억해두자.
List와 Set이 정 반대되는 성질을 가지고 있다
Map은 key가 불러와줄 주소에 해당하며, 값은 불러와니는 데이터에 해당하기때문에 키는 중복될 수 없다.
기본 API Class
String Class
<1> [비교대상자1].equals( [비교대상자2] ) 연산자
return 타입 : boolean
선행 : [비교대상자1] == [비교대상자2] return 타입 : boolean 계산방식 : 비교대상자1의 참조주소 와 비교대상자2의 참조주소 가 같은지 확인한다. public class String01 { public static void main(String[] args) { String name1 = "홍길동"; String name2 = "홍길동"; if(name1==name2) { System.out.println("==일치합니다");//일치 }else { System.out.println("==일치안함"); } String name3 = new String("홍길동"); String name4 = new String("홍길동"); if(name3==name4) { System.out.println("일치합니다");//일치 }else { System.out.println("일치안함"); } } }
"홍길동" String을 그냥 대입하는 name1과 name2는 똑같은 "홍길동"에서 주소만 가져와 힙의 주소를 저장하여 불러오는 것이기 때문에 서로 주소가 같다. 그러나 new를 이용하여 "홍길동" 을 생성하여 만들 경우엔 만들때마다 새로운 주소를 할당하기때문에 name3과 name4는 저장하는 주소가 서로 다를 것이다. |
※ == 연산자와 .equals() 를 분리하여 사용할줄 알아야한다!
public class String01 {
public static void main(String[] args) {
String name1 = "홍길동";
String name2 = "홍길동";
if(name1.equals(name2)) {
System.out.println("==일치합니다");//일치
}else {
System.out.println("==일치안함");
}
String name3 = new String("홍길동");
String name4 = new String("홍길동");
if(name3.equals(name4)) {
System.out.println("일치합니다");//일치
}else {
System.out.println("일치안함");
}
}
}
'JAVA > JAVA 국비지원 수업 정리' 카테고리의 다른 글
JAVA 18일차 수업 (0) | 2023.05.25 |
---|---|
JAVA 17일차 수업 (0) | 2023.05.24 |
JAVA 14일차 수업 (0) | 2023.05.18 |
JAVA 12일차 수업 (0) | 2023.05.16 |
JAVA 11일차 수업 (0) | 2023.05.15 |