추상 클래스, 인터페이스, 중첩클래스 알아보기

이유빈
이유빈 |
추상 클래스, 인터페이스, 중첩클래스 알아보기

추상 클래스

  • 완전하게 구현되어 있지 않은 메소드를 가지고 있는 클래스
  • 메소드가 미완성되어 있으므로 추상 클래스로는 객체 생성 불가능
  • 추상 클래스는 주로 상속 계층에서 추상적인 개념을 나타내기 위한 용도로 사용

      public abstract class Animal {
      	public abstract void move(); //추상 메소드, ;로 끝남
      	...
      }
    
    • 추상 클래스를 상속받으면 추상 메소드를 구현해야함
    • 추상 클래스라고 하더라도 추상 메소드가 아닌 보통의 메소드도 가질 수 있음
    • 일반 변수도 선언 가능
  • 추상 클래스의 용도
    • 추상 메소드로 정의되면 자식 클래스에서 반드시 오버라이드 해야함 하지 않으면 오류 발생
    • 일반 메소드로 정의되면 자식 클래스에서 오버라이드 하지 않아도 컴파일러가 체크할 방법이 없음

인터페이스

  • 컴퓨터 하드웨어에서의 인터페이스
    • 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격
  • 인터페이스
    • 각자의 클래스를 다른 사람의 클래스와 연결하기 위해 클래스 간의 상호작용을 기술하는 일종의 규격
  • 인터페이스의 예
    • 상속 관계가 아닌, 클래스 간의 유사성을 인코딩하는 데 사용 됨
  • 인터페이스의 정의

      public interface 인터페이스_이름 {
      	반환형 추상메소드1(...);
      	반환형 추상메소드2(...);
      	...
      }
    
    • 인터페이스에서 정의된 변수는 자동적으로 public static final이 되어서 상수가 됨
      public interface MyConstants {
      	int NORTH = 1;
      }
    
  • 인터페이스 구현
    • 인터페이스는 다른 클래스에 의해 구현(implement)될 수 있다
    • 인터페이스에 정의된 추상 메소드의 몸체를 정의한다는 의미
      class 클래스이름 implements 인터페이스이름 {
      	...
      }
    

인터페이스와 추상클래스

  • 추상 클래스 사용 권장
    • 관련된 클래스들 사이에서 코드를 공유하고 싶을 때
    • 공통적인 필드나 메소드의 수가 많은 경우
    • public 이외의 접근 지정자를 사용해야 하는 경우
    • 정적이 아닌 필드나 상수가 아닌 필드를 선언하기를 원할 떄
  • 인터페이스 사용 권장
    • 관련 없는 클래스들이 동일한 동작을 구현하기를 원할 때
    • 특정한 자료형의 동작을 지정하고 싶지만 누가 구현하든지 신경쓸 필요가 없을 때
    • 다중 상속이 필요할 떄

인터페이스와 타입

  • 인터페이스를 정의하는 것은 새로운 자료형을 정의하는 것과 마찬가지임
  • 인터페이스 이름을 자료형처럼 사용할 수 있음 (업캐스팅과 비슷하게 사용)
RemoteControl obj = new Television();
obj.turnOn();    //obj를 통해서는 RemoteControl 인터페이스에 정의된 메소드만을 호출가능
obj.turnOff();

인터페이스의 상속

public interface AdvancedRemoteControl extends RemoteControl {
	...
}
  • 인터페이스의 다중 상속
    • 하나의 클래스가 여러 개의 부모 클래스를 가지는 것
    • 자바에서는 불가능하지만 인터페이스는 다중 상속이 가능함
    • 동시에 여러 개의 인터페이스를 구현하면 다중 상속의 효과를 낼 수 있음
    • 하나의 클래스를 상속받고 또 하나의 인터페이스를 구현할 수도 있음
      public class FlyingCar2 extends Car implements Flyable {
      	...
      }
    

버전별 사용가능 메소드

  • Java7부터 사용가능
    • 추상 메소드(abstract)
  • Java8부터 사용가능
    • 디폴트 메소드(default)
    • 정적 메소드(static)
  • Java9부터 사용가능
    • 전용 메소드(private)

디폴트 메소드

  • 인터페이스 개발자가 메소드의 디폴트 구현을 제공할 수 있는 기능
  • 다시 정의할 수도 있고(오버라이드) 기본 구현을 사용해도 됨
//인터페이스 내부
default void myMethod2() {
	...
}

정적 메소드

  • 인터페이스는 추상석인 규격이기 때문에 정적 메소드가 들어갈 수 없었음
  • Java8 부터 인터페이스에서도 정적 메소드 사용이 가능해 짐
  • Java8 이전에는 인터페이스에 딸린 정적 메소드를 제공하려면 인터페이스와는 별도의 유틸리티 클래스와 헬퍼 메소드를 생성해야 됐음

인터페이스와 팩토리 메소드

  • 최근에 인터페이스에서도 팩토리 메소드가 있는 것이 좋다고 간주됨
  • 팩토리 메소드는 공장처럼 객체를 생성하는 정적 메소드
  • 디자인 패턴의 하나로 객체를 만드는 부분을 부모 클래스에 위임하는 패턴
  • new를 호출해 객체를 생성하는 코드를 부모 클래스에 위임한다는 의미

중첩 클래스

  • 클래스 안에서 클래스를 정의하는 것
  • 내부에 클래스를 가지고 있는 클래스를 외부 클래스라고 함
  • 클래스 내부에 포함되는 클래스를 중첩 클래스라고 함
  • 중첩 클래스의 분류
    • 정적 중첩 클래스: 앞에 static이 붙어서 내장되는 클래스
    • 비정적 중첩 클래스: static이 붙지 않은 일반적인 중첩 클래스
      • 내부 클래스(inner class): 클래스의 멤버처럼 선언되는 중첩 클래스
      • 지역 클래스(local class): 메소드의 몸체 안에서 선언되는 중첩 클래스
      • 익명 클래스(anonymouse class): 수식의 중간에서 선언되고 바로 객체화 되는 클래스
  • 중첩 클래스를 사용하는 이유
    • 내부 클래스는 외부 클래스의 private 멤버도 접근할 수 있기 때문

내부 클래스

  • 클래스 안에 클래스를 선언하는 경우
  • 내부 클래스는 외부 클래스의 인스턴스 변수와 메소드를 전부 사용할 수 있음
  • 내부 클래스 안에서는 외부 클래스의 private 변수들을 참조할 수 있음

지역 클래스

  • 메소드 안에 정의되는 클래스
  • 지역 클래스는 메소드 안에서만 사용이 가능하며 외부 클래스의 private 변수에 접근할 수 있음

익명 클래스

부모클래스 참조변수 = new 부모클래스() { //상속받고자 하는 부모 클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 적어줌
	...  //클래스 구현
}

Untitled

  • 클래스 몸체는 정의되지만 이름이 없는 클래스
  • 클래스를 정의하면서 동시에 객체를 생성하게 됨
  • 이름이 없기 때문에 한 번만 사용이 가능
이유빈

이유빈

국민대학교 소프트웨어융합대학 소프트웨어학부 이유빈입니다. 링크 아이콘을 클릭해 Github 페이지로 이동할 수 있습니다.

댓글

comments powered by Disqus