인터페이스와 다형성
학습 목표
- final과 static 제한자를 사용해 프로그래밍 할 수 있다.
- This를 사용해 프로그래밍 할 수 있다.
- 추상 클래스(abstract class)와 추상 메소드(abstract method)에 대해 설명할 수 있다.
- 인터페이스(interface)의 정의, 구현, 상속에 대해 설명할 수 있다.
- 다형성(polymorphism)에 대해 설명할 수 있다.
- 클래스와 오브젝트를 응용해 사용할 수 있다.
학습 내용
final과 static 제한자
final 제한자
final을 필드에 붙이면 필드는 값을 변경할 수 없음
final을 클래스에 붙이면 상속을 할 수 없음
해당 코드는 final 컴파일 에러가 발생한다. final Animal 클래스를 상속하려 했고 final int a의 값을 변경하려 했기 때문에 에러가 발생한다.

static 제한자
static은 필드와 메소드에 붙이는 제한자를 뜻함
같은 클래스에서 생성된 오브젝트들은 static을 붙인 필드의 값을 공유함
stacic int a는 필드의 값을 공유함으로 a1.a의 값과 a2.a의 값은 모두 50이 된다.


어떤 오브젝트에서도 같은 동작을 하는 메소드에서는 static 키워드를 붙여주는 것이 좋음
static 메소드는 오버라이딩 할 수 없음
static 메소드는 동일한 오브젝드 내의 필드를 이용하기 위해서는 필드에도 static을 붙여야 함
int b에 스테틱 제한자를 사용해 필드 사용이 가능하도록 했다.


static을 붙인 멤버는 오브젝트를 생성하지 않고도 사용할 수 있음
이 때, 다른 오브젝트에서 참조하기 위해서는 오브젝트 이름이 아닌 클래스 이름을 지정함.


B.get 또한 접근할 수 있는 모습. 마치 파이썬의 def 함수와 비슷한 것 같다.
static 응용


여기서 money라는 필드는 공유됨으로


새로운 객체 a1 의 money 값도 함께 연산됨을 알 수 있다.
this의 사용
this는 기술된 어브젝트 그 자체를 가리킴
오브젝트 내의 필드와 메소드는 필드 이름, 메소드 이름만으로 이용할 수 있지만, 그 앞에는 this라는 키워드를 붙힘
this는 생략해도 되기 때문에 일반적으로 사용하지 않음


man을 선언함과 동시에 name과 age를 할당해주는 모습
클래스의 필드(맴버 변수)이름과 메소드의 인수 이름이 동일할 경우 멤버 변수 앞에 this를 붙여서 구별해야 함

굳이 권장되지는 않는 방식인 것 같다.
추상 클래스(abstract class)와 추상 메소드(abstract method)
- 추상 글래스
- 오브젝트가 가지는 특성을 추상화 시켜 놓았을 뿐 아직 구체화 시키지 못한 클래스
- 추상 메소드
- 처리 내용을 기술하지 않고, 호출하는 방법(프로토타입: prototype)만을 정의한 메소드
추상 메소드를 갖는 클래스는 반드시 추상 클래스로 지정되어야 함
추상 클래스는 미완성이므로 오브젝트를 생성시킬 수 없고, 반드시 서브 클래스로 상속시킨 후 구체적인 메소드를 구현해서 사용함
마치 설계도의 초안과 비슷한 개념인 것 같다.



인터페이스(interface)의 정의와 구현
인터페이스의 개념
상속관계와 비슷하지만 클래스에 추상화된 기능을 제공하는 구조
- 기존 설계된 클래스에는 없는 동작(메소드)을 하도록 메소드의 원시 형태(메소드명, 입출력형식)를 지정함(추상 메소드로 구현)
- 클래스와는 다르게 final 변수(필드)와 추상 메소드만이 멤버가 될 수 있음
- 인터페이스의 모든 변수(필드)와 메소드는 public 접근제한을 지정함
- 클래스에서 인터페이스를 이용하도록 하게 하는 것을 인터페이스의 구현이라고 함
- 서로 다른 성격의 클래스에 공통적인 속성이나 기능을 인터페이스에 정의하고 각각의 클래스에 인터페이스를 구현하고 메소드를 오버라이딩해서 사용함(추상 클래스는 같은 성격의 클래스에게 상속)
건담 조립하듯이 추상 메소드와 필드값을 클래스에 제공하는 기능인듯 하다
인터페이스의 정의와 구현
인터페이스를 구현하기 위해서는 클래스 이름 다음에 implements 키워드와 인터페이스 이름을 붙임
인터페이스의 필드(멤버 변수)는 final을 생략해도 final 처리되고, 메소드의 abstract를 생략해도 abstract로 처리됨


