안녕하세요 길벗수험서 운영팀입니다.
하나씩 짚고 넘어가 보죠.
함수 호출이 있다면 함수의 이름, 인수, 자료형을 확인하고 이에 일치하는 함수를 찾아 제어를 이동해야 합니다.
194쪽 2번 문제의 경우 getName이라는 같은 이름의 여러 함수가 있지만 인수와 자료형이 서로 다르므로, 호출 시 인수와 자료형이 어떻냐에 따라 이에 맞는 getName 함수를 찾아가야 합니다.
호출문을 보니 getName() 어떤 인수도 포함되어 있지 않으니 이에 해당하는 public String getName() { ... } 으로 이동하겠네요.
일반 상속은 자식 클래스의 객체 변수가 생성되면 자동으로 이루어집니다. 189쪽의 3번을 예로 들 수 있죠.
자식 클래스에서 extends로 부모 클래스를 호출하고 있으므로 자식 클래스의 객체 변수를 생성하면 자식 클래스가 부모 클래스의 변수와 메소드를 가져오며 자동으로 상속됩니다.
이 때 객체 변수는 부모 클래스에 자식 클래스를 덮어씌운 형태가 되죠.
형 변환은 부모 클래스의 객체 변수를 생성하되, 생성자를 자식 클래스로 했을 때 발생합니다.
먼저 194쪽의 1번을 예로 들어보죠. 객체 변수 생성 시 Parent pa라고 했으니 Parent 형태의 객체 변수가 생성됩니다.
다음 생성자로 child()를 호출 했으므로 생성된 Parent 객체 변수 위에 Child 클래스의 메소드와 변수가 덮어 씌어집니다.
일반 상속과 비슷해 보이죠? 그런데 조금 다릅니다.
일반 상속의 객체 변수는 기본적으로 자식 클래스의 구조를 따라 갑니다. 그 상태에서 자신에게는 없는 부모 클래스의 변수나 메소드를 가져올 수 있죠. 만약 부모 클래스에 같은 형태의 메소드나 변수가 있다면 가져오지 않고 그대로 자신의 것(자식 클래스)을 사용합니다.
형 변환에서 객체 변수는 기본적으로 부모 클래스의 구조를 따라 갑니다. 만약 자식 클래스에 같은 형태의 메소드나 변수가 있다면 메소드와 변수가 자식 클래스의 것으로 바뀌어 버립니다. 여기에 일반 상속과 다르게 자신에게 없는 자식 클래스의 변수나 메소드는 가져오지 못합니다.
여기까지 짚어봤으면 문의하셨던 것을 체크해보죠.
195쪽의 3번은 형변환입니다.
형변환에서는 부모 객체 변수이지만 같은 메소드가 자식 클래스에 있다면 그것으로 덮어 씌어진다고 말씀드렸죠.
때문에 Child.compute(int num)이 호출되게 됩니다.
191쪽의 연습문제도 형변환이네요.
부모 객체 변수 a의 show() 메소드를 호출한다고 하였으니, 혹시나 자식 클래스의 동일한 메소드로 덮어 씌어졌나 살펴보면, 동일한 메소드가 존재하지 않으므로 그대로 부모 클래스의 Animal.show()를 호출해주면 됩니다.
194쪽 2번 또한 형변환이죠.
getName()과 같이 인수를 받지 않는 메소드를 부모 클래스와 자식 클래스에서 찾아보면 부모 클래스에 밖에 존재하지 않습니다.
getName(), getName(String val), getName(byte[] val)은 모두 다른 함수라고 생각하셔야 합니다.
때문에 이 또한 191쪽의 연습문제와 같이 자식 클래스에 의해 덮어 씌어지지 않으므로 부모 클래스의 메소드가 그대로 실행되게 됩니다.
행복한 하루되세요 :)
ps: 프로그래밍 언어의 제어 이동 방식은 한 번 이해하면 생각보다 단순합니다. 만약 시간이 없고, 당장 문제를 풀어야 겠다 싶으시다면, 동일한 함수가 존재하면 자식 클래스의 함수를, 없다면 부모 클래스의 함수를 수행한다고 생각하고 풀어보세요.
-
관리자2023-07-07 10:18:45
안녕하세요 길벗수험서 운영팀입니다.
하나씩 짚고 넘어가 보죠.
함수 호출이 있다면 함수의 이름, 인수, 자료형을 확인하고 이에 일치하는 함수를 찾아 제어를 이동해야 합니다.
194쪽 2번 문제의 경우 getName이라는 같은 이름의 여러 함수가 있지만 인수와 자료형이 서로 다르므로, 호출 시 인수와 자료형이 어떻냐에 따라 이에 맞는 getName 함수를 찾아가야 합니다.
호출문을 보니 getName() 어떤 인수도 포함되어 있지 않으니 이에 해당하는 public String getName() { ... } 으로 이동하겠네요.
일반 상속은 자식 클래스의 객체 변수가 생성되면 자동으로 이루어집니다. 189쪽의 3번을 예로 들 수 있죠.
자식 클래스에서 extends로 부모 클래스를 호출하고 있으므로 자식 클래스의 객체 변수를 생성하면 자식 클래스가 부모 클래스의 변수와 메소드를 가져오며 자동으로 상속됩니다.
이 때 객체 변수는 부모 클래스에 자식 클래스를 덮어씌운 형태가 되죠.
형 변환은 부모 클래스의 객체 변수를 생성하되, 생성자를 자식 클래스로 했을 때 발생합니다.
먼저 194쪽의 1번을 예로 들어보죠. 객체 변수 생성 시 Parent pa라고 했으니 Parent 형태의 객체 변수가 생성됩니다.
다음 생성자로 child()를 호출 했으므로 생성된 Parent 객체 변수 위에 Child 클래스의 메소드와 변수가 덮어 씌어집니다.
일반 상속과 비슷해 보이죠? 그런데 조금 다릅니다.
일반 상속의 객체 변수는 기본적으로 자식 클래스의 구조를 따라 갑니다. 그 상태에서 자신에게는 없는 부모 클래스의 변수나 메소드를 가져올 수 있죠. 만약 부모 클래스에 같은 형태의 메소드나 변수가 있다면 가져오지 않고 그대로 자신의 것(자식 클래스)을 사용합니다.
형 변환에서 객체 변수는 기본적으로 부모 클래스의 구조를 따라 갑니다. 만약 자식 클래스에 같은 형태의 메소드나 변수가 있다면 메소드와 변수가 자식 클래스의 것으로 바뀌어 버립니다. 여기에 일반 상속과 다르게 자신에게 없는 자식 클래스의 변수나 메소드는 가져오지 못합니다.
여기까지 짚어봤으면 문의하셨던 것을 체크해보죠.
195쪽의 3번은 형변환입니다.
형변환에서는 부모 객체 변수이지만 같은 메소드가 자식 클래스에 있다면 그것으로 덮어 씌어진다고 말씀드렸죠.
때문에 Child.compute(int num)이 호출되게 됩니다.
191쪽의 연습문제도 형변환이네요.
부모 객체 변수 a의 show() 메소드를 호출한다고 하였으니, 혹시나 자식 클래스의 동일한 메소드로 덮어 씌어졌나 살펴보면, 동일한 메소드가 존재하지 않으므로 그대로 부모 클래스의 Animal.show()를 호출해주면 됩니다.
194쪽 2번 또한 형변환이죠.
getName()과 같이 인수를 받지 않는 메소드를 부모 클래스와 자식 클래스에서 찾아보면 부모 클래스에 밖에 존재하지 않습니다.
getName(), getName(String val), getName(byte[] val)은 모두 다른 함수라고 생각하셔야 합니다.
때문에 이 또한 191쪽의 연습문제와 같이 자식 클래스에 의해 덮어 씌어지지 않으므로 부모 클래스의 메소드가 그대로 실행되게 됩니다.
행복한 하루되세요 :)
ps: 프로그래밍 언어의 제어 이동 방식은 한 번 이해하면 생각보다 단순합니다. 만약 시간이 없고, 당장 문제를 풀어야 겠다 싶으시다면, 동일한 함수가 존재하면 자식 클래스의 함수를, 없다면 부모 클래스의 함수를 수행한다고 생각하고 풀어보세요.