[JAVA]_8일차

전희주·2023년 4월 14일
0

JAVA

목록 보기
9/24

추상 클래스 (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 {
    }
    
}
  • 2) 종류

    • 가) memeber Inner 클래스

    : outer 클래스의 멤버(변수, 메서드) 처럼 선언

  class Outer { 
   int n; 
   public void a() { } 
   class Inner { 
   }
   
  }
  • 나) local Inner 클래스

    • outer 클래스의 로컬 변수처럼 선언
  • 다) 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); // outer의 private 멤버에 접근 가능
            System.out.println(y); // 에러! outer의 static 멤버에 접근 불가능
        }
    }
}

익명클래스 (anonymous class)

  • 1) 인터페이스 이용시 생성
  • 익명 클래스 작성법
  • 익명 클래스 작성법은 추후 lamda 표현식으로 확장 가능

함수형 프로그래밍 기반의 람다(lambda) 표현식

  • 기능에 집중하자.
Flyer f = new Flyer() { 

	@Override 
    public void a( ) { }  // a( ) { }  기능에 집중 

} ; 

f.a();
  • 익명클래스 => lambda 표현식
    • 함수형 인터페이스 => 단 하나의 추상메서드만 있어야 된다.
    • 추상메서드가 여러 개이면 익명클래스까지만 구현 가능
    • 추상메서드가 단 한 개이면, lambda 표현식 구현 가능
    • 함수형 인터페이스를 구현할 때는 반드시 하나의 추상 메서드만을 가져야 하지만, 디폴트 메서드나 정적 메서드는 추가할 수 있다.
    • @FunctionalInterface 어노테이션
      • 해당 인터페이스가 함수형 인터페이스임을 나타내기 위해 사용
      • 함수형 인터페이스는 단 하나의 추상 메서드를 가지는 인터페이스이므로, 이 어노테이션을 사용하면 컴파일러가 해당 인터페이스가 함수형 인터페이스로 사용될 수 있는지 검사하여 오류를 방지

0개의 댓글