자바 10일차

김재현·2022년 8월 9일
0

Java

목록 보기
11/15

매개변수의 다형성

  • 참조변수의 다형적인 특징은 메서드의 매개변수에도 적용된다.

  • 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메서드와 디폴트 메서드는 예외이다.
  • 인터페이스에 정의된 모든 멤버에 적용되는 사항이기 때문에 제어자를 생략할 수 있는 것이며, 편의상 생략하는 경우가 많다.
    생략된 제어자는 컴파일 시에 컴파일러가 자동적으로 추가해준다.

0개의 댓글