Class and Interface
ParentClass 를 Child Class가 상속했다
(대우명제)
Parent Class의 어떤 속성을 가지지 않는다 -> Child Class가 아니다
논리학 시간 아님 주의
43.
Class and Interface
ParentClass 를 Child Class가 상속했다
=
Parent Class 의 모든 멤버변수와 메서드들을
Child Class가 가지고 있는 것으로 간주한다
예외는 없음
44.
Class and Interface
여기에서클래스 상속의 특징을 볼 수 있습니다
멤버변수, 메서드를 포함하여 Parent Class의 모든 요소를 Child Class에 강요
Override 하지 않는다는 전제하에 Parent Class의 메서드가
Child Class에서 완벽하게 동일한 방식으로 동작할 것임을 보장할 수 있음
설령 Overide 할지라도 메서드가 없는건 아니기 때문에 호출할때 에러가 나지 않습니다
45.
Class and Interface
여기에서클래스 상속의 특징을 볼 수 있습니다
종류란 일종의 갈래이기 때문에, Class의 상속인 extends는 반드시 1개일 수밖에 없습니다
만약 어떤 Child Class가 2개 이상의 Parent Class를 상속받아야 하는 상황이 온다면,
이는 처음부터 Super Class의 정의나 범위를 잘못 설정하였거나,
Super Class들 사이 차상위의 Super를 다시 정의할 수 있음을 암시하는 것으로 봐야합니다
46.
Class and Interface
여기에서클래스 상속의 특징을 볼 수 있습니다
마치 포유류가 어류일 수 없는 것처럼,
혹은 포유류와 어류의 상위에 척추동물이란 분류가 있는것처럼요
47.
Class and Interface
그럼Class의 extends는 언제 활용해야 할까요?
클래스 상속의 장점은 명확합니다.
Child Class에서 super 에 정의된 모든 변수들과
모든 메서드 들을 완벽하게 동일한 방식으로 사용할 수 있다는 것,
제네릭 클래스의 타입변수를 부모타입으로 선언했을 때 자식타입이 그 안에 들어갈 수 있다는 것
48.
Class and Interface
그럼Class의 extends는 언제 활용해야 할까요?
예를 들어 포유류는 항온동물이기때문에 정상체온이 존재하죠?
이걸 포유류.get정상체온() 이라는 메서드로 값을 조회할 수 있다고 할 때,
49.
Class and Interface
그럼Class의 extends는 언제 활용해야 할까요?
List<포유류> 동물들 = new ArrayList<>()
동물들.add(new 고래(향유고래))
Int 체온 = 동물들.get(0).get정상체온()
처럼 되어도 아무런 문제가 없다는 겁니다
50.
Class and Interface
그럼Class의 extends는 언제 활용해야 할까요?
하지만 사용하기 쉽지는 않습니다
Super Class의 멤버를 정할 때, 어떤 Child Class들이 상속하게 될지
충분히 고려해야 하므로 처음부터 관계를 세심하게 설계를 해야 합니다
아니면 정말 Super 한 Super가 되거나 난잡한 코드가 만들어질 수 있습니다
Class and Interface
여기에서인터페이스 구현의 특징을 볼 수 있습니다
벌써 인터페이스 상속이 클래스 상속과 대별되는 차이점 하나가 드러납니다
인터페이스는 동작, 즉 메서드 상속이 주를 이루며, 멤버변수 상속은 불가능합니다
다만 멤버상수를 가질수는 있죠
메서드도 INPUT과 OUTPUT이 있을 뿐, 내용은 상속받는 객체에서 구현해야 합니다
Class and Interface
여기에또 다른 인터페이스 구현의 특징이 있습니다
또 인터페이스는 클래스의 상속관계는 무관하게,
어디에든 해당 동작을 할수 있는 곳, 또는 해야만 하는 곳에,
‘해당 동작을 할수있다’를 만족하기 위한 최소의 정의사항을 전달합니다.
이 정의사항만 충실히 구현한다면, 그 객체는 그 동작을 할 수 있다고 봐도 무방하죠
66.
Class and Interface
여기에또 다른 인터페이스 구현의 특징이 있습니다
꿀벌은 박쥐같은 포유류도, 새같은 조류도 아니지만
역시 ‘비행’ 인터페이스에서 정의한 대로
파닥파닥( ) 을 정의할 수 있고
그렇기 때문에 꿀벌이란 객체는 날 수 있다는 보장을 받게 됩니다
67.
Class and Interface
인터페이스의구현에는 어떤 특징이 있을까요?
인터페이스는 클래스의 상속관계와 무관하게,
해당 기능이 필요한 곳이라면 어디든, 간단하게 모듈처럼 넣을 수 있습니다
심지어 갈매기에게 ‘비행’도 구현할 수 있지만,
‘보행’과 ‘수영’도 구현할 수 있는 것 처럼 다중 구현 역시 가능합니다
68.
Class and Interface
인터페이스의구현에는 어떤 특징이 있을까요?
다만 일종의 속성값으로서의 멤버 변수를 전달할 수 없다는 점,
인터페이스는 멤버로서 구현해야 메서드와 상수만을 전달할 수 있습니다
또 메서드의 실질적인 구현 책임은
해당 인터페이스를 구현하는 클래스에게 있습니다
69.
Class and Interface
인터페이스의구현에는 어떤 특징이 있을까요?
또한 인터페이스를 작성한다고 할 때,
반드시 해당 동작을 위한 최소한의 메서드만을 추출해야 합니다
그렇지 않다면 구현하는 객체에 따라 불필요한 오버라이딩이 생기겠지요
70.
Class and Interface
인터페이스는어디에 사용해야 좋을까요?
농담처럼 들리겠지만, 사실 인터페이스는
인터페이스를 구현하기에 가장 적합한 형태로 설계되었습니다
서로 상이한 시스템이 데이터를 주고받기 위한
최소한의 규약을 정의하기 좋은 형태로 만들어졌죠
71.
Class and Interface
인터페이스는어디에 사용해야 좋을까요?
이를테면 인터페이스에 필요한 API-KEY 등을 가지고 있기 위한
상수를 멤버변수로 가질 수 있는 등의 구조가 그렇습니다
굳이 메서드 오버라이드만 강제해야 하는 것이라면
멤버상수를 상속시키는 기능은 굳이 필요하지 않았겠죠
72.
Class and Interface
인터페이스는어디에 사용해야 좋을까요?
또한 필요한 곳이면 어디든 구현시킬 수 있다는
인터페이스의 장점을 활용한 사용법도 있습니다
아마 자바 개발자라면 남들이 만들어 놓은 코드에
~Impl.java 라는 클래스를 본 적이 있겠죠?
73.
Class and Interface
인터페이스는어디에 사용해야 좋을까요?
이는 인터페이스를 활용하여 구현체 클래스를 만들고
자바의 의존성주입을 활용하여 모듈처럼 활용하는 방법입니다
각 모듈들은 독립된 구현체이지만 명세를 공유하기 때문에
그 세부적인 내부 로직에 차이가 있더라도,
교환 내지는 대체가 용이한 구조로 만들어지게 됩니다
74.
Class and Interface
인터페이스는어디에 사용해야 좋을까요?
개발환경에서는 이 DB, 저 로직을 쓰고,
운영환경에서는 저 DB, 이 로직을 쓰는 것은 대개
같은 인터페이스를 구현했기 때문입니다
75.
Class and Interface
사실상속과 구현은, 설계없이 사용하기는 어렵습니다
클래스와 인터페이스,
상속과 구현을 받는 대상 객체들이 어떤 확장성을 가지고
어떤 역할을 하게 될지에 대한 진지한 고민이 필요합니다
76.
Class and Interface
상속과구현의 간단정리
클래스의 상속은 분류의 관점으로 보아야 합니다
(자바에서) 상속은 한개만 가능합니다
클래스와 Super의 관계는 속성의 추상화, 구체화의 관계입니다
인터페이스의 구현은 동작을 위한 최소기능의 관점으로 보아야 합니다
구현은 다중구현이 가능합니다
구현체와 인터페이스의 관계는 동작의 추상화, 구체화의 관계입니다