작성
·
740
·
수정됨
0
안녕하세요 나도코딩 강사님
강의를 듣다가 궁금한 부분이 있어서 질문드립니다
챕터 7의 다형성파트 강의에서
질문 1 :
Camera camera = new Camera();
Camera factoryCam = new FactoryCam();
Camera speedCam = new SpeedCam();
코드 첫번째 줄이 의미하는바가 Camera 클래스로부터 객체명이 camera인 객체를 생성한다는 것은 알겠는데
등호(=) 뒤에 있는 new Camera() 이게 뭘 의미하는건지 잘 모르겠습니다
코드에 (Alt + 클릭)을 하면 해당하는 코드부분으로 바로 이동하는데 Camera 클래스의
Camera() 생성자로 가더라구요
new Camera()가 Camera 클래스의 생성자를 의미하는건가요 ?
질문 2 :
Camera factoryCam = new FactoryCam();
이 코드는 Camera 클래스로부터 객체명이 factoryCam인 객체를 생성하게 되는데
자신의 클래스를 상속받는 FactoryCam 클래스의 메소드와 변수는 사용하지 못하고 Camera 클래스의 메소드만 사용할 수 있다고 하셨는데
뒤에 new FactoryCam() 이 부분이 의미하는바가 무엇인가요?
질문 3 :
if (camera instanceof Camera) {
// camera 객체가 Camera 클래스로부터 만들어진 인스턴스이면
System.out.println("카메라입니다.");
}
if (factoryCam instanceof FactoryCam) {
((FactoryCam)factoryCam).detectFire();
첫 번째 if 에서 camera 객체는 Camera 클래스로부터 만들어진 객체가 맞으니까
"카메라입니다"를 출력하는 것은 이해되는데
두번째 if 에서 factoryCam 객체는 부모클래스인 Camera 클래스로부터 생성된 객체인데
왜 FactoryCam 클래스의 인스턴스인지도 이해가 안갑니다.
클래스로부터 생성된 객체를 인스턴스라고 알고 있었는데
factoryCam 객체는 Camera 클래스로 부터 생성된 객체니까 Camera 클래스의 인스턴스로 이해 했는데
두번째 if에서 (factoryCam instanceof FactoryCam) 이 true라고 해서 헷갈리네요
그리고 factoryCam이 FactoryCam의 객체가 맞다면 FactoryCam으로 형변환 하는 이유가 뭔가요 ?
답변 1
3
안녕하세요?
질문 1
Camera camera = new Camera();
이 문장은 등호(=) 오른쪽의 new Camera() 에 의해 Camera 클래스로부터 새로운 객체를 만들고 등호 왼쪽의 camera 변수에 대입하라는 의미입니다. new 라는 키워드가 새로 만들어줘 라는 목적으로 사용됩니다.
그리고 Ctrl + 클릭 (Alt 로도 되시던가요?) 을 통해 클래스 이름을 누르게 되면 해당 클래스의 생성자 부분으로 이동하게 됩니다. new Camera() 를 하게 되면 새로운 객체가 만들어지고 생성자는 객체가 만들어질 때 자동으로 호출이 되는 특별한 메소드입니다.
질문 2
Camera factoryCam = new FactoryCam();
이 문장은 등호(=) 오른쪽의 new FactoryCam() 에 의해 FactoryCam 클래스로부터 새로운 객체를 만들고 등호 왼쪽의 factoryCam 변수에 대입하라는 의미입니다. Camera factoryCam 으로 하였기 때문에 factoryCam 은 Camera 클래스에 정의된 인스턴스 변수 및 메소드만 접근 가능합니다. 다만 FactoryCam 이 Camera 클래스를 상속하므로 다형성에 의해 이 문장은 올바로 수행됩니다.
질문 3
if (factoryCam instanceof FactoryCam) {
factoryCam 은 FactoryCam 클래스로부터 새롭게 만들어진 객체를 참조하는 변수입니다. 참조란 쉽게 메모리 공간의 특정 위치를 가리키는 것이며, factoryCam 자체가 어떤 객체이거나 그런 것은 아닙니다. 객체가 존재하는 곳을 알고 있는 정도로 이해하시면 됩니다.
예를 들어 엄청나게 큰 대형 마트에 새로운 신입 직원 2명(A, B)이 각각 과일, 채소 코너에서 일을 하게 되었다고 가정하겠습니다. 마트가 너무 커서 자신이 속한 코너를 제외하고는 다른 코너가 어디있는지는 모르는 거에요. 그러면 A 직원한테 '너가 근무하는 곳은 어디야?' 라고 하면 과일 코너로, B 직원한테 '너는?' 이라고 하면 채소 코너로 안내할 수 있을 겁니다. 이때 A 와 B 가 참조형 변수, 과일 또는 채소 코너가 객체라고 보시면 됩니다. 그리고 엄청나게 큰 대형 마트는 메모리입니다.
정리하면 A 와 B 직원 자체가 과일 또는 채소 코너가 아니며 이들은 각 코너가 있는 곳을 알고 있을 뿐인거에요.
다시 질문으로 돌아와서 factoryCam 은 FactoryCam 클래스로부터 만들어진 객체를 참조하기 때문에 앞의 소스코드도 참이 됩니다. 비유로 설명드리면 'A 직원은 과일 코너에서 근무하는 것이 참이다' 정도로 이해하시면 될 것 같아요.
하지만 아래 문장에 의해 factoryCam 의 자료형(type)은 FactoryCam 클래스가 아닌 Camera 클래스입니다. 그래서 Camera 클래스에 정의된 인스턴스나 메소드만 사용 가능합니다. FactoryCam 클래스에 정의된 detectFire() 메소드를 사용하기 위해서는 형변환이 필요해지죠.
Camera factoryCam = new FactoryCam();
만약 이렇게 했다면 FactoryCam 클래스에 정의된 인스턴스나 메소드, 그리고 부모 클래스인 Camera 에 정의된 것들도 사용할 수 있게 됩니다. 또한 detectFire() 메소드는 형변환 없이도 사용할 수 있게 됩니다.
FactoryCam factoryCam = new FactoryCam();
이해에 도움되시길 바라겠습니다 😊
감사합니다.