JAVA 반 상속 개념 구현 관련..

jino0330의 이미지

배치에서 해당 클래스의 메소드를 콜하는 프로그램입니다.

콜되는 메소드는 B.execute() 라고 합니다. 콜할때 execute()를 위한 info객체를 세션으로 넘겨줍니다.
해당 클래스는 execute()할때 생성이 됩니다. (팩토리 패턴 이용)

B는 info객체를 참조해서 결과객체를 만드는데, info가 특정값이면 A클래스랑 동일한 로직을 타고, 아닌 경우는 전혀다른 로직을 탑니다.

class A
{
protected execute()
{
a;
b;
c;
}

이럴 때, B 클래스는 A클래스를 상속 받아서 구현하는게 맞을까요? 아니면 따로 만드는게 나을까요?

binul의 이미지

A에도 execute()가 있고 B에도 execute()가 있는데, B에서 execute() 할 때에는 세션의 info를 참조해서 특정 값이면 A의 execute()랑 동일한 로직을 수행한다는 말씀만으로도 형제내지 상속으로 보여집니다.

A의 execute()에 있는 로직이 execute가 가져야 하는 기본적인 로직을 포함하는 것이면 A를 B가 상속 받는게 맞는 것 같고,
그렇지 않다면, Z를 abstract 또는 interface 등을 활용해 기본으로 하고 A, B 모두 Z를 상속받아 설계하여야 할 것으로 보여집니다.

지금은 B에서 info의 조건을 비교해서 로직을 수행하지만,
비교하는 로직이 다른 클래스로 위임되어야 하는 상황(Abstract Factory 등의 활용)이 되면
어떻게든 A와 B의 hierarchy는 있어야 할 것으로 생각됩니다.

추가) 근데 반상속이 먼가요?
--------------------------------
그래날아보자꾸나

--------------------------------
그래날아보자꾸나

jino0330의 이미지

B에서 info = a 이면 a;b;c;를 수행해야 하는 로직이구요.

info = d 이면 d;e;f;를 수행해야 합니다.

따라서 B와 A의 관계를 상속이라기 보다 B안에서 if문을 따라 info = a 일때 A를 호출하여 a;b;c;의 결과를 받아오기만 하는 로직으로 갈까 생각중입니다.

좀 더 현명한 방법이 있으면 알려주시면 감사하겠습니다.

SYSTEM ARTIST를 꿈꾸는 전도무망한 청년입니다

SYSTEM ARTIST를 꿈꾸는 전도무망한 청년입니다

semmal의 이미지

class A {
  execute(Info info) {
    info.execute();
  }
}

class B inherit Info {
execute() {
a;b;c;
}
}

class C inherit Info {
execute() {
d;e;f;
}
}

제가 제대로 이해했는지 모르겠는데 이건 어때요?
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

binul의 이미지

현명한 방법이라기 보다... 저 같은 경우에,

현재 info가 a 또는 b의 2가지 경우밖에 없고 향후에도 2가지 경우밖에 없다면은 A, B 클래스를 나누는 것도 불필요 하다고 생각됩니다.
클래스를 하나로 하고 로직의 복잡성 등을 고려해서 메소드를 if (info.equals(a)) { executeA() } elseif (info.equals(b)) { executeB() } 와 같은 형태면은 충분하다고 생각됩니다.
물론 A, B가 execute 외에 다른 역할이 있으면 클래스가 나뉘어 져야 하겠지만요..

하지만, 현재 info가 2가지 경우밖에 없지만 향후에 경우의 수가 늘어날 수가 있다거나,
사용자에게 확장을 제공해야 한다면 당연히 상속할 수 있도록 구조를 가져가야 할 것 입니다.
이 경우 당연히 info의 상태를 검사하는 코드는 A, B 클래스 안에 있으면 안 될 것이고,
별도의 클래스에서 info의 상태를 검사해서 A 또는 B 등의 클래스를 생성해서 execute를 호출하는 형태가 되겠지요.
좀 더 유연하게 한다면 info의 상태에 따라 생성해야 되는 클래스에 대한 정보를 어노테이션이나 별도의 설정을 통해 관리하겠구요.

개인적으로 과유불급이란 말을 좋아하는데, 아키텍쳐도 디자인도 마찬가지라 생각합니다.
타겟 시스템을 충분히 고려해서 그에 맞게 만들때가 제일 아름다워 보이더군요.

--------------------------------
그래날아보자꾸나

--------------------------------
그래날아보자꾸나

freesoft의 이미지

B를 생성하지 말고 A를 생성해서 처리하시고, 아닌 경우는 B에서 처리하시면 되겠네요.
물론 두 클래스 모두 execute() 가 정의된 인터페이스를 구현해야겠지만요.

cynicjj의 이미지

글 쓰신 내용을 전혀 이해못했지만 -_-;
상속인지 아닌지는 "리스코프 치환 법칙" 하나만 보면 됩니다.

코드 재사용, 비슷한 로직 등은 부차적인 내용입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.