객체의 상속 관계를 알고 넘어간 지난 시간에 이어 오늘은 '다형성(polumorphism)'에 대해 배웠다. 일단 다형성이 무엇인가에 대한 이야기는 나중으로 미루도록 하고 예제를 보며 설명을 하도록 하겠다.
Lion, Rabbit, Monkey라는 클래스가 Animal이라는 클래스를 상속받은 채 각자 메서드를 가지고 있다. 우리는 이를 main() 영역에서 어떠한 함수를 실행시킬 때마다 해당 동물에게 먹이를 준다는 문구를 작성하고 싶은데 각 객체를 불러오는 과정에서 데이터타입(클래스명)을 입력하다 보니 오버로딩으로 매개변수 타입만 바꾼 함수 세 개를 작성하게 되었다. 불러 올 이름만 다를 뿐 내용은 똑같은데도 같은 내용을 세번이나 쓴 격이다. 지금이야 3개지만 다른 동물이 들어올 때마다 해당 함수가 또 늘어나야 할 텐데 과연 이같은 방법 뿐일까?
그래서 우리는 다형성이라는 것을 배웠다. 이론적으로 본다면 어렵게 되어있었지만 실습을 통해 풀어가자 그 사이의 규칙만 이해한다면 충분히 납득할 수 있는 내용이었다.
A obj = new A();
기존 객체를 구현할 때 쓰는 참조변수 선언 방식이다.
참조변수(obj) 앞에 데이터 타입(클래스명)이 따라오고 대입연산자 뒤로는 new 생성자()를 사용하는 방식
A obj = new B();
다형성을 이용한 객체 생성 방식이다.
이것은 B라는 클래스가 A클래스를 부모로 삼았을 경우에만 가능하다. (extends)
기존에는 데이터 타입 자리에 오는 클래스명과 생성자의 클래스명이 일치해야지만 객체 생성이 가능하다고 알고 있었다. 하지만 상속을 배우고, 부모를 가진 클래스는 부모타입의 참조변수에 담길 수 있는데 이것을 다형성이라고 한다. 위에서 B라는 클래스가 A라는 클래스를 상속받았을 경우, B클래스를 생성하게 되면 A클래스가 자동으로 만들어진다.(A가 기본 생성자만 있는 경우) 이는 B의 생성자 안에 A생성자가 포함된 구조를 가졌기 때문인데, 이렇게 되면 B클래스는 A클래스의 주소를 가지고 있다는 뜻이 되며 이는 곧 A타입의 참조변수에 접속할 수 있다는 뜻이 된다. 하지만 반대로 B타입에 A생성자를 담게되면 어떻게 될까, 당연히 되지 않는다. 부모인 A클래스에는 B라는 생성자를 가지고 있지 않기 때문이다.
다만 B클래스를 A타입에 담았다고 해서 B객체가 원래 지니고 있는 변수나 함수를 불러올 수 있는 건 당연히 아니다. A타입의 참조변수에 담기기 위해서 B가 가지고 있는 A주소를 가져갔기 때문인데 A에서는 B클래스에 접속할 수 없기 때문이다. 그렇다면 굳이 이런 번거로운 방법을 써야하는 이유가 있을까? 그 해답이 바로 처음 나온 예제에 있다.
처음 예제에 있던 각각 지정해주었던 부분을, 공통적으로 상속 받았던 Animal로 바꾸어 객체를 선언하고 매개변수를 받음으로써, 함수가 하나지만 각각 실행되어 콘솔창에 나타나게 된다. 하지만 아까는 분명 부모요소가 자식요소가 가지고 있는 변수나 함수는 불러오지 못한다고 하지 않았던가? 그 중, 예외가 있는데 그게 바로 '오버라이딩 된 함수' 이다. 자식이 부모가 가진 함수를 재사용하여 내용을 바꿨을 경우, 부모로 객체를 만들어도 부모가 가진 함수가 아니라 자식이 바꿔둔 함수가 출력되게 된다. 물론 그러기 위해서는 오버라이딩을 할 수 있도록 부모도 자식과 똑같은 이름의 함수를 가지고 있어야한다.
하지만 예제를 확인해보면 Animal이라는 클래스에는 생성자 외의 함수는 존재하지 않는다. 그렇다면 함수를 찾을 수 없다는 에러가 뜨는 것이 정상이지 않을까? 일단 동물들이 가진 함수에 대해 다시 자세히 살펴보도록 하자.
toString, 사용자가 직접 입력한 메서드명이 아니라 기존 Object가 가지고 있는 메서드였다. 여기서 Object란 모든 클래스의 조상이 되는 객체인데, 만약 아무 상속도 받지 않은 클래스가 존재할 경우 자동으로 상속받는 클래스이다. 고로, 아무런 상속도 받지 않은 Animal은 자동적으로 Object를 상속받게 되는 것이고 Animal을 상속 받은 다른 동물 클래스들은 자동으로 Object가 가지고 있는 메서드에 접근 할 수 있었던 것이다.
'아이티에듀넷' 카테고리의 다른 글
2024-09-20 :: 040 인터페이스와 예외 처리 (0) | 2024.09.20 |
---|---|
2024-09-19 :: 039 함수 정리하기 (0) | 2024.09.19 |
2024-09-12 :: 037 객체의 상속 (0) | 2024.09.12 |
2024-09-11 :: 036 String에 관하여 (0) | 2024.09.11 |
2024-09-10 :: 035 생성자 (0) | 2024.09.10 |