본문 바로가기
Java/Java 학원 복습

자바 - 추상메소드, 추상클래스, 인터페이스 - 학원

by code2772 2022. 10. 3.

[ 목차 ]

    728x90
    반응형

    # 추상 메소드

    메소드를 선언만하고 구현을 하지않은 것을 추상 메소드라고 한다.(마완성된 메소드)

    ex) abstract void 메소드명(매개변수)

    1. abstract 키워드를 사용한다.

    2. 마지막에 세미콜론을 써야한다.

    # 추상 클래스

    abstract 카워드가 붙은 클래스는 추상 클래스이며 , 추상 메소드가 한 개 이상 있는

    클래스는 반드시 추상 클래스로 선언한다.(미완성된 클래스)

    ex) abstract class 클래스명 {

    abstract void 매소드명(매개변수)

    *일반 메소드도 선언 가능

    }

    1. abstract 키워드를 사용한다.

    2. 객체화 시킬 수 없다.

    ** 미완성된 메소드(추상 메소드)는 상속받은 자식 클래스에서 반드시 재정의하여

    구현을 해야만 해당 클래스를 객체화 할 수 있다. 그러므로 [강제성]을 부여하기 위해서

    추상 메소드로 선언한다.

    * 추상 클래스를 사용하는 이유

    공통되는 속성과 행위를 추상화하여 부모클래스를 만드는데 반드시 모든

    자식클래스에서 구현해야하는 메소드가 있다면 추상메소드로 선언하는게 좋다.

    추상 클래스를 상속받은 자식 클래스는 추상 메소드를 오버라이딩 하지 않으면

    오류가 발생하므로 [강제성]이 생기게 된다.

    만약 부모클래스에서 메소드를 구현을 한다면 강제성이 없으므로 자식클래스를

    만드는 개발자가 재정의하지 않고 그냥 넘어갈 수 있다.

    # 인터페이스 (interface)

    1. 일종의 추상 클래스이지만 클래스라고 부르지 않으며 추상화의 정도가 높다.

    2. 멤버로는 상수와 추상메소드만 가질 수 있다.

    3. 인터페이스는 객체화 할 수 없다.

    4. 인터페이스는 다른 클래스에서 구현(implements)해서 사용한다.

    (상속과 비슷하다.)

    5. 구현할 때에는 implements 키워드를 사용한다.

    *인터페이스의 선언

    interface 인터페이스명 {

    멤버 선언;

    }

    *인터페이스의 멤버

    1. 모든 필드가 public static final 이다. (생략해도 자동으로 붙는다.)

    2. 모든 메소드는 public abstract이다. (생략해도 자동으로 붙는다.)

    *클래스의 상속과 인터페이스의 구현

    1. 클래스는 단일 상속만 가능하다.

    2. 인터페이스는 다중 구현이 가능하다.

    3. 상속과 구현은 별개이다. 즉 하나의 클래스에 상속과 구현을 동시에 할 수 있다.

    4. 인터페이스는 인터페이스를 상속할 수 있다.

    *인터페이스를 사용하는 이유

    1. 여러 클래스에서 선언할 멤버들을 일관되게 하기 위해 사용한다.(표준화)

    2. 관계없는 클래스들을 그룹화 시킬 수 있다. (마커 인터페이스)

    *인터페이스의 문제점

    인터페이스는 강제성이 강하기 때문에 구현하는 클래스에서 일부만 재정의하여

    사용하는게 불가능하다.

    이를 해결하기 위해 Adapter라는 추상클래스를 활용한다.

    *어댑터 클래스(추상 클래스)와 인터페이스

    인터페이스의 강제성을 완화시키기 위해 Adapter클래스를 사용한다.

    어댑터 클래ㅡ스는 추상 클래스로 만들기 떄문에 미구현된 메소드와

    구현된 메소드가 동시에 존재할 수 있다.

    그러므로 어댑터 클래스에서 인터페이스를 상솟받아 강제성을 없에고 싶은 메소드만

    재정의 해준다. 이 후 어댑터 클래스를 상속받는 자식 클래스는 내각 원하는 메소드만

    재정의할 수 있게 된다.

    이 때 어댑터 클래스의 이름은 이름 뒤에 Adapter 를 붙여주는 목저을 알려주는게 좋다

    *다중상속

    여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.

    JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.

    하지만 JDK8버전 부터는 인터페이스에 default 메소드등을 만드는 것을

    허용한다.( 특정 메소드의 구현을 허용한다.)

    여러 개를 구현(상속)할 수 있는 인터페이스 특징때문에 다중상속을

    지원하는 것이나 다름이 없다.

    인터페이스의 추가된 기능(JDK8부터 추가됨)

    1. default 메소드를 선언할 수 있다.

    [public] default 리턴타입 메소드명(매개변수){

    실행할 코드;

    }

    2. static메소드를 선언할 수 있다.

    [public] static 리턴타입 메소드명(매개변수){

    실행할 코드;

    }

    3. private 메소드(JDK9부터 사용가능)

    * 모호성

    하나의 자식이 여러 부모를 상속받을 때 서로 다른 부모 클래스에 동일한 이름의

    멤버가 있다면, 어떤 부모의 멤버인지 알 수 없다.

    * 모호성 해결방법 예시

    1. 두 개의 인터페이스에 같은 메소드가(이름, 매개변수, 리턴타입이 같은)

    선언되어 있는 경우

    -> 자식클래스에서 재정의하여 사용한다.

    2. 부모 클래스의 메소드와 인터페이스의 디폴트 메소드의 이름과 매개변수가 같은 경우

    -> 부모 클래스의 메소드가 사용된다.

    ** 인터페이스도 타입이다.

    인터페이스는 부모이고 구현한 클래스가 자식이다.

    * 마커 인터페이스(Marker Interface)

    클래스들을 그룹화하기 위한 목적으로 사용한다.

    서로 다른 클래스들을 공통되는 타입을 갖도록 하는것이 유일한 목적이기 때문에

    마커 인터페이스는 어떠한 멤버도 선언하지 않는다.

    반응형