오늘은 월요일인데 사실 지난 일요일까지 자바 기본 강의를 완강하고 싶었다.. 주말이니까 좀 쉬랴, 가족도 만나랴, 대외활동 자소서도 제출하랴 할일이 조금 있었지만 오늘은 끝낼 수 있겠지! 상속부터 다형성까지 되게 중요한 부분이라고 설명해 주셔서 어려울까 내심 걱정했지만 역시 갓영한님의 설명이 더해지니 이해가 쏙쏙 되었다. 덕분에 이해가 된단 즐거움에 신나서 강의를 들었다ㅎㅎ 강의는 두말 할 것 없이 명강의지만 다형성까지 듣고나니 스스로 코드를 많이 쳐보고 싶단 생각이 들었다. 이 기록물을 올린 후엔 얼마 남지 않은 강의를 마저 들어야겠지만 빨리 관련 예제들 찾아 코드로 쳐보고 싶다! 파이팅 해야지!
1/15 섹션11 다형성2 필기
dog, cat, cow는 서로 다른 타입이기 때문에 메서드나 배열+for문으로 최적화하기에는 어려움이 있다. 이 말을 반대로 얘기하면 같은 타입인 경우 메서드나 배열 for문으로 활용할 수 있다는 애기가 된다.
- 이 경우 다형성으로 접근하는데, 상속 관계를 이용한다.
- Animal이란 하나의 부모 타입에 dog, cat, cow를 대입한다. - (다형적 참조)
Dog dog = new Dog(); // Animal dog = new Dog();
Cat cat = new Cat(); // Animal cat = new Cat();
Cow cow = new Cow(); // Animal cow = new Cow();
Animal[] animalArr = {dog, cat, cow};
// Animal index1 = dog;
// Animal index2 = cat;
// Animal index3 = cow;
배열은 같은 타입의 데이터를 나열할 수 있다. 이때 dog, cat, cow는 모두 Animal의 자식이므로 Animal 타입으로 묶어서 배열로 표현할 수 있다.
치트키 등장!
- inline Variable 객체 변수로 선언된 것을 지우고 한번에 처리해 준다. - ctrl alt n
Animal[] animalArr = {new Dog(), new Cat(), new Cow()};
- 메서드 추출 단축키 ctrl alt m
이 코드가 좋은 코드인가를 살펴볼 때는
하나의 변경사항이 발생했을 때 어디까지 코드를 바꿔야 하는지로 점검해 볼 수 있다.
Animal 클래스는 추상적인 개념을 위한 것이지, 실제로 존재하는 것은 이상하다. 즉, 다형성을 위해 필요한 것이지 직접 인스턴스를 생성해서 사용할 일은 없다. abstract 키워드를 사용하지 않음에 따라 발생하는 문제점은,
-1. Animal 클래스를 생성할 수 있는 문제 발생
-2. Animal 클래스를 상속받는 곳에서 특정 메서드를 깜빡 잊고 오버라이딩 하지 않을 가능성 존재
추상 클래스
부모 클래스는 제공하지만 실제 생성되면 안 되는 클래스
- 추상적인 개념을 제공하는 클래스
- 실체인 인스턴스는 존재하지 않는다
- 상속을 목적으로 사용되고 부모 클래스 역할을 담당한다
추상 메서드
부모 클래스를 상속 받는 자식 클래스가 반드시 오버라이딩 해야 하는 메서드를 정의한다
- 추상 메서드는 반드시 오버라이딩 해야 한다.
- 메서드 바디가 없다. -- 불완전한 클래스로 볼 수 있기에 직접 생성하지 못하도록 추상 클래스로 선언해야 한다.
- 추상 메서드가 하나라도 있다면 추상 클래스로 선언해야 한다.
- 오버라이딩을 하지 않는다면 자식도 추상 클래스가 되어야 한다.
순수 추상 클래스 = 인터페이스
모든 메서드가 추상 메서드
- 실행 로직을 전혀 가지고 있지 않1.다.
- 단지 다형성을 위한 부모 타입으로서 껍데기 역할만 제공할 뿐이다.
- 마치 어떤 규격을 지켜서 구현해야 하는 것처럼 되어 있다.
자바에서는 '순수 추상 클래스'라는 용어 대신에 인터페이스 개념을 제공한다. 이 개념은 프로그래밍에서 매우 자주 사용되며 순수 추상 클래스를 더 편리하게 사용할 수 있도록 편의기능만 추가된 형태이다.
- public abstract를 생략할 수 있다. (자동으로 넣어준다.)
- 다중 구현(다중 상속)을 지원한다.
- 멤버변수는 public static final이 모두 포함되었다고 간주해서 키워드를 생략해 준다.
cf. static final 상수로서 대문자와 언더스코어로 표현한다.
클래스 | 인터페이스 | |
용어 | 상속 | 구현 |
키워드 | extends + (하나의 대상) | implements + (무한 개의 대상), ... |
상속관계 표현 방법 | 실선 | 점선 |
부모 개수 | 단일 상속 | 다중 구현 허용 |
** 클래스, 추상 클래스, 인터페이스는 프로그램 코드, 메모리 구조상 모두 똑같다.
1. 제약 제공
- 순수 추상 클래스의 경우, 미래에 실행 가능한 메서드를 끼워넣을 수 있다. 자식클래스에서 추가된 기능을 구현하지 않을 수도 있고 더는 순수 추상 클래스가 되지 않는다. 하지만 인터페이스는 모든 메서드가 추상 메서드이다. 강한 제약을 제공함으로써 이런 문제를 원천 차단할 수 있다.
2. 다중 구현 허용
-인터페이스는 부모를 여러 명 두는 다중 구현(다중 상속)이 가능하다. 즉 다이아몬드 문제가 발생하지 않는다.
두 부모 중 어느 한쪽의 특정 메서드를 호출하는 것이 아니라, 오버라이딩에 의해 무조건 child에 있는 것이 실행된다.
같은 이름의 메서드의 경우 양쪽 인터페이스에 다 있지만 구현은 하나만 하면 된다.
(+ 자바8 - default 메서드를 사용하면 인터페이스도 메서드를 구현할 수 있다.
자바9 - private 메서드를 구현할 수 있다.)
--끝--
'inflearn' 카테고리의 다른 글
[인프런] 김영한의 자바 기본 강의 섹션13. 다음으로 (240117) (0) | 2024.01.17 |
---|---|
[인프런] 김영한의 자바 기본 강의 섹션12. 다형성과 설계 (240117) (0) | 2024.01.17 |
[인프런] 김영한의 자바 기본 강의 섹션10. 다형성1 (240113) (1) | 2024.01.14 |
[인프런] 김영한의 자바 기본 강의 섹션9. 상속 (240112) (0) | 2024.01.12 |
[인프런] 김영한의 자바 기본 강의 섹션8. final (240111) (1) | 2024.01.11 |