(객체지향)객체생성에 대한 질문

조회수 1725회
public class A {

    private double[] data;

    public A(double[] data) {
        this.data = data;
    }

    public double mean() {
            return null;
        }
}


public class B extends A{

    private String title;

    public B(double[] data) {
        super(data);
    }
    public String history() {
        return null;
    }
}

이렇게 A클래스와 B클래스가 존재합니다. 이 경우, A sample = new B(); 와 같이 객체를 생성하는 이유를 알고 싶습니다.

저렇게 생성하면 B클래스의 history()메소드는 사용이 불가하고 A클래스에서 상속받은 mean()메소드만 사용이 가능하다고 배웠는데 그렇다면 A sample = new A();와 다를 것이 없지 않습니까?

또한, A sample = new B();와 B sample = new B();와의 차이점을 알고 싶습니다.

제가 배우기로는 전자의 것이 범용성과 다양성을 위한 방법이라고 하는데 그것이 맞는지 맞다면 예를 부탁드리고, 틀리다면 이유를 알려주시면 감사하겠습니다.

1 답변

  • 저도 처음에는 같은 생각을 했었습니다. 아직도 객체지향이란 개념이 어렵네요. 작성하여 주신 양의 복잡성을 갖고있는 코드에서는 굳이 상속을 해야하는 의구심이 들수도 있는데요. 상속(객체지향)은 결국 시스템 확장시에 효율성을 위함입니다.

    우선 객체 지향의 중요한 특성 중 하나는 특정 타입에 속하는 모든 객체는 동일한 메시지를 받을 수 있다인데요. 메시지를 보내는 행위는 객체의 메서드를 호출하는 개념이라고 이해하시면 됩니다.

    너무 얘기가 길어질 것 같아서 코드로 대신하겠습니다.

    아래 코드로 간단한 예를 들면,

    Weapon클래스를 베이스타입으로 지정하였고, 나머지 클래스는 상속받은 Weapon클래스의 attack메서드를 재정의 하였습니다.

    메인 메서드의 attackSomething()은 베이스타입인 Weapon을 파미터로 지정함으로서 Weapon 클래스로부터 파생된 클래스의 객체를 모두 받아들일 수 있습니다. (여기서 다형성 개념이 나옵니다.)

    이렇게해서 무기 추가의 요구 사항이 발생하더라도 기존 코드의 수정없이 새로운 무기 클래스를 작성할 수 있습니다.

    궁금했던 부분에 대한 답이 되었으면 좋겠네요.

    class CodeRunner{
        public static void main(String[] args){
            attackSomething(new Knife());
            attackSomething(new Gun());
        }
    
        static void attackSomething(Weapon weapon) {
            weapon.attack();
        }
    }
    
    abstract class Weapon {
        abstract void attack();
    }
    
    class Knife extends Weapon {
        void attack() {
            System.out.println("칼로 공격");
        }
    }
    
    class Gun extends Weapon {
        void attack() {
            System.out.println("총으로 공격");
        }
    }
    
    
    • 대단히 감사합니다. 코드를 본 덕분에 다형성 개념에 대해 조금 더 윤곽이 잡혔습니다. 작성 해 주신 코드를 토대로 다형성을 보일 수 있는 코드를 짜 보도록 하겠습니다. 알 수 없는 사용자 2017.5.25 22:54

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)