inflearn

[인프런] 김영한의 자바 기본 강의 섹션11. 다형성2 (240115)

hail2y 2024. 1. 15. 20:18

오늘은 월요일인데 사실 지난 일요일까지 자바 기본 강의를 완강하고 싶었다.. 주말이니까 좀 쉬랴, 가족도 만나랴, 대외활동 자소서도 제출하랴 할일이 조금 있었지만 오늘은 끝낼 수 있겠지! 상속부터 다형성까지 되게 중요한 부분이라고 설명해 주셔서 어려울까 내심 걱정했지만 역시 갓영한님의 설명이 더해지니 이해가 쏙쏙 되었다. 덕분에 이해가 된단 즐거움에 신나서 강의를 들었다ㅎㅎ 강의는 두말 할 것 없이 명강의지만 다형성까지 듣고나니 스스로 코드를 많이 쳐보고 싶단 생각이 들었다. 이 기록물을 올린 후엔 얼마 남지 않은 강의를 마저 들어야겠지만 빨리 관련 예제들 찾아 코드로 쳐보고 싶다! 파이팅 해야지!

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 메서드를 구현할 수 있다.)

 

--끝--