다중 인터페이스 구현
여러 인터페이스를 하나의 클래스에 구현할 수 있음
Implements 뒤에 인터페이스 명은 ,(쉼표)로 구분지어 나열함
class X에 IA, IB, IC를 implements 해준다.

프로그램을 실행 시키면

성공적으로 오버라이딩, 실행이 되는 모습

클래스와 유사하게 인터페이스는 다른 인터페이스에 상속할 수 있음.
인터페이스는 다중 상속이 가능.
주로 필드값과 추상 메소드를 상속시키는 듯 하다.

필드값과 추상 메소드를 상속한 interface Xx를 구현했다.

interface Xx를 implements 한 class CX를 생성

class CX로 생성한 객체 ox는 interface Xx의 값을 모두 갖게 된다.

하나의 클래스가 다른 클래스로부터 상속도 받고 인터페이스를 구현하는 경우 다음과 같이 정의함

Greet class와 Bye interface를 구현한 class Greeting을 생성했다.


다형성1
오브젝트의 다형성
다형성은 같은 연산 기능이 부여되더라도 그 기능을 수행하는 클래스에 따라 다른 행위로 나타날 수 있는 개념
상속한 클래스의 오브젝트는 슈퍼 클래스로도 서브 클래스를 다룰 수 있음
하나의 오브젝트와 메소드가 많은 형태를 가질 수 있음
다형성 개념을 추상화와 상속으로 구현됨
슈퍼 클래스로 오브젝트 대입하기
서브 클래스의 오브젝트는 슈퍼 클래스의 오브젝트에 대입할 수 있음
슈퍼 클래스의 오브젝ㅌ트는 서브 클래스의 오브젝트에 대입할 수 없음



다형성2
슈퍼클래스의 오브젝트 생성
슈퍼클래스 오브젝트에 서브클래스 생성자를 사용할 수 있음
“new 서브클래스의 생성자”로 부터 만들어진 (서브클래스의)오브젝트를 “슈퍼클래스 오브젝트” 에 대입하는 것과 유사함(실제 서브클래스의 오브젝트는 없음)
서브클래스 오브젝트를 생성할 때는 서브클래스의 생성자와 슈퍼클래스의 생성자가 모두 실행됨
반대로, “new 슈퍼클래스의 생성자”로부터 만들어진 오브젝트를 “서브클래스 오브젝트명”에 지정할 수 없음
서브클래스의 오브젝트에 지정하기 위해서는 서브클래스의 생성자와 슈퍼클래스의 생성자가 모두 실행되어야 하는데, 슈퍼클래스 생성자만 실행되기 때문임


메소드 인수로서 슈퍼클래스 오브젝트와 서브클래스 오브젝트
슈퍼클래스의 오브젝트를 인수로 하는 메소드에서 서브클래스의 오브젝트를 대신 전달할 수 있음
반대로 서브 클래스의 오브젝트를 인수로 하는 메소드에서 슈퍼 클래스의 오브젝트를 대신 전달할 수 없음
동일 이름의 메소드가 오버로딩 되있으면 인수 형식에 따른 메소드가 호출됨



클래스와 오브젝트의 응용
Object 클래스
- 여러 클래스의 공통된 특성(공통 필드, 메소드)을 추출해서 만들어 놓은 모든 클래스의 최상위에 있는 슈퍼 클래스
다른 모든 클래스들은 Object 클래스를 상속받도록 만들어져 있음
Object 를 제외한 자바의 모든 클래스는 직접 또는 간접적으로 Object의 자식 클래스가 됨
어떤 클래스의 오브젝트도 Object 클래스의 오브젝트로 다루어 질 수 있음
toString, equals, clone, finalize, getClass 등이 이에 해당됨
instanceof와 클래스
instanceof는 오브젝트가 지정한 클래스의 오브젝트인지를 조사하기 위한 연산자임
하나의 오브젝트가 어느 서브 클래스의 오브젝트이면 그 클래스의 슈퍼클래스와도 instanceof 연산을 적용했을때 true이기도 함