목적
  - 클래스의 상속에 대해서 이해하고 활용한다.

문제

사용자 삽입 이미지

코드







해설
  - 이전 문제의 업그레이드 판으로 상속에 대해서 이해를 하셔야지 풀수 있는 문제입니다.
  - 상속은 ThreeD -> Cubic 으로 되는데 protected 된 자료형과 public 으로 된 자료형을 상속 받습니다.
  - 상속 받은 클래스의 객체가 초기화 될때 부모 클래스에서 자동으로 생성자를 실행하기 위해 상속 클래스에 : [부모 클래스의 생성자 함수] 를 써줍니다. 그러면 리턴되어 자식 클래스에서도 똑같이 적용이 됩니다.

  - 셋다 0이 아닐때 수행되며 셋중 하나가 0이 되면 종료되는 판정문이 있습니다.
  - 이전에 생성된 객체는 그다지 중요하지 않기 때문에 1차원 포인터로 객체를 마구 찍을수 있게 했습니다.

참고
  - 상속은 처음 나온 문제 입니다.
  - 예제 코드 보고 이해하기엔 참고 해야할 사항들이 많습니다. 처음 보시는 분들은 클래스의 다른 정보들도 같이 이해하시기 바랍니다.
  - http://winapi.co.kr/clec/cpp3/29-1-2.htm : 상속의 예
  - 이전 문제
Posted by 카켈



목적
  - 배열을 동적으로 생성시키고 클래스에다가 적용시킨다.
  - inline 함수에 대해 이해한다.
  - 생성자를 활용한다.
  - 이중 포인터에 대한 이해를 한다.

문제

사용자 삽입 이미지

코드


해설
  - 복사 생성사는 매너(?) 상 넣었습니다. 포인터 맴버 변수를 가진 클래스에서는 언제 쓰일지 모르기 때문에 써주시는게 예상치 못한 오류를 막는데 도움이 될수 있습니다.

  - inline 함수들만 정의 되어 있어서 굳이 Employee.cpp 파일을 작성할 필요가 없습니다. Employee.h 에서 다 정의 했습니다.

  - 코드에 해설이 주석으로 직접적으로 쓰여져 있습니다.

  - 이번엔 이중 포인터라는 중요한 개념을 익혔습니다. 일차포인터 배열은 가리키는 주소가 스택에 있기 때문에 그 크기가 변할수 없지만 이중포인터로 이차원으로 선언했을때에는 가리키는 주소가 힙에 저장되기 때문에 배열의 크기가 코드상에서 동적으로 지정이 가능합니다. 중요한 조언을 주신 선배님께 감사드립니다.

  - cin 으로 엔터키를 입력하면 엔터 값이 버퍼에 남아 있기 때문에 cin.getline 을 해버리면 넘어가버리는 문제가 있었습니다. cin.ignore(1,'\n') 버퍼에서 값을 가져올때 첫번째 '\n' (줄내림) 까지 값을 무시하고 받는다고 명령을 넣고 다음 키 입력 getline 함수를 이용하여 저장을 할수 있습니다.

  - 동적 배열을 구현할수 있지만 사용자 정의된 클래스에서는 약간 복잡해집니다. 따라서 MFC 나 STL 에서 동적 배열을 구현하는 자료형을 제공합니다.

  - inline 함수는 일반함수의 개념보다 매크로의 개념이 강합니다. 해당 함수가 호출되었을때 inline으로 저장이된 구문이 함수를 호출한 코드에서 복사/붙여넣기 처럼 그 자리에서 실행을 합니다. 원래 함수는 호출 -> 현재 상태 저장 -> 복귀값 저장 -> 처리 -> 이전 상태 복귀 -> 리턴값과 함께 이전 상태로 복귀 이런 식으로 가는데, inline 함수는 코드 호출 -> 치환 -> 수행 -> 리턴값 이런식으로 간단하게 수행됩니다. 수행 시간이 짧아지는 장점과 동시에 코드가 그떄 그때 붙어버리는 바람에 커져버리는 단점이 있습니다. 구조체나 클래스 처럼 마지막에 } 하면서 세미콜론을 잊지 마시기 바랍니다. 정의의 마지막에는 꼭 필요합니다.


참고
  - http://www.winapi.co.kr/clec/cpp1/10-4-1.htm 
: 이중 포인터
  - http://www.winapi.co.kr/clec/cpp2/19-1-2.htm
 : 동적 배열
  - http://www.borlandforum.com/impboard/impboard.dll?action=read&db=component&no=441

    : 구조체를 동적 배열로 관리할 수 있는 클래스 - 동적 배열 응용 예
  - 유사 문제 검색
Posted by 카켈




목적
  - 클래스의 생성자를 이해하고 동적으로 생성한다.
  - 복사 생성자에 대해 이해한다.

