추상화와 인터페이스

Nak Jun Choi·2022년 11월 8일

추상화

추상화란?

  • '추상'이란 용어의 사전적 의미는 '사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것'이라고 정의한다. 즉, 공통성과 본질을 모아 추출하는 것이다.
  • 추상란? : 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것이다.
  • 자바에서는 주로 추상 클래스와 인터페이스라는 문법 요소를 사용해서 추상화를 구현한다.
  • 추상화의 장점
    • 코드의 중복을 줄인다.
    • 효과적으로 클래스 간의 관계를 설정할 수 있다.
    • 유지/보수가 용이해진다.

abstarct 제어자

  • 자바의 맥락에서 abstract라는 단어의 의미는 '미완성'이라 정리할 수 있다.
  • abstract 키워드가 메서드 앞에 붙으면 추상 메서드 클래스 앞에 붙으면 추상 클래스가 된다.
  • 추상 메서드는 메서드의 시그니처만 있고 바디가 없는 메서드를 의미한다.
  • 추상 메서드를 포함하는 클래스는 추상 클래스가 된다.
  • 추상 클래스는 객체 생성이 불가하다.

추상 클래스

  • 추상 클래스를 만드는 이유
    • 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용하다.
    • 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다.
    • 추상화를 구현하는데 핵심적인 역할을 한다.
  • 메서드 바디가 없는 추성 메서드를 하나 이상 포함한다.
  • 상속계층도의 상층부에 위치할 수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화된다.
  • 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의되어 있다.

final 키워드

  • 위치의미
    클래스변경 또는 확장 불가능한 클래스, 상속 불가.
    메서드오버라이딩 불가.
    변수값 변경이 불가한 상수.
  • final제어자를 추가하면 더 이상 변경이 불가능하거나 확장되지 않는 성질을 지니게 된다.

인터페이스

인터페이스란?

  • 컴퓨터 프로그래밍에서 사용하는 인터페이스의 뜻은 "서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또한 그런 접속 장치"라 정의할 수 있다.
  • 추상 클래스에 비해 더 높은 추상성을 가진다.
  • 추상 클래스를 설계가 모두 끝나지 않은 '미완성 설계도'에 비유할 수 있다면, 인터페이스는 더 높은 추상성을 가진다는 점에서 가장 기초적인 '밑그림'에 비유할 수 있다.
  • 기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다.

인터페이스의 기본 구조

  • interface 키워드를 사용한다.
  • 내부의 모든 필드가 public static final 로 정의되고, 모든 메서드가 public abstract로 정의된다.
  • 생략된 부분 (ex public, static, final)은 컴파일러가 자동으로 추가해준다.

인터페이스의 구현

  • 인터페이스는 그 자체로 인스턴스를 생성할 수 없고, 메서드 바디를 정의하는 클래스를 따로 작성해야 한다.
  • 구현하다는 의미를 가진 implements 키워드를 사용한다.
  • 특정 인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상메서드를 구현해야한다. 즉 어떤 클래스가 어떤 인터페이스를 구현한다는 것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다라는 의미를 가진다.

인터페이스의 다중 구현

  • 인터페이스는 상속과 달리 다중적 구현이 가능하다.
  • 인터페이스는 애초에 미완성된 멤버를 가지고 있기 때문에 충돌이 발생할 여지가 없어서 안전하게 다중 구현이 가능하다.
  • 특정 클래스는 상속 받으면서 동시에 인터페이스를 구현할 수 있다.

인터페이스의 장점

  • 역할과 구현을 분리시켜 사용자 입장에서는 복잡한 구현의 내용 또는 변경과 상관없이 해당 기능을 사용할 수 있다는 장점이 있다.
  • 코드 변경의 번거로움을 최소화하고 손쉽게 해당 기능을 사용할 수 있다.
  • 한 클래스의 변경이 다른 클래스에 미치는 영향을 최소화 할 수 있다는 장점이 있다.
profile
HelloWorld

0개의 댓글