일반화 및 다형성

개념

Posted by Damin on September 11, 2019

일반화

“여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정”

바나나, 사과, 배, 오렌지 -> 과일

과일 = 바나나, 사과, 배, 오렌지를 일반화 한 것이다.

역은 특수화!!

그림2-8</br>

이 그림에서 부모 클래스는 A, 자식 클래스는 A1,A2,A3

이때! 다음 관계가 성립해야 한다.

일반화</br>

제약 조건

그림2-9</br>

  • disjoint

-> 자식 클래스 객체가 동시에 두 클래스에 속할 수 없다.

  • complete

-> 자식 클래스의 객체에 해당하는 부모 클래스의 객체와 부모 클래스의객체에 해당하는 자식 클래스의 객체가 하나만 존재햐아 한다.

그림2-10</br>

각 회원들은 VIP, 일반 회원 상관없이 Item(물품)을 구입할 수 있다.

이때 연관관계를 각 등급의 회원들로 하는것이 아닌, 그 둘의 부모 클래스인 member로 표현하는 것이 더 깔끔하다.

그림2-11</br>

학생이 있다고 하자.

학생은 놀기(playing) or 공부하기(studying) 상태만 있다고 가정하자.

놀기 = toy

공부하기 = book

상태에 따라서 연관관계가 달라진다.

만약 둘의 상태가 없고 student에 book과 toy가 연결되어 있다면 혼란이 올 수 있다.

따라서, 명확하게 분할해야 한다.

다중 분류

앞서 봤던 그림 2-10에서 member에는 구매액으로만 나누는 것이 아닌, 지역별로도 나눌 수 있다.

이렇게 되면, 회원은 vip이면서 지역사람이 될 수 있다.

이것이 바로 다중 분류 이다.

한 인스턴스가 동시에 여러 클래스에 속함

다형성

“서로 다른 클래스의 객체가 같은 메세지를 받았을 때 각자의 방식으로 동작하는 능력

Speak!!! 고양이 -> 야옹, 강아지 -> 멍멍

다형성이 없다면 각 동물들(class)마다 개별적으로 불러줘야 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class Pet{
  public abstract void talk();
}

public class Cat extends Pet{
  public void talk(){
    System.out.println("야옹");
  }
}

public class Dog extends Pet{
  public void talk(){
    System.out.println("멍멍");
  }
}

public class Parrot extends Pet{
  public void talk(){
    System.out.println("안녕");
  }
}

이 상태에서

1
Pet p = new Parrot();

을 실행한다면?

P는 Parrot 클래스의 객체를 참조한다.

이게 바로 ‘다형성’

Typecastring

자식 클래스 -> 부모 클래스 Typecasting 가능

Pet p = new Parrot(); -> o

자식 클래스 -> 자식 클래스 Typecasting 불가능

Cat c = new Dog(); -> x

정적 메서드(static)는 상속을 통해 override되지 않는다.

정적 메서드를 실행할 때 동적 바인딩을 실행 x

컴파일할 때 결정된 객체의 타입에 따라 실행될 메서드 결정.