[심화프로그래밍] Week11

Yoons·2022년 11월 20일
0
post-thumbnail

실습 보고서 작성 요령


문제분석

  • 결과 화면을 캡쳐 하여 첨부, 해당 결과가 도출된 이유와 타당성 분석

프로그램 설계 및 알고리즘

  • 해결 방법에 따라 프로그램 설계 및 알고리즘 등 기술
  • e.g.) 문제 해결 과정 및 핵심 알고리즘 기술

소스코드 및 주석

  • 소스코드와 그에 해당하는 주석 첨부
  • 각각의 함수가 수행하는 작업, 매개변수, 반환 값 등을 명시
  • 소스코드 전체 첨부(소스코드 화면 캡처X, 소스코드는 복사/붙여넣기로 첨부)

결과 및 결과 분석

  • 결과 화면을 캡쳐 하여 첨부, 해당 결과가 도출된 이유와 타당성 분석

소감

  • 실습 문제를 통해 습득할 수 있었던 지식, 느낀 점 등을 기술

Prob 1

문제분석

Box1과 Box2의 가로, 세로, 높이 길이를 입력 받아 부피를 계산하고 Box3는 연산자 중복을 통해 Box1과 Box2의 가로, 세로, 높이 길이를 각각 더한 결과로부터 부피를 계산하는 프로그램이다. 매개변수가 있는 생성자와 부피를 계산하는 show함수를 만들어 Box1과 Box2의 부피를 계산하고, 연산자 중복을 구현하여 Box3을 계산한다.

프로그램 설계 및 알고리즘

  1. Box 클래스를 생성하고 매개변수가 있는 생성자, 부피를 계산하는 show 함수, 연산자 중복을 선언 및 구현한다.
  2. (main function) Box 클래스 객체 box1, box2, box3를 생성하고, box1과 box2에는 가로, 세로, 높이에 대한 매개변수값을 전달한다.
  3. (main function) box3는 클래스 내부에서 선언한 연산자 중복을 호출하여 선언한다.
  4. (main function) show()를 통해 box1, box2, box3의 부피를 보여준다.

소스코드 및 주석

#include <iostream>
using namespace std;

class Box { // Box 클래스 생성
    int x,y,z; // private 멤버 변수
public: // public 접근 지정자 
    Box(int x=0, int y=0, int z=0) { // x, y, z를 매개변수로 받는 생성자
        this->x = x; // 매개변수 x를 멤버 변수 x에 저장
        this->y = y; // 매개변수 y를 멤버 변수 y에 저장
        this->z = z; // 매개변수 z를 멤버 변수 z에 저장
    };

    void show(){ // 부피를 계산하는 show 함수
        cout << x*y*z << "cm3" << endl; // x*y*z를 계산하여 출력
    };

    Box operator+ (Box op2){ // 연산자 중복
        Box tmp; // 임시 객체 생성
        tmp.x = this->x + op2.x; // x 더하기
        tmp.y = this->y + op2.y; // y 더하기
        tmp.z = this->z + op2.z; // z 더하기
        return tmp; // 더한 결과 리턴
    }; // + 연산자 함수 선언
};

int main() {
    Box box1(3,5,4), box2(4,6,4), box3; // 객체 생성
    box3 = box1 + box2; // + 연산자 호출
    cout << "box1 부피 : ";
    box1.show(); // box1 부피 출력

    cout << "box2 부피 : ";
    box2.show(); // box2 부피 출력

    cout << "box3 부피 : ";
    box3.show(); // box3 부피 출력
}

결과 및 결과 분석


box1의 경우 가로, 세로, 높이가 각각 3, 5, 7이므로 3x5x4 = 60cm3, box2의 경우 4x6x4 = 96cm3, box3의 경우 box1과 box2의 가로, 세로, 높이를 각각 더하여 계산하므로 (3+3)x(5+5)x(7+4) = 616cm3으로 잘 출력되는 것을 확인할 수 있다.

소감

이항연산자 중복을 사용하는데, 형식이 어색해 이해가 잘 가지 않았다. 또한 이걸 굳이 왜 쓸까하는 생각이 들었지만, 클래스와 객체의 특징 상 내용물이 바뀐다는 점에서 연산자 중복을 사용하면 객체 내의 서로 다른 변수에 대해 쉽게 연산을 할 수 있다는 점을 이해했다.


