자바 상속에 관련 질문 드립니다.
부모 클래스 는 소스 작성 안하고 선언만 하고 자식 클래스 에서 내용을작성하잖아요?
메소드명 만 갖구오는건데 상속을 꼭 해야되는건가하고 의문이 들어서요
추상 클래스 상속, 추상 메소드 오버라이딩을 말씀하시는 건가요?
abstract class A { } // 추상 메소드 D를 사용할 것이지만, 선언하지 않겠습니다. class B extends A { public void D() {} } // 오버라이딩 안 해도 됩니다. 문제 없습니다. class C extends A { } // 그런데 A를 상속하면서 메소드 D가 없는 클래스가 있을 수도 있습니다! // C같은 클래스가 있을 수도, 없을 수도 있지만_ 이런 클래스가 없다고 단정짓는 건 불가능합니다... public class Main { public static void main(String... args) { A b = new B(); b.D(); // 글쎄, 이 b가 C 객체면 어쩌죠? } }부모 클래스에 그 추상 메소드가 없다면, 그 자식 클래스의 인스턴스를 부모 클래스로 형변환 했을 때
부모 클래스, 또는 그 모든 자식 클래스에 그 메소드가 항상 있다고 할 수 없기 때문에 (없을 수도 있기 때문에)
자식 클래스에만 있는 함수는 부모 클래스로 형변환하면 다시 자식 클래스로 형변환 하지 않으면 호출할 수 없게 됩니다.하지만 추상 메소드가 있다면, 그 자식 클래스가 그 메소드를 구현할 것을 강제할 수 있습니다!
추상 메서드를 선언하면 그 메소드가 없을 수 없게 되는 것이죠! (그 메소드가 없으면 인스턴스화 할 수 없습니다.)
컴파일러는 이제서야 (그 메소드가 반드시 있다는 걸 알 수 있게 되어야만...) b.D();같은 코드를 허용합니다.같은 이유로 추상 클래스를 상속하는 대신 인터페이스를 구현하기도 합니다.
추상 메소드나 인터페이스 없이 메소드 이름만 같다면 리플렉션으로 호출이 가능하긴 한데, 좋은 방법은 아닙니다.
추상클래스에 대한 내용입니다.
상속에 개념을 물어보신거 같은데 그게 핵심입니다. 이것을 활용해서 자바의 다형성을 이용할 수 있기 때문에
설계만 잘하신다면 코드의 재사용성을 높히고 코드 양이 많이 줄어듭니다.
결과적으로 보면 당연히 유지보수도 쉬워지고 개발시간도 많이 단축될 겁니다.
흠.. 이 질문은 객체지향 프로그래밍에 대해서 의문인것 같아요.
왜 이렇게 굳이 메소드 이름만 가져오는데 부모 클래스를 상속을 받아야 하나...
예를 들어볼게요.
자동차라는 클래스가 하나 있어요.
그런데 자동차 클래스에는 간다(), 멈춘다() 이렇게 두개의 메쏘드가 있어요.
이렇게 만들어진 자동차 클래스를 이용하여 프로그램을 만들었어요. 프로그램은 다음과 같이 생겼어요.
간다();
멈춘다();
간다();
간다();
그런데 어느날 외국인이 작성해놓은 Car라는 클래스가 내가 만들어 놓은 자동차 클래스보다 성능이 더 좋은거에요.
문제는 이 Car 클래스에는 Go(), Stop() 메소드 이름으로 존재하고 있어요. 자동차 클래스의 간다()와 Car 클래스의 Go()는 같은 기능을해요. 물론 멈춘다() == Stop() 이구요.
문제는 이때 발생하죠. 저는 이미 자동차 클래스의 간다(), 멈춘다()로 프로그램을 만들어 놓았어요. 이럴 때 성능이 더 좋은 Car 클래스를 쓰려면 어떻게 해야 할까요?
정답은!!! 다시 처음부터 작성해야죠...
Go();
Stop();
Go();
Go();
이 얼마나 비효율적인가요. 이름만 같았으면 다시 프로그램을 개발할 필요가 없었을텐데...
그래서 이때 유용하게 쓸수 있는 방법이 위처럼 이름을 사전에 정해놓고 추후 상속을 받아 기능만 개발하는거에요. 한마디로 표준을 정해놓는거죠.
그러면 이름은 모두 같을 것이고, 내부 기능만 다르겠죠?
이해가 되셨으면 좋겠네요^^