문제

사용자 삽입 이미지

코드




해설
  - 이번 문제에선 복사 생성자가 그다지 역할을 하지 않았습니다. 포인터를 쓰기 때문에 의무적으로 적은 거 뿐입니다. 만약 할당 연산자나 복사시 이 생성자는 서로 다른 주소로 자료를 저장하기 위해서 필수적으로 적어 두셔야 합니다.

  - new 로써 동적으로 포인터에 배열을 붙여서 접근을 할수 있습니다. 프로그램 종료시 delete 하여 자원의 낭비를 줄입니다.

  - 마찬가지로 생성시 new 로 문자열을 늘렸기 때문에 소멸시에 delete 로써 문자열을 삭제 합니다. 이는 파괴자(소멸자)에서 그 역할을 할수 있기 기술합니다.

  - CStu[0]->m_ViewProfie() 에서 -> 연산자는 (*CStu[0]).m_ViewProfile() 과 같습니다. 우선순위로 인해 괄호를 넣기가 번거로워서 -> 연산자를 추가했습니다.

참고
  - 객체지향적 프로그래밍은 C++ 기초 다음 단계이므로 차근 차근 공부 하시면 이해하기가 쉽습니다. 구조체를 먼저 이해하시고 클래스를 배우신후 private / public / protect 형 그리고 맴버함수와 변수 생성자와 파괴자 상속과 연산자, 가상함수... 이런식으로 계속 배우시면 됩니다.

  - 유사 문제 검색

Posted by 카켈




목적
  - 수학 공식에 맞는 클래스 자료형과 공식을 C++ 에 적용한다.

문제
사용자 삽입 이미지

코드



해설
  - 생성자(Constructor)는 클래스가 생성시(인스턴스화) 기본적으로 수행하는 구문입니다. 변수를 초기화 하거나 객체를 복사나 할당/생성 될때 수행되며 여러가지 역할을 합니다. 이와 반대 되는게 파괴자(Destructor) 입니다.
  - m_PrintArea() 맴버함수는 넓이를 m_PrintVol() 맴버함수는 부피를 출력합니다.
  - 각각의 맴버변수는 private 형으로 선언 되어있기 때문에 맴버 함수인 m_PrintArea, m_PrintVol, 생성자, 파괴자 외에는 접근할수 없습니다.(정보 은닉)
  - 직육면체 겉넓이는 가로*높이*2 + 가로*세로*2 + 세로*높이*2 이며 부피는 가로*세로*높이 입니다.

참고

 - 유사 문제

Posted by 카켈



목적
  - 클래스와 생성자에 대해 이해한다.

문제

사용자 삽입 이미지
 
코드

 





해설

  - 생성자는 public 형 함수로 클래스 이름으로 선언되며 인수는 괄호 안에 원하는 형식을 넣어 쓰면됩니다.
  - 위 코드에서는 생성자가 3개이며 overloading(오버로딩) 방식으로 중첩선언 되었습니다.
  - 첫번째 생성자는 생성(인스턴스화)시 인수가 하나도 없을때 이며 두번째는 순서만 있을때 세번쨰는 길이와 순서가 있을때 입니다. 이 코드에서는 세번째 생성자만 쓰여졌습니다.
  - length() 맴버 함수는 private 형으로 선언되어 있는 길이값들을 계산하여 빗변의 길이를 출력하는 함수 입니다. public 형으로 되어 있기 때문에 main() 함수 내에 맴버를 바로 호출할수 있습니다.

참고
  - http://winapi.co.kr/clec/cpp3/26-1-1.htm : 생성자
  - 유사 문제

Posted by 카켈



목적
  - 클래스를 이해한다.

문제
사용자 삽입 이미지

코드





해설
  - 클래스를 사용하여 문제를 풀었습니다.
  - Stu.h Stu.cpp 2004_final_1.cpp 이렇게 구성되어 있으며 클래스내 맴버 구성은 아래와 같습니다.
  - m_Add() 맴버 함수는 맴버 변수에 저장될 자료의 추가를 m_Print() 맴버함수는 맴버 변수를 출력하고 m_Check() 는 y / n 값을 받아 y 이면 종료를 다른 값이면 n 을 받아 리턴하여 반복 할것인지 판정하는 함수 입니다.

  - Visual C++ 에서 프로그램상 클래스를 추가하는 방법입니다. 조금은 복잡하지만 이걸 알아 두면 나중에 복잡한 클래스 코드를 쉽게 구현할수 있습니다.

    Workspace 창에 보면 ClassView 이라는 창이 있습니다. 그곳에서 프로젝트 명을 오른쪽 버튼을 클릭 New Class... 를 선택하세요

