묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨김영한의 실전 자바 - 기본편
다형성 문제풀이 2번 다른 풀이
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하십니까! 두번째 정주행을 통해서 다형성에 대해서 이해하고 문제풀이까지 완료했습니다. 처음 봤을땐 아무것도 손댈수 없었지만 다시 보니 막힌 혈이 뚫리는 기분이였습니다.김영한 강사님께서 설명해주신 풀이로 푸는것은 이해했지만 다른 문제 풀이 방법을 보고 참고할까합니다! 직접 해보고 검색해보며 찾아보려했으나 나오지않아 질문 올립니다!
-
해결됨김영한의 실전 자바 - 기본편
부모는 자식을 담을 수 있지만 자식은 부모를 담을 수 없는 이유
[질문 내용]다형적 참조 시 부모 클래스는 자식 클래스를 참조하여 대입할 수 있으나, 자식 클래스는 부모 클래스를 참조하여 대입할 수 없는 부분에 대해 좀 더 작동 원리를 이해하고 싶어서 질문드립니다. 예시)Parent a= new Child(); -> 실행 가능Child b = new Parent(); -> 실행 불가. 컴파일 에러 발생. 위와 같이 규칙이 정해진 이유는하위 클래스는 인스턴스 생성 시 상위 클래스 생성자를 무조건 호출하여 인스턴스 내에 상위 클래스, 하위 클래스 정보가 모두 존재하는 반면, 상위 클래스는 인스턴스 생성 시 본인의 인스턴스만 생성하기 때문에 인스턴스 내부에 상위 클래스 정보밖에 존재하지 않아 하위 클래스 데이터 타입에 해당 인스턴스 참조값을 대입할 수 없는거라고 이해하면 될까요? 상기 작동 방식이 결국엔 다운캐스팅을 명시해야하는 이유와 일맥상통하는 것 같은데 제가 정확하게 이해한건지 모르겠습니다.
-
미해결김영한의 실전 자바 - 기본편
다운캐스팅 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]//부모 변수가 자식 인스턴스 참조(다형적 참조) Parent poly = new Child(); Child child = (Child) poly; child.ChildMethod(); child.parentMethod(); //호출 가능다운캐스팅으로 부모 타입의 poly를 자식타입으로 변경하여자식 클래스의 childMethod를 호출 가능하였습니다. 그런데 바로 child.parentMethod도 호출이 가능하던데다운캐스팅, 업캐스팅 시 부모, 자식의 기능을 모두 불러올 수 있는 것인가요? 부모와 자식의 기능을 모두 호출 가능한 이유가 무엇인지 이해가 되지 않습니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
선생님 다형성 질문입니다!
선생님 다른 학생분 답변 해 주신 거 보구 Camera camera = new Camera(); Camera cam1 = new FactoryCam(); Camera cam2 = new SpeedCam(); cam1.showMainFeature(); cam2.showMainFeature(); if(camera instanceof Camera){ System.out.println("카메라입니다."); } //인스턴스 임을 확인하고, 형변환을 통해 객체가 가지는 주요기능을 쓸 수 있다. if(cam1 instanceof FactoryCam){ ((FactoryCam)cam1).detectFire(); } if(cam2 instanceof SpeedCam){ ((SpeedCam)cam2).checkSpeed(); ((SpeedCam)cam2).recognizeLicensePlate(); }Camera 클래스가 가지는 변수나 메소드만 사용할 수 있고형변환을 통해 인스턴스 가 가지는 주요기능을 쓸 수 있다까지는 이해가 됐어요!그리고 Camera 가 가지는 공통기능이 있기 때문에 하나의 변수가(?) 여러 다른 형태의 객체를 참조 할 수 있는건데 궁금한게 특정기능을 사용하려면 형변환을 통해서 접근해야하는데 불편하지 않나요? 다형성을 추구 하는 이유가 궁금합니다.!
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
구상클래스에서 인터페이스 변수를 선언한 이유가 혹시 다형성과 관련이 있나요?
클래스의 상속과 관련된 다형성은 부모객체로 인스턴스를 생성하여 부모클래스의 메소드와 자식클래스 메소드 2가지를 업/다운캐스팅하여 자유롭게 호출할 수 있지만, 단일상속이라는 한계때문에 다른 부모클래스의 메소드는 호출할 수가 없잖아요? 그래서 인터페이스가 존재하는 이유구요.마찬가지로, 인스턴스를 생성할 때 다형성을 활용하여 인터페이스 객체(부모 객체)로 생성할 수는 있지만, 이것은 ISP(Interface Segregation Principle)원칙에 따라 detect(), report() 2개의 메소드를 호출하려면 Detectable, Reportable 객체 2개를 생성해야 하기 때문에 메모리가 효율적으로 관리되지 못하는거구요. 따라서 구상클래스인 FactoryCam에서 인터페이스 변수를 직접 생성하고 setter함수로 필요한 인터페이스 변수를 주입한 다음(Dependency Injection) , 주입당한 객체는 인터페이스에 의존하기 때문에(Reportable, Detectable) 동시에 기능이 다른 2가지 메소드를 호출할 수 있는거구요.(Dependency Inversion Principle) ... 과정을 이해하였지만 말로 풀어내니까 굉장히 장황하군요 사실 이 부분은 인터페이스 문법이라기보다는 디자인 패턴과 관련이 있지 않나싶습니다.