본문 바로가기

Java/기초

[Java] 객체지향 프로그래밍 5

1. 추상클래스(abstract class)

- 미완성 메서드(추상메서드)를 포함하고 있다.

- 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 조사클래스로서 중요한 의미를 갖는다.

- 키워드 'abstract'를 붙이기만 하면 된다.

[참고] 추상메서드를 포함하고 있지 않은 클래스에도 키워드 'abstract'를 붙여서 추상클래스로 지정할 수도 있다. 추상메서드가 없는 완성된 클래스라 할지라도 추상클래스로 지정되면 클래스의 인스턴스를 생성할 수 없다.

 

1.1 추상메서드(abstract method)

메서드를 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에는 선언부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려 주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워 두는 것이다. 그래서 추상클래스를 상속받는 자손 클래스는 조상의 추상메서드를 상환에 맞게 적절히  구현해주어야 한다.

1.2 추상클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기로 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상클래스로 만들어 상속하도록 하는 경우도 있다.

- 추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업

- 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업

 

2. 인터페이스(Interface)

추상클래스처럼 추상메서드를 각지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.

2.1 인터페이스의 작성

일반적인 클래스의 멤버들과 달리 인터페이스의 멤버들은 다음과 같은 제약사항이 있다.

- 모든 멤버변수는 public static final 이어야 하며, 이를 생량할 수 있다.

- 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.

단, static메서드와 디폴트 메서드는 예외(jsk 1.8부터변경)

2.2 인터페이스의 상속

인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속을 받는 것이 가능하다. 

[참고] 인터페이스는 클래스와 달리 Object클래스와 같은 최고 조상은 없다.

2.3 인터페이스의 장점

- 개발시간을 단축시킬 수 있다.

- 표준화가 가능하다.

- 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

- 독립적인 프로그래밍이 가능하다.

2.4 인터페이스의 이해

- 클래스를 사용하는 쪽(User)과 클래스를 제공하는 쪽(Provider)이 있다.

- 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.(내용은 몰라고 된다. 시그널)

2.5 익명클래스(anonymous class)

클래스의 선언과 객체의 생성을 동시에 하기 때문에 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있는 일회용 클래스이다.

이름이 없기 때문에 생성자도 가질 수 없으며, 조상클래스의 이름이나 구현하고자 하는 인터페이스의 이름을 사용해서 정의하기 때문에 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 둘 이상의 인터페이스를 구현할 수 겂다. 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

 

2.6 디폴트 메서드와 static 메서드

원래는 인터페이스에 추상 메서드만 선언할 수 있는데, JDK1.8부터 디폴트 메서드와 static메서드도 추가할 수 있게 되었다. static메서드는 인스턴스와 관계가 없는 독립적인 메서드이기 때문에 예전부터 인터페이스에 추가하지 못할 이유가 없었다.

1) 디폴트 메서드

인터페이스가 변경이 필요할 경우를 대비해서 디폴트 메서드(default method)라는 것이 나왔다. 추상 메서드가 아니기 때문에 새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.

메서드 앞에 키워드 default를 붙이며, 추상 메서드와 달리 일반 메서드처럼 몸통{}이 있어야 한다. 접근제어자가 public이며, 생략이 가능하다.

새로 추가된 디폴트 메서드가 기존 메서드와 충돌이 일어날 경우 해결 규칙

  • 여러 인터페이스의 디폴트 메서드 간의 충돌
    • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 한다.
  • 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

 

'Java > 기초' 카테고리의 다른 글

[Java] java.lang패키지와 유용한 클래스1  (0) 2020.09.11
[Java] 예외처리  (0) 2020.08.30
[Java] 객체지향 프로그래밍 4  (0) 2020.07.19
[Java] 객체지향 프로그래밍 3  (0) 2020.07.12
[Java] 객체지향 프로그래밍 2  (0) 2020.07.08