Menu
CoddyTech

요약 - Matrix 클래스

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

challenge icon

챌린지

쉬움

이번 장에서 배운 모든 연산자 오버로딩 기법을 하나로 모은 Matrix 클래스를 만들어 봅시다. 산술 연산, 비교, 요소 접근, 스트림 출력을 지원하는 완전한 기능의 행렬을 만들고, 직관적인 연산자 구문으로 이를 모두 구현합니다.

코드를 두 파일로 나눠 작성합니다.

  • Matrix.h: 동적 메모리를 사용해 2차원 정수 배열을 관리하는 Matrix 클래스를 정의합니다. 행렬은 다음 기능을 지원해야 합니다.
    • 비공개 멤버: 2차원 데이터용 int** 포인터와 행 및 열을 위한 size_t 멤버
    • 행과 열을 인수로 받고 모든 요소를 0으로 초기화하는 생성자. 행 포인터 배열을 할당한 다음 각 행을 할당합니다. data = new int*[rows]; 및 각 행 r에 대해 data[r] = new int[cols];
    • 할당된 메모리를 모두 올바르게 해제하는 소멸자: 먼저 각 행에 delete[]를 적용한 다음 delete[] data;를 적용합니다.
    • 복사 생성자와 복사 대입 연산자(자기 대입 확인을 포함한 깊은 복사)
    • 게터 getRows() 및 getCols()(둘 다 const)
    • 각 요소의 값을 설정하는 set(row, col, value) 메서드
    • 요소를 가져오는 const 메서드 get(row, col)

    다음 연산자를 구현합니다.

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

    산술 연산자는 두 행렬의 차원이 같다고 가정합니다. 비교 연산자는 차원이 다르면 false를 반환해야 합니다.

  • main.cpp: 두 개의 2x2 행렬을 생성하고 조작할 수 있도록 입력을 읽습니다. 입력 형식은 다음과 같습니다.
    1. 첫 번째 행렬의 정수 네 개(행별): a00, a01, a10, a11
    2. 두 번째 행렬의 정수 네 개(행별): 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이고 Matrix 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

연산자의 일관성을 유지하기 위해 !=는 ==를 사용해 구현해야 합니다. 헤더 파일에 헤더 가드를 추가하는 것도 잊지 마세요.

직접 해보기

#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;
    // &lt;&lt; 연산자를 사용해 행렬 출력하기
    
    // TODO: Matrix B 출력하기
    // cout << "Matrix B:" << endl;
    // &lt;&lt; 연산자를 사용해 행렬 출력하기
    
    // 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: 첨자 연산자를 통한 접근 결과 출력
    // cout << "A[0][0]: " << ... << endl;
    // cout << "A[1][1]: " << ... << endl;
    
    return 0;
}

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

직접 연습해 보세요: 온라인 C++ 컴파일러