IT 프로그래밍/객체지향프로그래밍

객체지향프로그래밍 4과 그룹액티비티 1번 2번\

기술1 2024. 4. 21. 21:17
반응형

 

 

객체지향프로그래밍 1번

 

constructor1: 이 메시지는 클래스 A의 디폴트 생성자가 호출되어 객체가 생성될 때 출력됩니다. 즉, 객체가 생성되면서 멤버 변수들을 초기화하는 함수입니다.
constructor2: 이 메시지는 클래스 A의 매개변수를 받는 생성자가 호출되어 객체가 생성될 때 출력됩니다. 이 생성자는 int 형식의 매개변수를 받아 멤버 변수를 초기화합니다.
constructor1: 이 메시지는 vector<A> vec_b(2);에서 생성된 벡터가 초기화될 때, 벡터 내의 요소들이 디폴트 생성자를 호출하여 초기화될 때 출력됩니다. 따라서 이 경우, 벡터 내의 요소가 디폴트 생성자를 호출하게 되어 "constructor1"이 출력됩니다.
constructor1: 또 다른 메시지로, 이 역시 vector<A> vec_b(2);에서 생성된 벡터가 초기화될 때, 벡터 내의 요소들이 디폴트 생성자를 호출하여 초기화될 때 출력됩니다. 마찬가지로 이 경우에도 벡터 내의 요소가 디폴트 생성자를 호출하게 되어 "constructor1"이 출력됩니다.


요약하면, 프로그램이 종료된 후 출력된 내용은 생성자 호출과 관련이 있습니다. 이 메시지들은 클래스 A의 생성자가 호출되어 객체가 초기화될 때마다 출력되는 것입니다.


디폴트 생성자(default constructor)란?
  ▷ 매개변수가 없는 생성자, 또는 모든 매개변수에 디폴트 인수가 지정된 생성자
  ▷ 클래스 선언 시 생성자를 선언 안하면 컴파일러가 알아서 디폴트 생성자를 정의해준다.
  ▷ 생성자를 하나라도 선언하면 컴파일러는 묵시적으로 디폴트 생성자 정의하지 않는다.

 

이 코드는 클래스 A를 정의하고 해당 클래스의 객체를 배열로 생성하는 예시입니다. 

 

클래스 A 정의: 클래스 A는 하나의 멤버 변수 data를 가지고 있습니다.


클래스 A에는 두 개의 생성자가 정의되어 있습니다.

 

디폴트 생성자(A())는 매개변수를 받지 않고 객체를 생성할 때 호출됩니다. 이 생성자는 data 멤버 변수를 초기화하고 "constructor1"을 출력합니다. 매개변수를 받는 생성자(A(int a))는 정수형 매개변수를 받아 data 멤버 변수를 초기화하고 "constructor2"를 출력합니다.

 

객체 배열 생성:
main 함수에서는 두 개의 객체 배열을 생성합니다.

 

첫 번째 배열 arr은 크기가 3인 A 클래스 객체 배열입니다. 이 배열을 생성할 때 디폴트 생성자가 호출되어 각 객체가 초기

화됩니다. 따라서 "constructor1"이 세 번 출력됩니다.


두 번째 배열 arr2는 크기가 4인 A 클래스 객체 배열입니다. 이 배열을 생성할 때는 각 요소의 초기값이 지정되어 있으므로, 해당 값들을 이용하여 두 번째 생성자가 호출됩니다. 따라서 "constructor2"가 네 번 출력됩니다.

 

어진 코드에서 class A에는 매개변수를 받는 생성자 A(int a)만 정의되어 있습니다. 그러나 main 함수에서 객체 x를 생성할 때 매개변수 없이 생성하려고 하고 있습니다. 이는 오류를 발생시킵니다.

A x;에서 x 객체를 생성할 때는 디폴트 생성자가 필요하지만, 클래스 A에는 디폴트 생성자가 정의되어 있지 않습니다. 그래서 컴파일러는 디폴트 생성자를 찾을 수 없다는 오류를 발생시킵니다.

해결 방법은 다음 중 하나를 선택할 수 있습니다:

클래스 A에 디폴트 생성자를 추가합니다.

 

A x; 대신 A x(0);과 같이 매개변수를 주어 매개변수를 받는 생성자를 호출합니다.