Prob 2

문제분석

d1과 d2의 feet과 inch를 각각 받아 출력하고 프렌드 함수를 포함해 연산자 중복을 사용하여 거리의 합을 출력하는 프로그램이다. 입력 받은 d1과 d2의 feet, inch를 출력하여 보여주는 show 함수와 d1, d2의 합을 출력하는 output 함수로 나눠 구현한다. 연산자 중복을 구현할 때는 클래스 내부에서 프렌드 함수를 사용하고 외부에서 함수를 구현한다.

프로그램 설계 및 알고리즘

  1. Distance 클래스를 생성하고 초기값이 0인 생성자를 선언 및 구현하고 d1, d2의 feet과 inch를 보여주는 show 함수, 거리의 합 결과를 보여주는 output 함수, 프렌드 함수를 사용한 연산자 중복 함수를 선언한다.
  2. show 함수와 output 함수에서는 각각 실행 결과 예시에 맞게 출력될 수 있도록 작성한다.
  3. 연산자 중복 함수에서 d1, d2의 feet과 inch를 각각 더해 저장하는 함수를 구현한다.
  4. (main function) 객체 a, b를 매개변수와 함께 생성하고, 객체 c는 매개변수 없이 생성한다.
  5. (main function) a, b의 feet과 inch를 보여주고, c는 연산자 중복 함수를 호출하여 계산 후 출력한다.

소스코드 및 주석

#include <iostream>
using namespace std;

class Distance { // Distace 클래스 생성
    int feet; // private 멤버 변수
    int inch; 
public: // public 접근 지정자
    Distance(int feet=0, int inch=0) { // 매개변수의 초기값이 0인 생성자
        this -> feet = feet; // 매개변수 feet을 멤버 변수 feet으로
        this -> inch = inch; // 매개변수 inch를 멤버 변수 inch로
    }
    void show(); // 기존의 feet과 inch를 보여주는 show 함수
    void output(); // 거리의 합 결과를 보여주는 output 함수
    friend Distance operator+(Distance a, Distance b); // 연산자 중복 함수 프렌드 선언
};

void Distance::show() { // show 함수
    cout << feet << " feet, " << inch << " inch" << endl; // feet과 inch 출력
}

void Distance::output(){ // output 함수
    cout << "두 개(d1, d2)의 거리의 합 : " << feet << " feet, " << inch << " inch" << endl; // 합 결과 feet과 inch 출력
}

Distance operator+(Distance a, Distance b) { // 연산자 중복 함수
    Distance tmp; // 임시 객체 생성
    tmp.feet = a.feet + b.feet; // feet 더하기
    tmp.inch = a.inch + b.inch; // inch 더하기
    return tmp; // 임시 객체 리턴
}

int main() {
    Distance a(13,4), b(20,40), c; // a, b, c 객체 생성

    cout << "d1(feet, inch) : ";
    a.show(); // 객체 a의 feet과 inch 출력

    cout << "d2(feet, inch) : ";
    b.show(); // 객체 b의 feet과 inch 출력

    c = a + b; // 연산자 중복 함수 호출
    c.output(); // 객체 c의 feet과 inch 출력
}

결과 및 결과 분석


d1(a)의 feet과 inch를 각각 13, 4로 입력하고, d2(b)의 feet과 inch를 각각 20, 40으로 입력 받았으므로 거리의 합은 33 feet, 44 inch로 출력됨을 확인할 수 있다.

소감

프렌드 함수의 경우 private 접근 지정자의 영향을 받지 않고 사용할 수 있다는 특징을 갖고 있는 만큼 캡슐화 된 정보 사이에서 자유롭게 사용할 수 있다는 장점이 있다. 캡슐화의 의미가 보안에 있는 만큼 프렌드 함수를 많이 사용할까하는 의문은 들지만, 많은 보안 사이에서 다른 캡슐의 정보를 써야할 때가 있을 떄 사용할 수 있겠다하는 생각이 들었다.


Reference

profile
모든 글은 저의 눈물을 머금으며 작성한 글이니..재밌게 봐주세요 :) 깃헙 맞팔@

0개의 댓글