자바를 배우기 전에 HTML을 잠깐 했었는데, 그 때마다 태그에 관해서 부모와 자식이라는 단어를 많이 사용했었다. 처음엔 이해하기 쉬우라고 예를 들어 설명하는 줄 알았지만 지금까지 배워오니 그 관계를 깨닫는 것이 얼마나 중요한 부분인지를 알게 되었다. 여기서 상속이란, 부모가 자식에게 넘겨주는 그 상속을 일컫는 것이 맞다. 부모가 가지고 있는 기존의 코드나 변수를 그대로 물려줌으로써 불필요한 중복을 피하고, 코드문을 간결하게 만들 수 있다. 여기서 상속을 받는 클래스는 자식 클래스가 되며, 물려주는 클래스는 부모 혹은 조상 클래스가 된다.
클래스를 생성할 때 extends를 사용하여 상속을 할 수 있다. (단, 한 번의 상속만 가능하다. 다중상속 X)
class (자식이 될 클래스 명) extends (부모가 될 클래스 명) { }
Student 클래스와 Teacher 클래스에 exam_40_per 클래스를 상속하자, 메인 함수에서 불러올 때 자식의 참조변수를 통해 불러냈음에도 부모요소가 가지고 있던 함수의 값이 그대로 출력되었다. 부모가 가지고 있는 변수와 함수 모두 자식이 사용할 수 있도록 상속이 일어난 것이다. 하지만 반대의 경우는 호출할 수 없다, 부모는 자식이 가진 함수나 변수를 사용할 수 없다는 의미다. 그렇다면 만약 자식의 클래스에서는 부모의 함수나 변수를 바꿔 출력하고 싶을 경우에는 어떻게 해야할까.
생성자를 만들 때, 혹은 중복된 이름의 함수를 작성할 때 오버로딩이 쓰였던 것을 기억하자. 여기서 자식이 부모의 함수를 가져와 새로 작성하는 것을 오버라이딩이라고 한다. 주로 프로젝트(협업)을 위해 사용되거나 이후에 배울 다향성에 관해서 주로 사용되는 기능이다. 지금 여기서는 부모가 가진 메서드를 자식이 이름만 들고와 다른 기능으로 바꿀 수 있다는 것을 알아두자.
(물론, 자식에서 바꾼 것이기 때문에 부모가 가진 메서드 자체가 바뀌는 것은 아니다)
Leader클래스에서 오버라이딩 한 say() 함수를 살펴보자. 출력문을 바꾼 것과 동시에, super를 사용하여 다시 한 번 같은 함수를 호출하고 있다. this를 기억한다면 이해하기 쉬운데, super는 해당 클래스의 부모 요소를 직접적으로 안내해주는 참조변수와 같다. this는 해당 클래스, super는 해당 클래스의 부모를 가리키는데, 부모의 sya()를 실행하라는 뜻이므로 Leader의 함수 say()를 불러오면 "선생님께 인사" 와 "선생님, 안녕하세요" 가 둘 다 출력되게 된다.
그렇다면 상속받은 부모와 자식 관계에서 생성자에는 변함이 없을까? 만약 부모가 존재하지 않는 상태인데 자식만 존재하는 상태가 될 수 있을까, 정답은 그렇지 않다. 그래서 우리는 상속받은 클래스에 한해서 부모 생성자를 포함시켜주어야 하는데 보통 생략하면 프로그램 내에서 자동으로 추가해주기는 한다. 하지만 정석으로는 super(); 생성자를 자식 클래스 생성자 안에 포함시켜주는게 맞다. 그래야 자식 클래스가 객체화 되었을 때, 부모도 같이 존재하는 상태가 되기 때문이다.
그렇다면 이를 응용한 문제를 확인해보자. SportsCar라는 클래스가 Car2를 상속받은 상태가 되었고, 각 클래스에는 필요한 변수와 함수가 나열되어 있다. 여기서 Car2의 생성자는 파라미터를 받을 수 있는 형태로 만들어져 있고, SportsCar 역시 필요한 파라미터를 받아 초기화 할 수 있는 생성자를 만들었다. 하지만 생성할 수 없다며 에러가 떴다. 그 이유는 Car2의 생성자는 color값을 받아 초기화하는 생성자만 있기 때문이었다. 기본적으로 자식 클래스 생성자는 부모 클래스의 기본형태의 생성자가 자동으로 들어간다. 하지만 Car2의 생성자를 보면 기본생성자가 없기 때문에 초기화를 받을 값이 없다며 에러가 뜨는 상태였다. 이를 해결하기 위해선 Car2에 기본 생성자를 만들어주거나, 아니면 부모 생성자 안에 파라미터 값을 입력해주면 에러없이 정상적으로 만들어지는 것을 확인할 수 있다.
하지만 SportCar 생성자에서 드는 의문이 하나 있을 것이다. 바로 color라는 변수를 가지고 있지 않음에도 this를 사용하여 변수의 초기화를 진행하자 아무런 에러가 뜨지 않은 것인데, 이는 부모의 변수도 함께 상속받음으로써 SportsCar 클래스 내에 부모의 변수가 존재하기 때문이다. 그래서 super를 써도 불러올 수 있지만, this로도 불러올 수 있는 것이다.
(니것도 내것 내것도 내것)
'아이티에듀넷' 카테고리의 다른 글
2024-09-19 :: 039 함수 정리하기 (0) | 2024.09.19 |
---|---|
2024-09-13 :: 038 객체의 다형성 (0) | 2024.09.13 |
2024-09-11 :: 036 String에 관하여 (0) | 2024.09.11 |
2024-09-10 :: 035 생성자 (0) | 2024.09.10 |
2024-09-09 :: 034 객체 (0) | 2024.09.09 |