작성
·
50
0
안녕하세요. Java 상속 10개 예제 파트의 유형 5. 부모 메서드를 오버라이딩하지 않고, 자식에서 새롭게 정의된 메서드를 사용 할 경우에 대해 질문이 있어서 남깁니다.
아직 제가 업캐스팅에 대해 완벽히 이해가 되었지 않았기 때문에 드리는 질문입니다.
업캐스팅이란, 객체 생성 시, 클래스의 타입은 부모 클래스로, 생성자는 자식 생성자로 하는 것이라 배웠습니다.
업캐스팅이 진행 될 경우, 기존 부모 클래스 내부 메서드는 해당 객체에서 활용할 수 있지만, 자식 클래스에서 부모 클래스의 메서드를 오버라이딩 하지 않고, 새롭게 정의한 메서드를 사용할 수 없는 것인가요?
예를 들어, 다음과 같은 코드를 살펴 볼 경우,
class Parent {
// 부모 클래스의 void형 메서드 show
void show() {
System.out.println("Parent show");
}
}
class Child extends Parent {
// 자식 클래스의 void 형 메서드 show(int a)
// 부모 클래스에 존재하지 않던 메서드를 새롭게 정의한 메서드
void show(int x) {
System.out.println("Child show : " + x);
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Child(); // 업캐스팅으로 생성된 객체 p
// p는 참조 타입이 Parent이고, 생성은 Child 생성자에 의해 생성된 객체이다
p.show(); // p.show() -> Child에 없는 메서드 -> Parent에서 해당 메서드 호출
p.show(1); // p.show(1) -> Child에만 있는 메서드 -> 참조 타입이 Parent이기 때문에 컴파일 에러 발생
}
}
p.show()는 Parent 클래스에서 정의된 메서드 show()를 호출하지만, p.show(1)는 Child 클래스에서만 정의된(Parent 클래스에는 없는) 메서드이기 때문에, 참조 타입에 따라 컴파일 에러가 발생하는 것 같습니다.
아직 제가 업캐스팅을 잘 이해하지 못해서 그런지, 업캐스팅이 없으면 안되는 경우를 제가 모르기 때문인지, 업캐스팅의 이점을 잘 모르겠습니다.
사실 저 경우도 단순히 Child 타입으로 p를 만들었다면 문제 없이 넘어가는 경우이고, 두 번째 자식 클래스의 메서드에서 오버라이딩을 진행한 경우에도 업캐스팅을 사용해야 하나?라는 의문이 들었습니다.
class Parent {
void show() {
System.out.println("Parent show");
}
}
class Child extends Parent {
void show() {
System.out.println("Child show");
}
void show(int x) {
System.out.println("Child show : " + x);
}
}
public class Main {
public static void main(String[] args) {
Child p = new Child();
p.show();
p.show(1);
}
}
업캐스팅을 단순히 정처기 실기를 통과하기 위한 하나의 주제로 보는 상황이라 이런 문제가 벌어지는 것 같습니다...ㅠㅠ 혹시 개발 과정에서 업캐스팅이 없으면 안 되는 경우(저처럼 그냥 타입을 Child로 바꿔버리면 안 되는 경우 등)에 대한 예시가 있을까요??
다양한 문제 상황을 주셔서 여러 고민을 할 수 있는 것 같습니다. 항상 질 높은 강의 감사드립니다!
답변 2
1
이 질문은 강의에 대한 질문은 아니고, 업캐스팅을 왜 쓰는지에 대한 질문에 가깝네요.
이런 질문은 답변 드리기가 곤란한게, Java 전체에 대한 이야기를 해야합니다.
그래도 대충 예시를 드리자면,
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Parent> list = new ArrayList<>();
list.add(new Child1()); // 업캐스팅
list.add(new Child2()); // 업캐스팅
for (Parent p : list) {
p.show(); // 실제 객체 타입에 따라 다르게 동작 (다형성)
}
}
}
class Parent {
void show() {
System.out.println("Parent show");
}
}
class Child1 extends Parent {
void show() {
System.out.println("Child1 show");
}
}
class Child2 extends Parent {
void show() {
System.out.println("Child2 show");
}
}
저도 당장 예시를 말씀드리려고 하니 생각이 안나서 LLM으로 위의 코드를 생성했습니다.
이 예제를 보시면, Parent 타입으로 선언해서 Child1, Child2가 다 들어갑니다.
업캐스팅을 사용하지 않으면 List<Child1>, List<Child2> 뭐 이렇게 해야합니다.
여러 종류의 객체를 하나의 컬렉션에서 다룰 수 있게 된다는 장점이 있습니다.
이거 외에도 매개변수에 부모 타입으로 확장성을 확보할 수도 있고, 부모 클래스 타입을 반환해서 객체 생성을 다양하게 할 수도 있습니다.
다 말씀드리고 싶으나 그러면 Java에 대한 일장연설이 됩니다.
그렇게 되면 약간 디자인패턴의 영역이라서, 전공 과목이 되어버리고요.
나중에 Java로 안드로이드 앱이나 백엔드를 개발하면서 특정 기능을 확장해보시면 바로 느끼게 됩니다.
학부 수준에서는 졸업 작품으로 간단한 게임만 만들어봐도 자식 타입으로 만드는 것과 업캐스팅 형태로 만들어야 하는 차이를 알게 됩니다.
프로그래밍이라는 것이, 단순히 말씀을 드려도 바로 와닿지가 않는 경우가 많더라고요.. 😅
어쨌든, 이 강의는 정보처리기사 실기 합격을 위해서 만든 것이지 Java 문법에 대한 강좌가 아니니 양해 부탁드립니다.
저도 Python으로 웹 개발하고 스크래퍼를 개발해서 개인적으로 많이 사용하는데, 파이썬으로 코딩할 때 객체지향 형태로 작성을 해두셨으면 변환이 쉬울텐데
단순히 함수와 모듈만 여러 개 있는 경우에는 Java에는 클래스 하나에 메인 함수 하나 있을 겁니다. 그 아래에 다른 함수 여러 개 사용하는 정도겠죠.
실제 클래스를 여러 개 만들어서 상속하고, 확장해보는 형식으로 개발을 하셔야 Java에 익숙해지실 겁니다.
항상 응원합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김민규님.
질문해주신 내용에 대해 설명드리겠습니다. 먼저 업캐스팅이란, 자바에서 부모 클래스 타입의 참조 변수를 사용하여 자식 클래스의 객체를 참조하는 것을 의미합니다. 이는 다형성(polymorphism)을 활용한 객체 지향 프로그래밍의 중요한 개념 중 하나입니다.
업캐스팅을 사용하는 이유는 크게 다음과 같습니다:
상황에 따라 업캐스팅이 유용한 경우는 다음과 같습니다:
Component
라는 하나의 부모 클래스로 처리할 필요가 있을 때.업캐스팅을 이해하고 나면, 자바의 instanceof
연산자와 다운캐스팅(downcasting)을 더불어 다루어보시길 권장드립니다. 다운캐스팅은 특정 상황에서 객체를 다시 자식 타입으로 변환하는 과정입니다.
백문이 불여일견이라고 하죠. 아래 링크들을 통해 유사한 문제 상황과 토론을 보신다면 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
범위에 벗어난 질문을 드려서 죄송합니다.
강사님의 답변을 제 지식으로 정리하자면, Java의 특성 상 배열 등을 활용 할 때 해당 배열의 원소는 선언 시 지정한 타입과 동일해야 한다. 업캐스팅이 없을 경우, 우리는 Parent 타입의 원소들로 이루어진 배열이 필요함에도 불구하고, Child 타입으로 배열을 지정해야 하는 경우가 발생할 수 도 있다. 따라서, 업캐스팅이 필요한 영역이 분명히 존재한다. 정도 인 것 같습니다.
처음 프로그래밍 언어를 파이썬으로 시작했기 때문에, 타입으로부터 조금 더 자유로운 코드 작성에 익숙해져서 발생한 문제인 것 같네요.. 이 때문에 자바와 C언어로 코드를 작성할 때 많이 헷갈렸던 것 같습니다... 특히 Java에 익숙해지기 위해 알고리즘 풀이를 파이썬으로 푼 이후 자바로 변환하는 작업을 매일 진행 중인데, 분명 수도 코드는 알지만 이를 프로그래밍 언어로 작성하는 것에 어려움을 느끼는 것 같습니다. 각 언어의 특징을 보다 더 완벽히 이해하는 과정이 필요한 것 같습니다.
강사님의 여러 코멘트 덕분에 단순히 자격증을 얻기 위해 강의를 수강한다기 보다는, 새로운 지식을 얻을 수 있다는 즐거움으로 수강하고 있습니다! 항상 상세한 답변에 감사드립니다!!!