카테고리 없음

202208026이종윤 c프로그래밍 9주차수업후과제

jong133 2024. 10. 29. 13:48

기본적인 캡슐화의 예이다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

객체가멤버에접근할때 .이나 ->를 사용한다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

벡터와 섹터를 이용해서 반드시 접근해야된다. =을 쓰면안된다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

뤼튼에게 이 소스의 단점을 물어봤다.

 

소스를 직접 실행해보았다.
실습
null문자가 자동으로 뒤에 딸려온다.
배열을 복사할때 string copy함수를 이용하여 복사한다. string이나 string.h를 쓴다.
string형 실습
캐릭터형보다 스트링형을 쓰는게 더 편하다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

문자열을 리턴할때는 string형이나 const char*형을 쓰면된다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

문자열을 쓸때는 std::string을 사용한다.
배열 객체, 마지막은 4로 끝난다. //Dog dd[5]

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

생성자와 소멸자는 객체가 만들어지는 생성자가 자동으로 호출되고 소멸자도 자동으로 호출된다,

뤼튼에게 질문해보았다.

자바,파이썬,c언어 등등 생성자와 소멸자를 예를들어 알려줘

답변

각 언어에서 생성자와 소멸자의 사용 예제를 보여드리겠습니다.

1. C++
cpp


#include <iostream>
using namespace std;

class Dog {
private:
    string name;

public:
    // 생성자
    Dog(string n) : name(n) {
        cout << name << "가 태어났습니다!" << endl;
    }

    // 소멸자
    ~Dog() {
        cout << name << "가 사라졌습니다!" << endl;
    }
};

int main() {
    Dog happy("해피"); // 생성자 호출
    return 0; // 소멸자 호출
}
2. Java
java


class Dog {
    private String name;

    // 생성자
    Dog(String n) {
        name = n;
        System.out.println(name + "가 태어났습니다!");
    }

    // 소멸자 (Java에서는 finalize 메서드를 사용)
    protected void finalize() {
        System.out.println(name + "가 사라졌습니다!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog happy = new Dog("해피"); // 생성자 호출
        happy = null; // 소멸자 호출을 유도
        System.gc(); // 가비지 컬렉션 요청
    }
}
3. Python
파이썬은 소멸자를 __del__ 메서드로 구현합니다.

python


class Dog:
    def __init__(self, name):
        self.name = name
        print(f"{self.name}가 태어났습니다!")

