클래스와 클래스와 관계를 설정할 때 그 데이터멤버는 private에 가야할까요?

guru245의 이미지

설계를 해서 각 클래스와 클래스간의 관계를 설정짓습니다.

클래스 A와 B가
A ---> B 이러한 관계라면

class A {
.
.
.

B* b;
};

이와 같이 해서 관계를 짓습니다. 여기서 궁금한 점은 저 b를 public으로 넣는게 맞을까요? private에 넣는게 맞을까요? 오픈소스를 뒤져봐도 저런 관계를 설정짓는 데이터멤버는 public에도 private에도 있습니다. 그 기준이 궁금합니다.

kewlbear의 이미지

멤버 변수는 되도록 public으로 하지 않는 것이 좋습니다. 그리고 혹시 파생 클래스에서 사용할 필요가 있다면 protected로 해야겠지요.

caplove의 이미지

제가 코딩 표준이나 아키텍쳐에 관하여 전문가가 아닙니다.

제 생각에는 외부 참조의 멤버 변수 접근자(?)는 해당 클래스의 의미에 따라서 달라집니다.
A.b의 멤버 변수가 외부 클래스에서 참조되어야 하는 의미라면 public 접근자가 적당합니다. 하지만 A.b의 멤버 변수가 외부 클래스에서 참조될 필요가 없다면 private이나 protected 접근자가 사용되는 것이 좋습니다. (Encapsulation의 의미를 생각해 보십시오.)

일반적으로 외부 클래스 참조 변수가 2중 참조가 되는 경우는 많지 않으므로 후자 private나 protected가 적당한 편입니다. 왜냐하면 다른 클래스(C)가 B를 접근하여야 한다면 A를 통하여서가 아니라 C 내부에 멤버 변수 C.b를 사용하여 C.b->myMethod() 접근하는 것이 올바르기 때문입니다. (역시 encapsulation의 의미)

하지만 다음과 같은 예의 경우에는 외부 참조를 사용할 수 있을 것 같습니다.
class Packet; // 네트워크 패킷 관련 클래스
class NIC; // 네트워크 하드웨어 관련 클래스
class MyAlgorithm; // 해당 패킷 처리 알고리즘

(위의 예제는 일반적인 네트워크 프로그램 방식이 아닙니다. 예를 위해 제가 만들어낸 방식입니다. 양해하여 주십시오. ^^)
MyAlgorithm은 NIC와는 의미가 다르므로, 상속받는 개념과 다릅니다.

NIC.pPacket->sendPacket(); //과 같이 NIC 클래스에서는 Packet 클래스를 참조합니다.
MyAlgorithm.pNIC->pPacket->sendPacket(); //과 같이 사용할 수 있습니다. (물론 C++ 문법은 아니지만 쉽게 설명드리기 위해 다음과 같이 표시하였습니다.)

제가 전문가는 아니기에 적당한 예제를 보여드리지는 못하였습니다만, 클래스를 디자인할 때 의미에 따라 외부 클래스 참조 변수의 접근자는 달라질 수 있습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.