주어진 코드에서 class A에는 매개변수를 받는 생성자 A(int a)만 정의되어 있습니다. 그러나 main 함수에서 객체 x를 생성할 때 매개변수 없이 생성하려고 하고 있습니다. 이는 오류를 발생시킵니다.

따라서 main 함수에서 A x;와 같이 객체 x를 생성할 때 컴파일 오류가 발생합니다. 이를 해결하기 위해서는 A 클래스에 디폴트 생성자를 정의해야 합니다.

아래와 같이 디폴트 생성자를 추가하면 됩니다:

class A {
public:
    int data;
    A() : data(0) {} // 디폴트 생성자 추가
    A(int a) : data(a) {}
};

A arr[3]: 배열 arr을 선언하면서 초기화되지 않았습니다. 클래스 A에는 디폴트 생성자가 정의되어 있지 않으므로, 배열의 각 요소를 디폴트 생성자로 초기화할 수 없습니다. 이렇게 되면 컴파일 오류가 발생합니다.

 

A arr2[4] = {1, 2, 3, 4};: 배열 arr2를 선언하면서 초기화되었습니다. 그러나 A 클래스에는 int 타입의 매개변수를 받는 생성자만 정의되어 있으므로, 초기화 리스트 {1, 2, 3, 4}에서 int 값들을 받아들이지 못합니다. 이 경우 컴파일 오류가 발생합니다.

 

따라서 이 코드에서는 초기화가 올바르게 이루어지지 않았기 때문에 컴파일 오류가 발생합니다.

해당 코드에서 발생하는 오류를 설명하겠습니다.

A arr[3];: 배열 arr은 길이가 3인 A 객체 배열을 선언하고 있습니다. 그러나 클래스 A에는 디폴트 생성자가 정의되어 있지 않습니다. 배열을 선언할 때 디폴트 생성자로 각 요소를 초기화할 수 없으므로, 컴파일러는 오류를 발생시킵니다. 해결 방법으로는 클래스 A에 디폴트 생성자를 추가하는 것입니다.

 

A arr2[4] = {1, 2, 3, 4};: 배열 arr2는 길이가 4인 A 객체 배열을 선언하고 있으며, 초기화를 시도하고 있습니다. 그러나 클래스 A에는 int 값을 받는 생성자만 정의되어 있기 때문에, 초기화 리스트에서는 int 값만 받을 수 있습니다. 하지만 배열 arr2는 A 객체를 초기화하려고 하므로, 이는 타입 불일치로 인한 컴파일 오류를 발생시킵니다. 해결 방법으로는 A 클래스에 int 값을 받지 않는 생성자를 추가하는 것이 필요합니다.

#include <iostream>

class A {
public:
    int data;
    A() : data(0) {} // 디폴트 생성자 추가
    A(int a) : data(a) {}
};

int main() {
    A arr[3]; // 디폴트 생성자를 사용하여 배열을 초기화
    A arr2[4] = { A(1), A(2), A(3), A(4) }; // 클래스 A의 객체를 각각 초기화
    return 0;
}
class A {
public:
    int data;
    A() = default; // 기본 생성자를 명시적으로 선언
    A(int a) : data(a) {}
};

int main() {
    A arr[3]; // 디폴트 생성자를 사용하여 배열을 초기화
    A arr2[4] = {A(1), A(2), A(3), A(4)}; // 클래스 A의 객체를 각각 초기화
    return 0;
}


첫 번째 오류는 디폴트 생성자가 없는데 배열을 초기화하려고 하기 때문에 발생합니다. 이를 해결하기 위해 클래스 A에 디폴트 생성자를 추가할 수 있습니다.

두 번째 오류는 배열을 초기화하는 과정에서 클래스 A에 대한 생성자가 int 타입의 인수를 받는 것만 존재하는데, 초기화 리스트에서 int 값을 넘기고 있기 때문에 발생합니다. 이를 해결하기 위해 클래스 A에 int 값을 받는 생성자 외에도 디폴트 생성자 또는 int 값을 받지 않는 생성자를 추가하여야 합니다.

이 코드는 두 개의 클래스인 A와 B를 정의하고, A 클래스의 객체를 생성하여 B 클래스의 객체에 전달하는 예제입니다.

