본문 바로가기

카테고리 없음

2024000066김태윤10주차 수업시간과제

(모든 자료는 한성현교수님 수입시간에 나옴.)

new연산자 사용언어

프로그래밍언어에서 동적메모리할당을 하는이유를 알려달라고해보았다.

컨트롤h를 누르고 위에 바꿔야할 소스와 바꿀소스를 밑에넣고 한번에 바꿀수있다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string> //strcpy에서 오류나면 string.h로 변경
using std::cout;
class Cat {
private: //생략가능
int age;
std::string name;

public:
Cat(int age, std::string n) {
this->age = age;
name = n; // name=n; //A
cout << name << "고양이 객체가 만들어졌어요.\n";
}
~Cat() { cout << name << "객체 바이\n"; };
int getAge();
std::string getName();
void setAge(int age);
void setName(std::string pName);
void meow();
};
int Cat::getAge() {
return age;
}
void Cat::setAge(int age) {
this->age = age;
}
void Cat::setName(std::string pName) {
name= pName;

}
std::string Cat::getName() {
return name;
}
void Cat::meow() {
cout << name << "고양이가 울어요\n";
}
int main() {
Cat nabi(1, "나비"), yaong(1, "야옹"), * pNabi;
cout << nabi.getName() << " 출생 나이는 " << nabi.getAge() << "살이다.\n";
cout << yaong.getName() << " 출생 나이는 " << yaong.getAge() << "살이다.\n";
pNabi = &nabi;
cout << pNabi->getName() << " 출생 나이는 " << pNabi->getAge() << "살이다.\n";
nabi.setName("Nabi");
nabi.setAge(3);
cout << nabi.getName() << " 나이는 " << nabi.getAge() << "살이다.\n";
yaong.meow();
nabi.meow();
return 0;
}

위 소스->밑소스로 바꾸기가능.

c++에서 const를 쓰면 변수를 상수로 변환 할수있고, 초기값에서 절떄 변경 불가하게 만든다고 함.

const를 쓰는 몇가지 방법

const사용.

#include <iostream>

class Dog {
    int age; // private 생략함
public:
    int getAge() const;
    void setAge(int a) { age = a; }
    void view() const { std::cout << "나는 view"; } // view()를 const로 변경
};

int Dog::getAge() const {
    view(); // 오류 수정: view() 호출 가능
    return (++age); // 오류 수정: age를 증가시키고 반환
}

int main() {
    Dog happy;
    happy.setAge(5);
    std::cout << happy.getAge();
    return 0;
}

챗gpt에게 물어봐도const를 써서 소스를 고쳐줌.

#include <iostream>
class Dog {
int age;
public:
Dog(int a) { age = a; }
int getAge() const;
void setAge(int a) { age = a; }
void view() const
{
std::cout << "나는 view\n";
}
};
int Dog::getAge() const
{
view();
return (age);
}
int main()
{
const Dog happy(5); //const 객체
//happy.setAge(7); // 오류
std::cout << happy.getAge();
return 0;
}

이 소스happy.set부분에 오류가 있었는데 이건 const로 인해서 이 소스에선 해피가5여야만 하기때문에

주석처리를 해서 오류를없앰.

포인터의 개요. 메모리 동적할당떄문에 필요함.

x의 주소를 알아내는법. 새로 실행할떄마다 주소가 달라진다.(stack의 주소)

x의 주소를 저장하기 위해포인터 변수로 선언해야하고, 선언하는방법은 *을 쓴다.

#include <iostream>

int main()
{
int x = 1;
int*px = &x;//포인터 변수를 선언.
std::cout << x << " " << &x << " " << *px;
return 0;
}

이 소스 설명해달라고 해봤음.

포인터 변수는 주소를 저정하고있어서 그 값을 가저올 수 있고, 앞에별표*만 찍어주면 값을 가저올 수 있다.

 

 

시험에 항상 나오는 동적 메모리를 사용하는이유이다. 2번쨰가 제일 중요함.

정적 메모리 할당과, 동적메모리할당.

동적메모리할당을 하게되면 주소를 가지고 놀아야해서 포인터로 저장해야한다. 그렇게하면 heap에 저장이 되는 것을 확인 할 수 있다.

배열에서 delete는 []대괄호를 써야한다.

#include <iostream>
#include <stdlib.h> // exit(1) 사용을 위한 헤더
int main()
{
    int i, n;
    int* num; // 동적으로 할당할 정수형 포인터 선언
    std::cout << "몇 개의 숫자를 입력하시겠습니까==";
    std::cin >> i; // 사용자가 입력할 숫자의 개수를 입력받음
    num = new int[i]; // i개의 정수를 저장할 수 있는 메모리 동적 할당
    if (num == NULL) exit(1); // 메모리 할당 실패 시 프로그램 종료
    for (n = 0; n < i; n++)
    {
        std::cout << "숫자를 입력하십시오 : ";
        std::cin >> num[n]; // 사용자가 입력한 숫자를 num 배열에 저장
    }
    std::cout << "당신이 입력한 숫자는: ";
    for (n = 0; n < i; n++)
        std::cout << num[n] << ", "; // 입력한 숫자 출력
    delete[] num; // 동적으로 할당한 메모리 해제
    return 0; // 프로그램 정상 종료
}
어떻게 동작하는지 알려달라고해보았다.

중요++. 배열의 이름은 배열의 시작주소이기에. 배열이름이 num이고, 시작주소를 배열로 쓸수 있게됨.(절묘하쥬?)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using std::cout;
class Cat {
private: //생략가능
int age;
std::string name;
public:
Cat(int age, std::string n) {
this->age = age;
name = n;
cout << name << "고양이 객체가 만들어졌어요.\n";
}
~Cat() { cout << name << "객체 바이\n"; };
int getAge()const;
std::string getName()const;
void setAge(int age);
void setName(std::string pName);
void meow()const;
};
int Cat::getAge() const {
return age;
}
void Cat::setAge(int age) {
this->age = age;
}
void Cat::setName(std::string pName) {
name = pName;
}
std::string Cat::getName()const {
return name;
}
void Cat::meow()const {
cout << name << "고양이가 울어요\n";
}
int main() {
Cat nabi(1, "나비"), yaong(1, "야옹"), * pNabi;
cout << nabi.getName() << " 출생 나이는 " << nabi.getAge() << "살이다.\n";
cout << yaong.getName() << " 출생 나이는 " << yaong.getAge() << "살이다.\n";
pNabi = &nabi;
cout << pNabi->getName() << " 출생 나이는 " << pNabi->getAge() << "살이다.\n";
nabi.setName("Nabi");
nabi.setAge(3);
cout << nabi.getName() << " 나이는 " << nabi.getAge() << "살이다.\n";
yaong.meow();
nabi.meow();
return 0;
}

get 붙는곳에 모두 const를 씀. 

meow 뒤에도 쓰는게 뽀인또.

동적으로 할당하게되면heap에 할당되고, 첫번쨰주소를 포인터에 할당해놓고, 실제로 사용할떄는 배열처럼 사용하면된다.