Menu
Coddy logo textTech

요약 - Matrix 클래스

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 47번째.

challenge icon

챌린지

쉬움

이 장에서 배운 모든 연산자 오버로딩 기술을 하나로 모으는 Matrix 클래스를 만들어 보겠습니다. 직관적인 연산자 구문을 통해 산술 연산, 비교, 요소 접근 및 스트림 출력을 지원하는 완전한 기능을 갖춘 행렬을 만들게 됩니다.

코드는 다음 두 개의 파일로 구성됩니다:

  • Matrix.h: 동적 메모리를 사용하여 정수의 2차원 배열을 관리하는 Matrix 클래스를 정의합니다. 행렬은 다음을 지원해야 합니다:
    • Private 멤버: 2차원 데이터를 위한 int** 포인터, 행과 열을 위한 size_t 멤버
    • 행과 열을 인자로 받아 모든 요소를 0으로 초기화하는 생성자
    • 할당된 모든 메모리를 적절히 해제하는 소멸자
    • 복사 생성자 및 복사 대입 연산자 (자기 대입 검사를 포함한 깊은 복사)
    • Getter인 getRows()getCols() (둘 다 const)
    • 개별 요소를 설정하는 set(row, col, value) 메서드
    • 요소를 검색하는 get(row, col) const 메서드

    다음 연산자들을 구현하세요:

    • 산술 연산: 행렬 덧셈과 뺄셈을 위한 +- (새로운 Matrix를 값으로 반환)
    • 비교 연산: 두 행렬의 크기가 같고 요소가 동일한지 확인하는 ==!=
    • 스트림 연산: 행렬을 행 단위로 출력하며, 요소는 공백으로 구분하고 각 행은 줄바꿈으로 구분하는 friend 함수 <<
    • 첨자 연산: 행에 대한 포인터를 반환하여 matrix[row][col] 구문을 사용할 수 있게 하는 [] (const 및 non-const 버전 모두 제공)

    산술 연산자의 경우, 두 행렬의 크기가 같다고 가정합니다. 비교 연산자는 크기가 다를 경우 false를 반환해야 합니다.

  • main.cpp: 입력을 읽어 두 개의 2x2 행렬을 생성하고 조작합니다. 입력 형식은 다음과 같습니다:
    1. 첫 번째 행렬을 위한 4개의 정수 (행 단위): a00, a01, a10, a11
    2. 두 번째 행렬을 위한 4개의 정수 (행 단위): b00, b01, b10, b11

    두 개의 Matrix 객체(각각 2행 2열)를 생성하고, set() 메서드를 사용하여 값을 채운 다음, 구현한 연산자들을 시연하세요:

    출력 형식:

    Matrix A:
    <row0>
    <row1>
    Matrix B:
    <row0>
    <row1>
    A + B:
    <row0>
    <row1>
    A - B:
    <row0>
    <row1>
    A == B: <true/false>
    A != B: <true/false>
    A[0][0]: <value>
    A[1][1]: <value>

    각 행의 요소는 단일 공백으로 구분하여 표시해야 합니다. 비교 결과는 true 또는 false (소문자)로 출력하세요.

예를 들어, 행렬 A에 대해 1 2 3 4를 입력하고 행렬 B에 대해 5 6 7 8을 입력한 경우:

Matrix A:
1 2
3 4
Matrix B:
5 6
7 8
A + B:
6 8
10 12
A - B:
-4 -4
-4 -4
A == B: false
A != B: true
A[0][0]: 1
A[1][1]: 4

입력 변환에는 std::stoi()를 사용하세요. 연산자의 일관성을 유지하기 위해 ==를 사용하여 !=를 구현하는 것을 잊지 마세요. 헤더 파일에 헤더 가드(header guards)를 포함하는 것도 잊지 마세요.

직접 해보기

#include <iostream>
#include <string>
#include "Matrix.h"

using namespace std;

int main() {
    // 첫 번째 행렬(2x2)에 대한 입력 읽기: a00, a01, a10, a11
    int a00, a01, a10, a11;
    cin >> a00 >> a01 >> a10 >> a11;
    
    // 두 번째 행렬(2x2)에 대한 입력 읽기: b00, b01, b10, b11
    int b00, b01, b10, b11;
    cin >> b00 >> b01 >> b10 >> b11;
    
    // TODO: 두 개의 Matrix 객체 생성 (각각 2행 2열)
    
    // TODO: set() 메서드를 사용하여 행렬 채우기
    
    // TODO: Matrix A 출력
    // cout << "Matrix A:" << endl;
    // 행렬을 출력하기 위해 << 연산자 사용
    
    // TODO: Matrix B 출력
    // cout << "Matrix B:" << endl;
    // 행렬을 출력하기 위해 << 연산자 사용
    
    // TODO: A + B 출력
    // cout << "A + B:" << endl;
    
    // TODO: A - B 출력
    // cout << "A - B:" << endl;
    
    // TODO: 비교 결과 출력
    // cout << "A == B: " << (true/false를 위해 삼항 연산자 사용) << endl;
    // cout << "A != B: " << (true/false를 위해 삼항 연산자 사용) << endl;
    
    // TODO: 첨자 접근(subscript access) 결과 출력
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

객체 지향 프로그래밍의 모든 레슨