클래스 A:
A 클래스에는 두 개의 생성자가 있습니다.
첫 번째 생성자는 매개변수 없이 객체를 생성하며, 생성될 때 "constructor1"을 출력합니다.
두 번째 생성자는 정수 매개변수를 받아들여 객체를 생성하며, 받은 값을 data 멤버에 할당하고 "constructor2"를 출력합니다.
클래스 B:
B 클래스에는 A 클래스의 객체를 멤버로 가집니다.
B 클래스의 생성자는 A 클래스의 객체를 받아들여 멤버로 저장하고 "B's constructor"를 출력합니다.
main() 함수:
먼저 A 클래스의 객체 obj_a를 정수 2를 인자로하여 생성합니다. 이때, "constructor2"가 출력됩니다.
그 다음, obj_a를 인자로하여 B 클래스의 객체 obj_b를 생성합니다. 이때, B 클래스의 생성자가 호출되어 A 클래스의 객체를 B 클래스의 멤버로 저장하고 "B's constructor"가 출력됩니다.

A obj_a(2);: 정수 2를 매개변수로 전달하여 A 클래스의 객체 obj_a를 생성합니다. 이때 생성자 A(int a)가 호출되어 "constructor2"가 출력됩니다.
B obj_b(obj_a);: A 클래스의 객체 obj_a를 인자로하여 B 클래스의 객체 obj_b를 생성합니다. 이때 B 클래스의 생성자 B(A c)가 호출됩니다. 여기서 mem = c; 구문이 실행됩니다. 이때 mem 멤버 변수는 이미 생성된 객체 obj_a를 가리키게 됩니다. 따라서 mem 멤버 변수를 초기화 하는 과정에서 A 클래스의 디폴트 생성자가 호출됩니다. 이후 "constructor1"이 출력되고, 그 다음에 "B's constructor"가 출력됩니다.

 

A 클래스:
A 클래스에는 두 개의 생성자가 있습니다.
첫 번째는 디폴트 생성자이며, data 멤버 변수를 0으로 초기화합니다.
두 번째 생성자는 정수를 매개변수로 받아 data 멤버 변수를 해당 값으로 초기화합니다.
생성자가 호출될 때 각각 "constructor1 of A" 또는 "constructor2 of A"를 출력합니다.
B 클래스:
B 클래스는 vector<A> 타입의 vec 멤버 변수와 A 클래스의 객체 z를 가지고 있습니다.
또한 두 개의 생성자가 있습니다.
첫 번째 생성자는 디폴트 생성자로, 아무 동작을 하지 않고 "constructor1 of B"를 출력합니다.
두 번째 생성자는 vector<A> 타입의 매개변수를 받아 vec 멤버 변수를 초기화합니다. 그 후 "constructor 2 of B"를 출력합니다.
그리고 main 함수에서는 다음과 같은 작업을 수행합니다:

A x(10);: A 클래스의 정수를 매개변수로 받는 생성자를 호출하여 x 객체를 생성합니다. 이때 "constructor2 of A"가 출력됩니다.
vector<A> vec_a;: A 클래스의 객체를 담는 벡터 vec_a를 생성합니다.
A arr[4];: 크기가 4인 A 클래스 객체 배열 arr을 생성합니다. 이 배열의 각 요소들은 디폴트 생성자를 호출하여 초기화됩니다. 따라서 "constructor1 of A"가 네 번 출력됩니다.
B y(vec_a);: B 클래스의 vector<A> 타입을 매개변수로 받는 생성자를 호출하여 y 객체를 생성합니다. 이때 생성자 내에서는 vec 멤버 변수가 전달된 벡터를 복사합니다. 그 후 "constructor 2 of B"가 출력됩니다.

 

Rectangle 클래스: 이 클래스는 사각형을 표현합니다. 사각형의 좌표를 저장하고, 교차 여부를 확인하는 메서드를 가질 수 있습니다.
RectangleIntersectionFinder 클래스: 이 클래스는 주어진 사각형과 교차하는 모든 사각형을 찾는 역할을 합니다. 이를 위해 주어진 사각형과 다른 사각형들을 비교하고 교차하는지 여부를 판단하는 메서드를 가질 수 있습니다.

#include <iostream>
#include <vector>

using namespace std;

// 사각형 클래스 정의
class Rectangle {
private:
    int x1, y1, x2, y2; // 왼쪽 위와 오른쪽 아래 좌표

public:
    Rectangle(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}

    // 교차하는지 여부를 확인하는 메서드
    bool intersects(const Rectangle& other) const {
        return (x1 < other.x2 && x2 > other.x1 && y1 < other.y2 && y2 > other.y1);
    }

