추상 (Abstract)

Brogod97·2022년 12월 26일
0

KH TIL

목록 보기
24/37
post-thumbnail

abstract / interface

설계의 기능을 한다는 점은 같으나, 사용(존재) 목적이 다름

추상 클래스

상속 + 다형성 모두 활용한 것

두 개념을 잘 이해해야 추상 클래스도 능숙하게 사용 가능


추상화 : 공통점을 추출하고 불필요한 부분 제거하는 것

추상 클래스(abstract class

몸체 없는 메소드(추상 메소드)를 포함한 클래스 (미완성 설계도)

추상 클래스일 경우 클래스 선언부에 abstract 키워드 사용

[접근제한자] abstract class 클래스명 {}

추상 메소드(abstract method)

몸체 없는 메소드

추상 메소드의 선언부에 abstract 키워드 사용

상속 시 반드시 구현해야 하는, 오버라이딩이 강제화되는 메소드

[접근제한자] abstract 반환형 메소드명(자료형 변수명);

특징

  1. 미완성 클래스(abstract 키워드 사용)
    자체적으로 객체 생성 불가반드시 상속하여 객체 생성

  2. abstract 메소드가 포함된 클래스는 반드시 abstract 클래스
    abstract 메소드가 없어도 abstract 클래스 선언 가능

  3. 클래스 내에 일반 변수, 메소드 포함 가능

  4. 객체 생성은 안되지만 참조형 변수 타입으로는 사용 가능

장점

상속 받은 자식에게 공통된 멤버 제공

일부 기능의 구현을 강제화(공통적이나 자식 클래스에 따라 재정의 되어야 하는 기능).


💡 자바는 다중 상속을 지원하지 않음 → 출처의 모호함 방지

따라서 필요한 경우 인터페이스 사용

인터페이스

추상 클래스와 매우 유사한 개념이나, 보다 추상적인 개념

→ 구현 X, 설계 O (추상화의 정도가 높다)

설계의 개념에 좀 더 근접함


추상클래스와 달리 인터페이스는 반드시 사전에 정의된 추상메서드와 상수만 가질 수 있음

상수형 필드추상 메소드만을 작성할 수 있는 추상 클래스의 변형체

메소드의 통일성을 부여하기 위해 추상 메소드만 따로 모아놓은 것으로

상속 시 인터페이스 내에 정의된 모든 추상메소드 구현해야 함

[접근제한자] interface 인터페이스명 {
	// 상수도 멤버로 포함할 수 있음
	public static final 자료형 변수명 = 초기값;

	//추상 메소드만 선언 가능
	[public abstract] 반환자료형 메소드명([자료형 매개변수]);
	// public abstract가 생략되기 때문에
	// 오버라이딩 시 반드시 public 표기해야 함
}

추상 클래스와 작성법 및 상속 받는 법이 좀 다름


  1. 상속
  2. 추상클래스 상속
  3. 인터페이스 상속

위 개념들을 잘 알아야 언제 어떤 것을 쓸 지 판단할 수 있음


인터페이스는 다중 상속 가능함

implements 인터페이스1, 인터페이스 2, … 인터페이스n

→ 콤마 , 로 구분


특징

  1. 모든 인터페이스의 메소드는 묵시적으로 public abstract

  2. 변수는 묵시적으로 public static final

  3. 객체 생성은 안되나 참조형 변수로는 가능 (다형성)
    → 타입으로서의 역할은 수행한다는 뜻

장점

다형성을 이용하여 상위 타입 역할(자식 객체 연결)

인터페이스 구현 객체에 공통된 기능 구현 강제화 (== 구현 객체간의 일관성 제공)

공동 작업을 위한 인터페이스 제공

추상클래스와 인터페이스

구분추상 클래스인터페이스
상속단일 상속다중 상속
구현extends 사용implements 사용
추상 메소드abstract 메소드 0개 이상모든 메소드는 abstract
abstract명시적 사용묵시적으로 abstract
객체객체 생성 불가객체 생성 불가
용도참조 타입참조 타입

둘의 존재 목적이 다름


사용 시점 정리

상속

자식 클래스의 공통된 부분을 추출하여(→ 추상화) 부모 클래스를 만드는 것

→ 공통된 필드, 메서드를 가진 클래스를 만들고, 작성된 코드를 자식들이 물려받아 사용.

상속의 장점

  1. 코드 길이 감소

  2. 코드 중복 제거

  3. 재사용성 증가

  4. 자식에 대한 일관된 규칙 제공

[일반 클래스] 상속

부모 클래스도 객체로 만들 수 있어야 하는 경우

[추상 클래스] 상속

연관된 클래스의 공통점을 묶되, 부모 클래스는 객체로 만들 수 없는 경우

  • 일부 미완성 클래스 (abstract 메소드 0개 이상 포함)
  • ex) Animal 클래스 → 동물 객체는 어떤 동물인가?
    • 다음과 같은 메소드들은 정확히 어떻게 수행되는가?
      • eat()

      • breath()

        → 알 수 없음

    • 하지만, 동물의 공통된 기능명은 알고 있음

[인터페이스] 상속

→ 접점

연관성이 낮거나 없는 클래스에게 공통된 기능을 제공할 때 사용.

  • ex) 키보드, 마우스, 스캐너, 카메라, 기울기 센서
    → 공통점 : 입력장치 (우연히 입력이라는 기능을 갖고 있음)
    → 각각의 용도 및 사용법이 다 다르지만 입력이라는 공통된 기능명이 있음
    == 입력이라는 접점

모든 필드가 묵시적(암묵적) public static final

// 동일하게 인식됨
public static final double PI = 3.141592;

(public static final) double PI = 3.141592;

모든 메서드가 묵시적(암묵적) public abstract(추상 메서드)

⇒ 추상메서드: 같은 이름을 제공할 뿐, 상세한 기능 제공은 하지 않음

// input이라는 이름은 자식에게 제공하지만
// 기능은 제공하지 않고
// 오버라이딩 강제화

(public abstract) void input(); // 묵시적 public abstract

인터페이스 활용 (참고)

인터페이스 활용 용도

  • default 메소드 : 상속받은 클래스에 공통 기능 제공 → 자바의 함수 지향 언어 사용을 위한 메소드로 종종 사용
  • 람다, 스트림에 사용

0개의 댓글