인터페이스 타입변환
인터페이스를 타입 변환할때 운좋으면 내가 원하는대로 자식객체로 캐스팅 되겠지만 운나쁘면 에러난다. 자식객체가 일치 하지 않는데 변경해야 할 수 있기 때문이다. 그래서 instanceof를 통해 확인해주어야 한다.
인터페이스 참조 변수를 통해 인터페이스에 추상클래스로 정의 되어있는 애들만 불러올 수있다.
if( a instanceof C c){//인터페이스 a참조변수가 가리키고 있는 객체가 C클래스라면 바꿔주시오
}
인터페이스 다형성
인터페이스에 어떤 구현 객체가 담겼냐에 따라서 메소드 호출결과가 달라진다.
--> 추상클래스랑 비슷
봉인된 인터페이스
무분별한 자식인터페이스 생성을 방지하기 위해 봉인된 인터페이스를 사용한다.
sealed 인터페이스를 직접 상속 받는 인터페이스는 non-sealed나 sealed를 붙여줘야한다.
sealed 인터페이스는 class가 상속받을 수 없다.
public sealed interface InterfaceA permits InterfaceB{
}
SOLID 원칙
LSP(리스코프치환 원칙)
자식클래스의 변화가 부모클래스의 변화에 영향을 주면 안된다. 부모클래스의 의미가 변해버리면 안된다.
ISP(인터페이스 분리 원칙)
인터페이스 분리해서 사용해야 한다. 관련 없는 애들까지 상속받으면 곤란하니까
중첩클래스
클래스 내부에 선언한 클래스이다. 장점은 클래스의 멤버를 쉽게 사용할 수 있고 외부에는 중첩관계 클래스를 감춰서 코드의 복잡정을 줄일 수 있다는 점이다.
선언 방법 3가지
멤버클래스
-인스턴스멤버클래스
A클래스 안의 B클래스는 중첩클래스 이다. 중첩클래스는 public , default, private로 선언할 수 있으며, 주로 A클래스 안에 서 사용될 것이기 때문에 private접근제한자를 갖는다.
B객체는 A클래스 내부 어디서나 생성할 수는 없고 인스턴스 필드 값, 생성자, 인스턴스 메소드에서 생성할 수 있다.
class A {
//인스턴스 필드값
B field = new B();
A(){
//생성자
B b = new B();
}
//인스턴스 메소드
void method(){
B b = new B();
}
class B{
}
}
B객체를 A클래스 외부에 생성하려면 default 또는 public 접근제한을 가져야 하고, A객체를 먼저 생성한다음에 B객체를 생성해야한다.
A a = new A();
A.B b = a.new B();
-정적 멤버클래스
중첩된 내부 클래스에 static을 붙여준것 - > 정적 멤버 클래스는 A클래스 내부에서도 사용되지만 A클래스 외부에서 A와 함께 사용되는 경우가 많기 때문에 default나 public 접근 제한자를 가진다. A클래스 내부 어디서든 객체 생성가능하다.
class A{
static class B{ }
//인스턴스 필드
B field2 = new B();
//정적 필드
static B field2 = new B();
//생성자
A(){
B b = new B();
}
// 인스턴스 메소드
void method1(){
B b = new B();
}
//정적메소드
static void method2(){
B b = new B();
}
}
A클래스 외부에서는 A클래스 객체 생성 없이 A클래스로 접근해서 B객체를 생성할 수 있다.
A.B b = new A.B();
static변수나 메소드는 클래스명을 타고 접근해서 사용할 수 있다 A클래스가 static이 아니여도 가능
//B의 인스턴스 필드 및 메소드 사용하고 싶을때
A.B b = new A.B();
System.out.println(b.field1);
b.method1();
//B클래스의 정적 필드 및 메소드 사용 .static으로선언한 애들
//이렇게 클래스 명으로 접근해서 쓸수 있다. A클래스가 static이 아니여도
System.out.println(A.B.field2);
A.B.method2();
로컬 클래스
생성자나 메소드 내부에서 선언된 클래스이다 로컬클래스 내에서는 필드, 생성자,메소드, 정적필드, 정적 메소드 선언이 가능하다. 로컬 클래스 내에서 사용되는 A클래스의 로컬 변수는 final특성을 갖게 되어 수정할 수 없다.
class A{
public A(){
//로컬클래스
class B{
//인스턴스 필드
int field1 = 1;
//정적필드
static int field2 = 2;
//생성자
B(){}
//인스턴스 메소드
void method1(){}
//정적 메소드
static void method2(){}
}
}
public void method(){
class B{}
}
}
'JAVA공부(이것이 자바다)' 카테고리의 다른 글
java.base 모듈 (2) | 2023.06.07 |
---|---|
중첩클래스 이어서 (0) | 2023.06.05 |
상속 이어서 (0) | 2023.05.31 |
상속 (0) | 2023.05.30 |
클래스 이어서 (0) | 2023.05.29 |