추상클래스 (Abstract Class)
· 추상 클래스(abstract class)는 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다.
· 추상 메소드는 선언만 있고, 선언부에 ‘abstract’ 라는 키워드를 붙인다.
· 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에 ‘abstract’ 키워드를 붙여야 한다.
· 추상 클래스는 다른 하위 클래스를 상속하기 위한 용도이다.
· 추상 클래스에서 매개변수 생성자 메소드가 필요한 이유는 추상 클래스는 하위 클래스에 상속을 목적으로 만들어진
클래스이기때문에, 하위 클래스에서 상위 클래스에 만들어둔 매개변수 생성자 메소드를 통하여 인스턴스 변수의 값을
초기화하기 때문이다.
· 추상 클래스는 미완성클래스이기때문에 인스턴스를 생성할 수 없다.
구상클래스 (Concrete Class)
· new 연산자를 사용하여 인스턴스를 생성할 수 있는 클래스를 Concrete(구상) 클래스라고 한다.
· 미완성클래스인 추상클래스에 정의된 기능을 구현하는 클래스이다.
인터페이스 (Interface)
· 클래스의 공통된 기능을 정리한 명세서이다.
· 모든 기능을 추상화로 정의만 하고 구현은 하지 않은것이다.(100% 추상 메소드)
· 추상클래스와의 차이점은 추상클래스는 IS - A "~이다"이고, 인터페이스는 HAS - A "~을 할 수 있는"의 의미를 가지고
있다. 이 말이 굉장히 중요한데, 추상클래스는 클래스이기때문에 상속을 한번만 하며, 상속을 통해 서브클래스에서 구현을
완성하기 위한 클래스이지만, 인터페이스도 구상클래스를 생성하여 상속을 하는것까지는 동일하지만 인터페이스의 특성상
다중상속도 가능하다는 점에서 차이를 보인다.
인터페이스 (interface)를 사용하는 이유?
1. 협업을 할때 미리 인터페이스를 작성함으로써 메소드를 정할 수 있다.
2. 클래스간 결합도(코드 종속성)를 낮춘 유연한 방식의 프로그래밍이 가능해진다.
3. 자바에서는 다중 상속을 구현하기 위해서 사용한다.
4. 기능과 구현의 분리를 하기위해 사용한다.**
객체 지향 설계 방법론
· 응집도 ↑(하나의 메소드에는 하나의 기능을 구현한다.), 결합도 ↓(각각의 클래스가 독립적인 관계가 아니라 코드간 종속
관계를 말한다.)
· 인터페이스로 기능과 구현을 분리하는 이유는 클래스의 변경이 있을 때, 클래스를 호출한 곳에서 변경을 최소화할 수 있는
유연한 프로그래밍을 할 수 있다.
Generlization(일반화)
슈퍼클래스와 서브클래스간의 Inheritance(상속) 관계를 나타낸다. 여기서 Generalization이란 서브 클래스가 주체가되어
서브 클래스를 슈퍼 클래스로 Generalization 하는 것을 말하고 반대의 개념은 슈퍼 클래스를 서브 클래스로 Specialize
(구체화)하는 것이다. 상속은 슈퍼 클래스의 필드 및 메소드를 사용하며 구체화하여 필드 및 메소드를 추가하거나 필요에
따라 메소드를 overriding(오버라이딩)하여 메소드 재정의를 한다. 또는 슈퍼클래스가 추상클래스인 경우에는 인터페이스의
메소드 구현과 같이 추상 메소드를 반드시 오버라이딩 하여 구현해야한다.
Realization 관계
· 인터페이스의 Spec(명세, 정의) 만 있는 메소드를 오버라이딩하여 실제 기능으로 구현하는 것을 말한다.
· IS-A 관계와 달리 Realization 관계는 서로 관련성 없는 클래스 간에도 공통된 기능을 구현할 수 있다.
Dependency(의존)
Dependency는 클래스 다이어그램에서 일반적으로 제일 많이 사용되는 관계로서, 어떤 클래스가 다른 클래스를 참조하는 것
을 말한다.
인터페이스 (interface) 문법
접근제어자 interface 인터페이스이름 {
public [abstract] 리턴타입 메소드이름 ( 매개변수목록 );
}
인터페이스 (interface) 를 예제를 통해 이해해보자.
· 인터페이스의 특징 중 하나인 인터페이스는 기능을 구현하는 클래스가 아닌 정의만 곳이기때문에 인스턴스를 생성 할 수
없다.
· 서브 클래스는 슈퍼 클래스인 인터페이스에 정의된 turnUp 메소드와 turnDown 메소드를 오버라이딩(메소드재정의)을
해야 에러가 사라진다.
1. TV 구상 클래스는 슈퍼 클래스인 Volume 인터페이스를 상속받는다.
2. 서브클래스인 TV 클래스는 슈퍼클래스에서 정의한 메소드를 오버라이딩(메소드 재정의) 해야한다.
3. main() 메소드 안에서 인스턴스를 생성 후 주소값을 통해 슈퍼클래스의 메소드를 호출하여 정보를 출력한다.
1. Radio 구상 클래스는 슈퍼 클래스인 Volume 인터페이스를 상속받는다.
2. 서브클래스인 Radio 클래스는 슈퍼클래스에서 정의한 메소드를 오버라이딩(메소드 재정의) 해야한다.
3. main() 메소드 안에서 인스턴스를 생성 후 주소값을 통해 슈퍼클래스의 메소드를 호출하여 정보를 출력한다.
인터페이스 (interface)간의 상속
인터페이스 (interface) 상속 문법
인터페이스 (interface)간의 상속을 예제를 통해 이해해보자.
1. AdvancedVolume 인터페이스는 최상위 인터페이스인 Volume 인터페이스를 상속받는다.
2. 소리를 키는 기능과 소리를 끄는 기능을 정의한다.
1. AdvancedVolume 인터페이스를 상속받는 TV 클래스를 생성한다.
2. 에러가나는 이유는 위에서 여러번 보았던것과같이 인터페이스의
기능을 구현하는 구상클래스는 반드시 상속하는 인터페이스의 기능을 메소드 오버라이딩(메소드 재정의)을 해야하기때문이다.
· AdvancedVolume 인터페이스에서 정의한 소리를 키는 기능과 소리를 끄는 기능을 메소드 오버라이딩(메소드 재정의) 해야한다.
· 마찬가지로 AdvancedVolume 인터페이스를 상속받는 Radio 클래스는 메소드 오버라이딩을 해야한다.
1. Test를 할 수 있는 클래스를 생성하여 인스턴스를 생성한다.
2. 각 인스턴스의 정보를 가리키는 주소값을 가진 변수 obj1과 obj2를 통해 메소드 오버라이딩된 메소드를 호출한다.
3. 구상클래스인 TV 클래스와 Radio 클래스는 이를 통해 인터페이스 상속받으며 기능이 구현하여 사용할 수 있다는 사실을 알고
넘어가자.
Volume interface (최상위 인터페이스)와 AdvancedVolume interface (서브 인터페이스)의 차이는 무엇일까?
Volume v1 = null;
AdvancedVolume v2 = null;
1. v1과 v2는 참조할 수 있는 메소드 유형이 다르다.
2. v1은 볼륨을 높이는 메소드와 볼륨을 낮추는 메소드, 즉 2가지의 메소드밖에 사용할 수 없다.
3. v2는 볼륨을 키는 메소드와 볼륨을 끄는 메소드뿐만 아니라 Volume (interface)을 상속을 받고있기때문에 볼륨을 높이는 메소드와 볼륨을 낮추는 메소드까지 사용할 수 있다.