매개변수의 다형성
- 참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.
- Tv와 Computer클래스는 Product클래스를 상속받고 있다.
Buyer클래스는 구매자를 표현한 것이며, Buyer클래스에 물건을 구입하는 기능의 메서드를 추가해보자.
- 이렇게되면, 제품의 종류가 늘어날 때마다 Buyer클래스에는 새로운 buy 메서드를 추가해주어야 할 것이다.
그러나 메서드의 매개변수에 다형성을 적용하면 아래와 같이 하나의 메서드로 간단히 처리할 수 있다.
- 매개변수가 Product타입의 참조변수라는 것은, 메서드의 매개변수로 Product클래스의 자식 타입의 참조변수면 어느 것이나 매개변수로 받아들일 수 있다는 뜻이다.
또한 Product 클래스에 price와 bonusPoint가 선언되어 있기에, 참조변수 p로 인스턴스의 price와 bonusPoint를 사용할 수 있기에 이와 같이 할 수 있다.
- 다른 제품 클래스를 추가할 때 Product를 상속받기만 하면,
buy(Product p)
메서드의 매개변수로 받아들여질 수 있다.
추상클래스 (abstract class)
- 클래스가 설계도라면, 추상클래스는 미완성 설계도라 할 수 있다.
미완성 메서드(추상 메서드)를 포함하고 있다는 의미.
- 추상 클래스는 인스턴스를 생성할 수 없다. 추상클래스는 상속을 통해 자식클래스에 의해서만 완성될 수 있다.
추상 클래스 : 미완성 설계도, 인스턴스 생성불가.
미완성 메서드(추상메서드)를 포함하고 있는 클래스
- 추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는데 있어서 바탕이 되는 부모 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무 것도 없는 상태에서 시작하는 것보다, 완전하지는 못해도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 낫기 때문이다.
- 서로 다른 세 제품의 설계도를 따로 그리는 것보다 이들의 공통부분을 그린 미완성 설계도를 만들고, 이 미완성 설계도를 이용해 각각의 설계도를 완성하는 것이 더 효율적인 이유와 같다.
- 추상클래스는 키워드 'abstract'를 붙이기만 하면 된다. 이렇게 함으로 이 클래스를 사용할 때, 클래스 선언부의 abstract를 보고 클래스에 추상메서드가 있으니 상속을 통해 구현해주어야 한다는 것을 쉽게 알 수 있다.
abstract class 클래스이름 {
}
- 추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하면 일반 클래스와 같다. 생성자가 있고, 멤버변수와 메서드도 가질 수 있다.
추상 메서드 (abstract method)
- 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 것이 추상메서드.
설계만 해놓고 실제 수행될 내용은 작성하지 않은 것.
- 부모 클래스에서 선언부만 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워둔다. 추상클래스를 상속받는 자식 클래스는 부모의 추상메서드를 상황에 맞게 적절히 구현해주어야 한다.
- 추상메서드 역시 키워드 'abstract'를 앞에 붙여주고, 추상메서드는 구현부가 없으므로
{}
대신 ;
을 붙여준다.
/ 주석을 통해 어떤 기느을 수행할 목적으로 작성되었는지 설명/
abstract 리턴타입 메서드이름 ;
- 추상클래스로부터 상속받는 자식클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해야한다. 만일 그렇지 않다면, 자식클래스 역시 추상클래스로 지정해주어야 한다.
-
AbstreactPlayer
은 추상클래스인 Player
을 상속받았고, 추상메서드인 play
를 구현했지만, 모두 구현하지는 않았기 때문에 추상클래스이다.
반면 AudioPlayer은 모든 추상메서드를 구현하였기 때문에 일반 클래스이다.
-
메서드를 작성할 때 작업내용인 구현부보다 더 중요한 부분이 선언부이다.
메서드를 사용하는 쪽에서는 메서드가 실제로 어떻게 구현되어있는지 몰라도, 메서드의 이름과 매개변수, 리턴타입 등 선언부만 알고 있으면 되므로 내용이 없을지라도 추상메서드를 사용하는 코드를 작성하는 것이 가능하며, 실제로 자식클래스에 구현된 완성된 메서드가 호출되도록 할 수 있다.
추상클래스의 작성
- 여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아 추상클래스로 만들어 상속하도록 하는 경우도 있다.
추상(抽象) : 낱낱의 구체적 표상(表象)이나 개념에서 공통된 성지릉ㄹ 뽑아 이를 일반적인 개념으로 파악하는 정신 작용.
- 상속이 자식클래스를 만드는데 부모 클래스를 사용하는 것이라면,
추상화는 기존의 클래스의 공통부분을 뽑아 부모 클래스를 만드는 것.
- 추상화를 구체화와 반대되는 의미로 이해하면 보다 쉽게 이해할 수 있다. 상속계층도를 따라 올라갈수록 클래스는 추상화의 정도가 심해진다. 내려갈수록 세분화되고, 올라갈수록 공통요소만 남는다.
인터페이스
- 일종의 추상클래스.
추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는, 멤버변수를 구성원으로 가질 수 없다.
- 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용하지 않는다.
- 클래스를 '설계도', 추상클래스를 '미완성 설계도'라 한다면, 인터페이스는 '기본설계도'라 할 수 있다.
- 인터페이스 역시 불완전한 것이기 때문에, 다른 클래스를 작성하는데 도움을 줄 목적으로 작성된다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수목록);
}
- 인터페이스를 작성할 때는 키워드로
interface
를 사용한다. interface에서는 접근제어자로 public
또는 default
만 사용할 수 있다.
- 일반적인 클래스와 달리 인터페이스의 멤버들은 다음과 같은 제약이 있다.
- 모든 멤버변수는
public static final
이여야하며, 이를 생략할 수 있다.
- 모든 메서드는
public abstract
이여야하며, 이를 생략할 수 있다.
단, static
메서드와 디폴트 메서드는 예외이다.
- 인터페이스에 정의된 모든 멤버에 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많다.
생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해준다.