    def __del__(self):
        print(f"{self.name}가 사라졌습니다!")

happy = Dog("해피")  # 생성자 호출
del happy  # 소멸자 호출
4. C
C 언어는 객체 지향 개념이 없지만, 구조체와 함수를 사용하여 비슷한 기능을 구현할 수 있습니다.

c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Dog {
    char name[50];
} Dog;

// 생성자
Dog* createDog(const char* name) {
    Dog* newDog = (Dog*)malloc(sizeof(Dog));
    strcpy(newDog->name, name);
    printf("%s가 태어났습니다!\n", newDog->name);
    return newDog;
}

// 소멸자
void deleteDog(Dog* dog) {
    printf("%s가 사라졌습니다!\n", dog->name);
    free(dog);
}

int main() {
    Dog* happy = createDog("해피"); // 생성자 호출
    deleteDog(happy); // 소멸자 호출
    return 0;
}
각 언어에서 생성자와 소멸자의 개념을 통해 객체의 생명 주기를 관리할 수 있습니다. C++과 Java에서는 클래스의 멤버 함수로, Python에서는 특별한 메서드로 구현되며, C에서는 동적 메모리 할당과 해제를 통해 유사한 기능을 구현합니다.

객체를 초기화하는 방법

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

직접 멤버변수의 초기값을 지정할때 좋은 방법은 아니다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

멤버변수초기화실습
전혀 기능이 없는 얘가 내부적으로는 만들어지고 자동으로 만들어지는걸 생성자,implicit가 붙는다,

13번째줄에서 생성자로 넘어가서 나이를 한살로 바꾼다.

세가지가 똑같은 방법이다.

Dog() { age = 1; }
Dog():age(1){ }
Dog() :age{ 1 } { } 의 차이

답변

주어진 세 가지 코드 조각은 C++에서 생성자를 정의하는 방법에 대한 다양한 예시입니다. 각각의 문법을 설명하겠습니다.

1. Dog() { age = 1; }
이 생성자는 기본 생성자로, 객체가 생성될 때 age 멤버 변수를 1로 초기화합니다.

cpp


class Dog {
private:
    int age;

public:
    Dog() { 
        age = 1; // age를 1로 초기화
    }
};
2. Dog() : age(1) { }
이 생성자는 초기화 리스트를 사용하여 age 멤버 변수를 1로 초기화합니다. 초기화 리스트를 사용하면 멤버 변수를 생성할 때 직접 값을 지정할 수 있어 성능이 더 좋습니다.

cpp


class Dog {
private:
    int age;

public:
    Dog() : age(1) { // 초기화 리스트를 사용하여 age를 1로 초기화
    }
};
3. Dog() : age{ 1 } { }
이 생성자도 초기화 리스트를 사용하지만, 중괄호 {}를 사용하여 초기화합니다. C++11부터 도입된 리스트 초기화 방식으로, 기본 타입과 사용자 정의 타입 모두에 사용할 수 있습니다.

cpp


class Dog {
private:
    int age;

public:
    Dog() : age{ 1 } { // 리스트 초기화를 사용하여 age를 1로 초기화
    }
};
요약
첫 번째 방법은 단순한 대입을 사용하여 초기화합니다.
두 번째 방법과 세 번째 방법은 초기화 리스트를 사용하며, 성능상 이점이 있습니다.
세 번째 방법은 C++11 이후에 도입된 문법으로, 더 안전하고 직관적인 초기화를 제공합니다.
따라서, 생성자를 정의할 때는 초기화 리스트를 사용하는 것이 더 효율적이고, 코드의 가독성 또한 높아집니다.

전통적인초기화방법은 copy initialization, 변수명 다음에 괄호열고 쓰는것을 직접초기화,중괄호 열고닫고 초기화하는 방법은 유니폼 초기화

시험에 꼭나온다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

첫번째 방법이 가장 일반적인 방법인데 요즘은 두번째 방법을 많이쓴다. 여러개가있을때는 ,로해서 쭉써주면된다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

생성자의 매개변수로 멤버변수 초기화 실습
직접초기화
유니폼초기화
C++에서 "Rule of Five"는 자원 관리를 효율적으로 수행하기 위해 특별히 설계된 규칙입니다. 이 규칙은 클래스가 동적 메모리 할당과 같은 자원을 관리할 때, 다음 다섯 가지 특수 멤버 함수를 정의해야 한다는 것을 의미합니다: 생성자 (Constructor): 객체를 초기화합니다. 복사 생성자 (Copy Constructor): 객체를 복사할 때 호출되며, 새 객체가 기존 객체의 자원을 올바르게 복사하도록 합니다. 복사 대입 연산자 (Copy Assignment Operator): 이미 존재하는 객체에 다른 객체의 값을 대입할 때 호출됩니다. 자원 관리가 필요할 경우 이를 구현해야 합니다. 이동 생성자 (Move Constructor): 객체의 자원을 다른 객체로 "이동"할 때 호출됩니다. 자원을 소유권을 이전하는 방식으로 관리합니다. 이동 대입 연산자 (Move Assignment Operator): 이미 존재하는 객체에 다른 객체의 자원을 "이동"할 때 호출됩니다.

이건 시험문제안나온다.

출처:https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA

 

Smile Han

 

www.youtube.com

소멸자 실습
함수가 끝난줄 알았지만 마지막에 소멸자를 걸쳐 끝내게 된다.
1. C++의 this 정의: this는 클래스의 멤버 함수 내에서 현재 객체의 포인터를 가리킵니다. 즉, 메서드가 호출된 객체를 참조합니다. 용도: 멤버 변수와 매개변수의 이름이 같을 때 구분할 때 사용합니다. 메서드 체이닝을 지원할 때 사용합니다.

아래는 C++의 this와 Python의 self를 비교한 표입니다.

특성 C++의 this /Python의 self
정의 현재 객체를 가리키는 포인터/ 현재 객체를 참조하는 첫 번째 매개변수
사용 위치 멤버 함수 내에서 사용 /클래스의 메서드 정의에서 사용
명시성 명시적으로 사용 (예: this->member) /항상 첫 번째 매개변수로 필요
형태 포인터 형태/ 일반 변수 형태
용도 - 멤버 변수와 매개변수 구분<br>- 메서드 체이닝/ - 인스턴스 변수 접근<br>- 인스턴스 상태 공유
자동 제공 자동 제공 (생성자에서 사용 가능) /자동 제공 (메서드 호출 시 자동 전달)
이 표를 통해 두 키워드의 차이점과 특징을 쉽게 비교할 수 있습니다.

this 포인터 예 1를 실습해보았다.
age를 조금 수정해서 정상적인 값이 나오도록 해보았다.
this->age를 사용하여 고쳐보았다.

각 언어에서 생성자와 소멸자의 역할과 작동 방식을 자세히 설명하겠습니다.

1. C++
생성자

정의: 생성자는 클래스의 객체가 생성될 때 호출되는 특수한 함수입니다. 주로 객체의 초기 상태를 설정하는 데 사용됩니다.
예시: Dog(string n) 생성자는 name 멤버 변수를 인자로 받아 초기화합니다. 생성자 내부에서 객체가 생성되었다는 메시지를 출력합니다.
소멸자

정의: 소멸자는 객체가 소멸될 때 호출되는 함수입니다. 주로 동적 메모리 해제와 같은 정리 작업을 수행합니다.
예시: ~Dog() 소멸자는 객체가 소멸될 때 메시지를 출력합니다. C++에서는 소멸자가 자동으로 호출됩니다.
2. Java
생성자

정의: Java에서도 생성자는 객체가 생성될 때 호출됩니다. 클래스 이름과 같은 이름을 가지며 반환 타입이 없습니다.
예시: Dog(String n) 생성자는 name 변수를 초기화하고 생성된 객체의 이름을 출력합니다.
소멸자

정의: Java에서는 C++처럼 소멸자가 명시적으로 존재하지 않습니다. 대신, finalize() 메서드를 통해 객체가 가비지 컬렉션에 의해 수집될 때 호출됩니다.
예시: finalize() 메서드는 객체가 사라질 때 호출되며, 메시지를 출력합니다. 그러나 이 메서드는 항상 호출되는 것이 아니므로, 객체의 리소스를 명시적으로 해제하는 것은 추천되지 않습니다.
3. Python
생성자

정의: Python의 생성자는 __init__ 메서드로 정의됩니다. 객체가 생성될 때 자동으로 호출되어 초기화를 수행합니다.
예시: __init__(self, name) 메서드는 name 인자를 받아 인스턴스 변수로 설정하고 메시지를 출력합니다.
소멸자

정의: Python의 소멸자는 __del__ 메서드로 정의됩니다. 객체가 소멸될 때 자동으로 호출되며, 주로 정리 작업을 수행합니다.
예시: __del__(self) 메서드는 객체가 사라질 때 메시지를 출력합니다. 하지만 Python은 가비지 컬렉션을 사용하므로, 소멸자가 언제 호출될지 예측하기 어려울 수 있습니다.
4. C
생성자

정의: C 언어는 객체 지향 언어가 아니지만, 구조체와 함수를 사용해 비슷한 개념을 구현할 수 있습니다. 이 경우, 생성자는 별도의 함수를 통해 구현됩니다.
예시: createDog(const char* name) 함수는 동적으로 메모리를 할당하고, 이름을 설정하여 새로운 Dog 구조체를 반환합니다.
소멸자

정의: C에서 소멸자는 객체를 해제하는 함수를 의미합니다. 동적 메모리 할당을 해제하여 메모리 누수를 방지합니다.
예시: deleteDog(Dog* dog) 함수는 할당된 메모리를 해제하고 메시지를 출력합니다.
요약
각 언어에서 생성자와 소멸자는 객체의 생명 주기를 관리하는 데 중요한 역할을 합니다.

생성자는 객체의 초기 상태를 설정하고,
소멸자는 객체가 소멸될 때 필요한 정리 작업을 수행합니다.
C++와 Java에서는 클래스의 특수 멤버 함수로, Python에서는 특별한 메서드로 구현되며, C에서는 동적 메모리 할당과 해제를 통해 유사한 기능을 구현합니다. 각 언어의 메모리 관리 방식에 따라 소멸자의 동작 방식과 필요성이 다를 수 있습니다.

int a를 써서 메인함수에 Cat ya(1);로 고쳐써야 잘된다.
this포인터를 사용하여 더 깔끔하게만들었고 string 문자열 name을 추가하여 age대신에 name으로 고쳐 넣어보았다.
그리고 야옹이를 붙여 출력결과를 나타나게끔 수정해보았다.