    // 내부에 포함되는지 여부를 확인하는 메서드
    bool contains(const Rectangle& other) const {
        return (x1 <= other.x1 && x2 >= other.x2 && y1 <= other.y1 && y2 >= other.y2);
    }

    // 사각형 정보를 출력하는 메서드
    void print() const {
        cout << "(" << x1 << ", " << y1 << "), (" << x2 << ", " << y2 << ")" << endl;
    }
};

// 주어진 사각형과 교차하는 사각형을 찾아 출력하는 함수
void findIntersectingRectangles(const Rectangle& target, const vector<Rectangle>& rectangles) {
    cout << "Rectangles intersecting with the target rectangle:" << endl;
    for (const auto& rect : rectangles) {
        if (rect.intersects(target)) {
            rect.print();
        }
    }
}

// 주어진 사각형 내부에 포함되는 사각형을 찾아 출력하는 함수
void findContainingRectangles(const Rectangle& target, const vector<Rectangle>& rectangles) {
    cout << "Rectangles contained within the target rectangle:" << endl;
    for (const auto& rect : rectangles) {
        if (target.contains(rect)) {
            rect.print();
        }
    }
}

int main() {
    // 주어진 사각형들
    vector<Rectangle> rectangles = {
        Rectangle(1, 1, 5, 5),
        Rectangle(3, 3, 7, 7),
        Rectangle(6, 6, 9, 9),
        Rectangle(8, 8, 12, 12),
        Rectangle(10, 10, 15, 15)
    };

    // 주어진 사각형과 비교할 대상 사각형
    Rectangle targetRectangle(4, 4, 10, 10);

    // 교차하는 사각형 찾기
    findIntersectingRectangles(targetRectangle, rectangles);

    // 내부에 포함되는 사각형 찾기
    findContainingRectangles(targetRectangle, rectangles);

    return 0;
}

 

 

#include <iostream>
#include <vector>

using namespace std;

// 사각형 클래스 정의
class Rectangle {
private:
    int x1, y1, x2, y2; // 왼쪽 위와 오른쪽 아래 좌표

public:
    Rectangle(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}

    // 교차하는지 여부를 확인하는 메서드
    bool intersects(const Rectangle& other) const {
        return (x1 < other.x2 && x2 > other.x1 && y1 < other.y2 && y2 > other.y1);
    }

    // 내부에 포함되는지 여부를 확인하는 메서드
    bool contains(const Rectangle& other) const {
        return (x1 <= other.x1 && x2 >= other.x2 && y1 <= other.y1 && y2 >= other.y2);
    }

    // 사각형 정보를 출력하는 메서드
    void print() const {
        cout << "(" << x1 << ", " << y1 << "), (" << x2 << ", " << y2 << ")" << endl;
    }
};

// 주어진 사각형과 교차하는 사각형을 찾아 출력하는 함수
void findIntersectingRectangles(const Rectangle& target, const vector<Rectangle>& rectangles) {
    cout << "Rectangles intersecting with the target rectangle:" << endl;
    for (const auto& rect : rectangles) {
        if (rect.intersects(target)) {
            rect.print();
        }
    }
}

// 주어진 사각형 내부에 포함되는 사각형을 찾아 출력하는 함수
void findContainingRectangles(const Rectangle& target, const vector<Rectangle>& rectangles) {
    cout << "Rectangles contained within the target rectangle:" << endl;
    for (const auto& rect : rectangles) {
        if (target.contains(rect)) {
            rect.print();
        }
    }
}

int main() {
    // 입력 받기
    int n;
    cout << "Enter the number of rectangles: ";
    cin >> n;

    vector<Rectangle> rectangles;

    cout << "Enter coordinates of rectangles (x1, y1, x2, y2):" << endl;
    for (int i = 0; i < n; ++i) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        rectangles.emplace_back(x1, y1, x2, y2);
    }

    // 비교할 대상 사각형 입력 받기
    int targetX1, targetY1, targetX2, targetY2;
    cout << "Enter coordinates of the target rectangle (x1, y1, x2, y2): ";
    cin >> targetX1 >> targetY1 >> targetX2 >> targetY2;

    Rectangle targetRectangle(targetX1, targetY1, targetX2, targetY2);

    // 교차하는 사각형 찾기
    findIntersectingRectangles(targetRectangle, rectangles);

    // 내부에 포함되는 사각형 찾기
    findContainingRectangles(targetRectangle, rectangles);

    return 0;
}
반응형