Java

[Java-9] 추상클래스, 추상메소드, 인터페이스

zamezzz 2017. 2. 12. 20:18

 [Java-9] 추상클래스, 추상메소드, 인터페이스


안녕하세요.


오늘은 JAVA의 추상클래스, 추상메소드, 인터페이스에 대해서 알아보겠습니다.


지난 포스팅에서 살짝 언급하였죠?


오늘은 바로 그 추상화에 대해서 정리하겠습니다.



■ 추상클래스란?

 추상메소드란?

■ 인터페이스란?



■ 추상클래스란?


클래스는 크게 2종류로 나뉠 수 있는데요.


객체를 직접 생성할 수 있는 '실체 클래스' 그리고 이들의 공통적인 특성을 선언한 '추상 클래스'


이렇게 나뉠 수 있습니다. 물론 실체 클래스와 추상 클래스는 상속의 관계를 가지고 있어요.

(추상 클래스가 부모인 것은 당연하겠죠?)


실체 클래스는 추상 클래스의 모든 특성을 물려받고, 이 외의 추가적인 특성을 가질 수 있습니다.


추상 클래스는 이러한 특성을 선언하였기에, new연산자를 통한 인스턴스를 생성시킬 수 없어요.


예를 들어 보겠습니다.


Tire.class / Door.class / Handle.class 등의 실체 클래스가 있다고 가정할 때, 이들의


공통되는 필드와 메소드를 따로 선언하여 Car.class를 만드는데 이를 추상 클래스라고 합니다.


추상 클래스를 사용하는 목적은 크게 2가지에요

- 실체 클래스의 공통 필드와 메소드 이름을 통일 -> 관리 효율

- 실체 클래스 작성 시 시간 절약 및 실수 방지 -> 관리 효율


결국 관리 효율이에요


사용 방법은 아래와 같습니다.


Car.java

class abstract class Car {

  //필드

  //생성자

  //메소드

}



Tire.java

class class Tire extends Car {

  //필드

  //생성자

  //메소드

}



mainEx.java

class class mainEx {

  public static void main(String[] args) {

    Tire tire = new Tire();

    tire.method();

    tire.method();

  }

}



■ 추상메소드란?


추상 클래스에 대해 알아보았으니 다음으로 추상 메소드에 대해 알아보죠


추상메소드도 추상화라는 의미는 같습니다.


추상클래스에서만 선언할 수 있는 메소드의 선언부만 존재하는 메소드입니다.


하위 클래스가 반드시 포함하여 설계해야만 합니다.


그렇기에 하위 클래스(자식 클래스, 실체 클래스)는 반드시 오버라이딩 하여 메소드를 작성해야 합니다 !


사용법은 아래와 같습니다.


[public || protected] abstract {return type} 메소드명 (매개변수, ...)


중괄호조차 없는 것이 바로 추상 메소드입니다.

실체 클래스는 이 메소드를 반드시 작성해야 하죠.

좀 더 쉽게 예시를 한 번 보겠습니다.


Car.java

class abstract class Car {

  public String kind;

  

  public abstract void Name();

}



BMW.java

class class BMW extends Car {

  public BMW() {

    this.kind = "수입차";

  }


  @Override

  public void Name() {

    System.out.println("BMW입니다");

  }

}



KIA.java

class class KIA extends Car {

  public KIA() {

    this.kind = "국산차";

  }


  @Override

  public void Name() {

    System.out.println("KIA입니다");

  }

}


어떤 느낌인지 아시겠나요?


해당 추상 메소드를 작성하지 않으면... 컴파일 에러가 발생합니다.


그렇기에 반드시 오버라이딩하여 작성해야 합니다.


■ 인터페이스란?


오늘의 마지막 주제인 인터페이스입니다.


인터페이스는 말 그대로 인터페이스입니다. 쉽게 생각하면 쉽게 이해할 수 있어요.


객체와 코드 사이에서 인터페이스 역할을 해줍니다. 그렇기에 객체의 내부를 알 필요 없이 


인터페이스의 메소드만 알고 있으면 됩니다. 쉽게 말해 추상 메소드만을 가진 클래스입니다.


인터페이스에서 선언된 메소드는 반드시 구현되야하죠.


사용법은 아래와 같습니다.


public interface 인터페이스명 {...}


인터페이스 내에는 상수 필드, 추상 메소드, 디폴트 메소드, 정적 메소드가 존재합니다.

상수 필드는 이전과 동일한 상수를 선언하고 값을 초기화 해줍니다.

추상 메소드는 위에서 설명하였습니다.

디폴트 메소드 및 정적 메소드는 java8 버전부터 생겨난 개념입니다.

먼저 디폴트 메소드에 대해서 정리하겠습니다.


default 리턴타입 메소드명 (매개변수, ...) {...}


default 키워드가 리턴타입 앞에 붙습니다.

추상 메소드와 다르게 실행 내용까지 작성되죠. 인터페이스에 선언되고 작성되기는 하지만...

사실은 객체가 가지고 있는 인스턴스 메소드라고 생각해야합니다.

이렇게 사용한 이유는 단순히 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위함입니다.

다음으로는 정적 메소드에 대해서 정리하겠습니다.


static 리턴타입 메소드명 (매개변수, ...) {...}


정적 메소드는 public 특성을 가지므로 public을 생략해도 됩니다.

기존 정적 메소드와 형태는 완전히 동일하며, 디폴트 메소드와는 달리 객체가 없이 인터페이스

만으로도 호출이 가능합니다.

● 구현 클래스
이제 인터페이스의 내용을 살펴보았으니, 이를 실제 구현할 구현 클래스를 알아보죠

구현 클래스는 보통의 클래스와 동일하지만, 인터페이스 타입 사용을 알려주기 위해 다음과 같이 사용됩니다.

public class 구현클래스명 implements 인터페이스명 {

  //인터페이스에 선언된 추상 메소드의 실체 메소드 선언

}



이후 main 클래스에서 호출을 통해 이전과 같은 방법으로 사용하시면 됩니다.



인터페이스에 대해 잘 이해를 하시면 코드 정리 및 구현에 도움이 많이 됩니다.


감사합니다.

반응형

'Java' 카테고리의 다른 글

[Java-11] 스트림 (Stream)  (0) 2017.03.02
[Java-10] 예외 처리(Exception)  (0) 2017.02.18
[Java-8] 상속  (0) 2017.02.05
[Java-7] 클래스  (0) 2017.01.30
[Java-6] 객체와 클래스  (1) 2017.01.28