추상 클래스 (abstract class)
- 이탤릭체로 표기된 MyClass가 추상 클래스이다.
- 1) 문법: public abstract class 클래스명 { }
- concrete class (클래스의 멤버가 정해짐)
public class 클래스명 {
}
public abstract void a ( ) ;
- 어떤 기능을 처리할지 결정안됨
- 추상 메서드는 자식 클래스에서 반드시 구현
- 반드시 추상메서드를 재정의해야된다!!
public void a( ) { } ;
- 2) 특징:
- 객체 생성이 불가 (new 키워드 사용불가 , 즉 heap 메모리 영역에 할당 불가)
- Data Type으로는 사용 가능
- 다른 클래스의 도움을 받아서 추상 클래스의 멤버를 사용할 수 있다.
- 추상 클래스를 상속받는 자식 클래스에서는 추상 클래스의 추상 메서드를 구현해야 하며, 구현하지 않는다면 컴파일러가 오류를 발생
(✨ 추상 메서드 재정의 필수)
- 추상 클래스라고 해서 반드시 추상메서드를 가지고 있는 것은 아니다 (역은 성립)
- 추상 메서드를 가지고 있으면 반드시 추상 클래스를 가지고 있어야 한다.
- 추상 클래스 => 단일 상속만을 지원
추상 클래스 실습
- 추상메서드를 추상클래스를 상속받은 자식 클래스에서 구현하지 않는 경우 에러 발생
인터페이스
- 1) 문법
- 상수(public static final 자동 지정)
-> public static final int n = 10
- ✨ 추상 메서드(public abstract 자동 지정됨)
-> public abstract void a();
- default 메서드
-> public default void b () { };
- static 메서드 -> public static void c() { };
+) ✨ 지정자 없는 일반 메서드 , 인스턴스 메서드, 생성자는 가질 수 없음
cf. 추상 클래스
-
추상 클래스, 인터페이스 비교
- ✨ 추상 클래스에서는 명시적으로 public abstract 기재 안하면 에러 발생
-
2) 특징
- new 불가
- 다른 클래스 활용 (삼각형의 점선이 여러 개 나올 수 있음, 즉 다중속성이 가능한 것이 큰 특징)
-
인터페이스 클래스 구현 관계 강제성
-
인터페이스를 구현한 클래스는 인터페이스에서 정의한 모든 메서드를 반드시 재정의
-
✨ 즉, 인터페이스 속성 메서드 재정의 필수 (추상 클래스는 그렇지 않음)
-
Bird 클래스는 implements 키워드를 이용해서 Flyer 인터페이스를 구현한다. Airplane 및 SuperMan 클래스도 Flyer 인터페이스를 구현하게 하면 3개의 클래스들 모두 tabkeOff(), fly(), land() 메서드를 반드시 구현해야 된다. 구현하지 않으면 컴파일 에러가 발생되기 때문에 강제성을 줄 수 있고 통일성도 줄 수 있다.
-
같은 종류면 실선 (인터페이스끼리의 연결, 클래스끼리의 연결)
- extends
- 인터페이스끼리는 extends, 다중 상속 가능
-
종류가 다르면 점선
- implements
인터페이스 주요 기능
- 1) 하위 클래스에서 특정 메서드 강제할 목적
- 2) 클래스들 간의 의존성 강조
- loosely coupling
- decoupling
인터페이스 실습
- 자동 메서드 재정의, implements
중첩 클래스
- 1) 문법:
- 중첩 클래스를 포함하는 바깥 클래스를 Outer클래스라고 하며 내부에 포함된 클래스를 중첩클래스 또는 Inner 클래스라고 한다.
class Outer {
class Inner {
}
}
class Outer {
int n;
public void a() { }
class Inner {
}
}
-
나) local Inner 클래스
-
다) static Inner 클래스
- inner 클래스만 static을 가질 수 있음.
- inner 클래스는 프로그램 실행 시 만들어짐.
- 다른 클래스는 반드시 outer class 생성 필
-
라) ✨✨ anonymous Inner 클래스 ( 익명 클래스 )
-
기본적으로 inner는 outer에 있는 private에 접근 가능하나, 안으로 들어가면 static을 가질 수 없다??
- 자바에서 inner 클래스는 outer 클래스의 멤버로 간주되며, 따라서 outer 클래스의 private 멤버에 접근할 수 있습니다. 하지만 inner 클래스 내부에서는 outer 클래스의 static 멤버에 대한 참조를 가질 수 없습니다.
public class Outer {
private int x = 10;
private static int y = 20;
public class Inner {
public void foo() {
System.out.println(x);
System.out.println(y);
}
}
}
익명클래스 (anonymous class)
- 1) 인터페이스 이용시 생성
- 익명 클래스 작성법
- 익명 클래스 작성법은 추후 lamda 표현식으로 확장 가능
함수형 프로그래밍 기반의 람다(lambda) 표현식
Flyer f = new Flyer() {
@Override
public void a( ) { }
} ;
f.a();
- 익명클래스 => lambda 표현식
- 함수형 인터페이스 => 단 하나의 추상메서드만 있어야 된다.
- 추상메서드가 여러 개이면 익명클래스까지만 구현 가능
- 추상메서드가 단 한 개이면, lambda 표현식 구현 가능
- 함수형 인터페이스를 구현할 때는 반드시 하나의 추상 메서드만을 가져야 하지만, 디폴트 메서드나 정적 메서드는 추가할 수 있다.
- @FunctionalInterface 어노테이션
- 해당 인터페이스가 함수형 인터페이스임을 나타내기 위해 사용
- 함수형 인터페이스는 단 하나의 추상 메서드를 가지는 인터페이스이므로, 이 어노테이션을 사용하면 컴파일러가 해당 인터페이스가 함수형 인터페이스로 사용될 수 있는지 검사하여 오류를 방지