사용자 삽입 이미지
 


    클래스의 종류와 이름을 선택하세요 여기서는 Generic Class 만 선택할수 있습니다. 상속이나 기타 다른 설정은 여기서 할 필요 없습니다.

사용자 삽입 이미지

    맴버 함수와 변수를 만들고 선택하세요. m_Add() m_Print() m_Check() 는 외부 main 함수 내에서 쓰기 때문에 public 으로 선언하시고 맴버 변수인 spName, spSid, spDepart 는 맴버 함수들에 의해서만 쓰여질 것이기 때문에 private 로 하시면 됩니다.

사용자 삽입 이미지

사용자 삽입 이미지
   
사용자 삽입 이미지

 코드를 완성하세요. 위에 쓰여진대로 쓰시거나 원하시는 코드를 넣으시면 됩니다. 단 쓰여질 범위는 클래스를 정의하는 cpp 파일에서 하시는게 좋습니다. 기본 마법사 툴에서 그렇게 하게 제공합니다.

사용자 삽입 이미지

    완성된 클래스의 형태입니다. 이렇게 하시면 Stu 라는 객체가 완성이 되는 것입니다.

사용자 삽입 이미지

파일 구조는 아래와 같습니다.
사용자 삽입 이미지

    잊지 마셔야 할 것은 그 함수를 쓰거나 자료형을 쓸려면 꼭 include 시켜줘야 하는 것입니다. 컴파일러는 프로젝트내에 파일이 열려있다는 사실만으로는 그 파일이 필요한지 그 자료형이 필요해서 자동으로 넣어 주지는 않습니다.

참고
  - 유사 문제

Posted by 카켈




목적
  - 클래스를 이해하고 외부 함수에서 클래스가 보호하고 있는 변수를 이용할 줄 안다.
  - 생성자를 이해한다.

문제

사용자 삽입 이미지

풀이

#include <iostream>

using namespace std;

 class cHexahedron
 {
  public:
   friend int i_Volumn(int, int, int);
   cHexahedron() { iX = iY = iZ = 0; }
   void v_GetValue();
   void v_Print();

  private:
   int iX, iY, iZ;

 };

void cHexahedron::v_GetValue()
{
 int aX, aY, aZ;
 aX = aY = aZ = 0;
 cout << "육면체의 가로, 세로, 높이를 입력하세요 : ";
 cin >> aX >> aY >> aZ;
 iX = aX; iY = aY; iZ = aZ;
 
 return;
 
}

void cHexahedron::v_Print()
{
 cout << "육면체의 부피 : " << i_Volumn(iX, iY, iZ) << endl;
 return;
}

int i_Volumn(int iX, int iY, int iZ)
{ return iX * iY * iZ; }

int main(void)
{
 cHexahedron cHex[3];
 for(int i = 0; i < 3; i++)
 {
  cout << i + 1 << "번째 ";
  cHex[i].v_GetValue();
 }
 
 for(i = 0; i < 3; i++)
 {
  cout << i + 1 << "번째 ";
  cHex[i].v_Print();
 }

 return 0;
}


해설
  - 클래스와 함수 구조입니다.

사용자 삽입 이미지
  -  iX 와 iY, IZ 는 private 로 보호된 맴버 변수 입니다. private 는 클래스의 맴버가 아닌 다른 외부 함수에서 불러다 쓸수 없습니다. 이를 정보 보호 / 은닉이라 하는데 자료의 효율적인 관리를 목적으로 만들어진 것입니다. 예외적으로 friend 함수를 두어 private 맴버라도 불러다 쓸수 있게 합니다. public 영역에서 friend 를 선언하여 남용을 방지 합니다.

  - 맴버 함수에서는 부른 객체 자신을 가리키는 this 객체가 기본적으로 존재 합니다. 이를 생략해서 그냥 iX, iY, iZ 를 써서 쓸수 있지만 이를 표기하여 this.iX this.iY this.iZ 로 쓸수 있습니다. 맴버 함수에서는 자신이 속한 클래스 객체의 맴버 변수를 쓸수 있으므로 private 로 선언된 맴버 변수도 자유롭게 쓸수 있습니다.

  - "i + 1 번째 " 만 따로 출력하여 공통된 부분의 출력부를 최소화 했습니다.

참고
  - 클래스는 C++ 의 가장 두들어진 객체지향적 특징입니다. C 에서는 극히 일부 기능을 구조체에서 제공하고 있습니다. 클래스는 잠깐 공부하기 보다 아래 페이지에서 자세히 공부 하시는게 이후 C++ 의 클래스를 이해하시는데 도움이 될 것입니다.

  - http://www.winapi.co.kr/clec/cpp4/cpp4.htm : winapi 에서 제공하는 C++ 문법

Posted by 카켈
이전페이지 1 다음페이지