C++ 10주차

2023. 11. 8. 12:26💻 프로그래밍 언어/C++

지난주 복습

#include <iostream>
using std::cout;
using std::endl;

class Dog {
private:
	int age;
public:
	Dog(int a);
	~Dog();
	int getAge();
	void setAge(int a);
};
Dog::Dog(int a)
{
	age = a;
}
Dog::~Dog()
{
	cout << "소멸";
}
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
int main()
{
	Dog happy(5), meri(3);
	cout << happy.getAge();
	cout << meri.getAge();
	return 0;
}

const 동적 메모리 할당 (new, delete)


변형X

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using std::cout;
class Cat {
private: //생략가능
	int age;
	char name[20];
	// const char* name; //A
public:
	Cat(int age, const char* n) {
		this->age = age;
		strcpy(name, n); // name=n; //A
		cout << name << "고양이 객체가 만들어졌어요.\n";
	}
	~Cat() { cout << name << "객체 바이\n"; };
	int getAge();
	const char* getName();
	void setAge(int age);
	void setName(const char* pName);
	void meow();
};
int Cat::getAge() {
	return age;
}
void Cat::setAge(int age) {
	this->age = age;
}
void Cat::setName(const char* pName) {
	strcpy(name, pName);
}
const char* 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;
}

 

std::string 사용

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

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();
	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;
}

위 코드 실행 결과

 

const 변수

6p

#define IN 1 // 컴파일 전에 IN을 찾아서 1로 바꿈
#include <iostream>
int main()
{
	const int x = 2; // 변수 x는 항상 1, 변경 불가, 초기값 지정해야
	int const y = 3; // 비추, const는 자료형 앞에 씀
	const int z{ 4 }; // Uniform initialization(const int z(4);도 가능), C++11, z{}
	constexpr int a = 5; //C++11부터 가능, compile-time constant
	//x = 2; //변경 불가
	//y = 10; //변경 불가
	//z = 20; //변경 불가
	std::cout << IN << x << y << z << a;
	return 0;
} //const로 지정을 하면 초기값에서 변경 불가

 

함수에 사용하는 const

8p

#include <iostream>
class Dog {
	int age; //private 생략함
public:
	int getAge() const;
	void setAge(int a) { age = a; }
	void view() const{ //오류해결, const함수로 만들면 됨
		std::cout << "나는 view"; 
	}
};
int Dog::getAge() const
{
	view();		// 오류 ① view();<-강의자료 9p참고, const함수는 const함수만 호출할 수 O / 일반함수는 접근 X
	return age; // 오류 ② const가 있는 함수는 멤버변수 변경X, (++age)<-멤버변수 age를 변경해서 나는 오류
}
int main()
{
	Dog happy;
	happy.setAge(5);
	std::cout << happy.getAge();
	return 0;
}

▶ const함수는 일반함수 호출 불가능

▶ const는 반드시 써야하는 것은 아니지만 사용하면 코드 이해가 수월해진다.

     getter는 const를 지정해주는 것이 좋다.

     setter는 const 불가능

 

new 연산자

자바(Java): 자바에서는 "new" 연산자를 사용하여 객체를 생성합니다. 

Person person = new Person();


C++: C++에서도 "new" 연산자를 사용하여 동적으로 객체를 생성할 수 있습니다.

이후에는 포인터를 통해 해당 객체에 접근할 수 있습니다.

Person* person = new Person();


C#: C#에서도 "new" 연산자를 사용하여 객체를 생성할 수 있습니다. 

C#에서는 "new" 연산자를 사용하여 클래스의 인스턴스를 생성하는 것이 일반적입니다.

Person person = new Person();


파이썬(Python): 파이썬에서는 "new" 연산자 대신 클래스의 생성자를 호출하여 객체를 생성합니다.

파이썬에서는 "new" 연산자 대신 클래스 이름을 호출하여 객체를 생성하는 방식을 사용합니다.

person = Person()


자바스크립트(JavaScript): 자바스크립트에서도 "new" 연산자를 사용하여 객체를 생성할 수 있습니다.

자바스크립트에서도 "new" 연산자를 사용하여 클래스의 인스턴스를 생성하는 것이 일반적입니다.

var person = new Person();

 

정적 vs 동적 메모리 할당

#include <iostream>
int main()
{
	int array[1000000]; //4MB
	std::cout << "aaaa";
	return 0;
}

40p

 

동적 메모리를 사용하는 이유

39p, 기말고사에 자주 냄

 

정적 메모리 vs 동적메모리

#include <iostream>
int main()
{
	int *pi = new int; // 동적 메모리 할당, heap
	int x;	// 정적 메모리할당, 스택

	if (!pi) { // pi==0, 널 포인터인지 확인
		std::cout << "메모리할당이 되지 않았습니다.";
		return 1; //비정상 종료시 리턴값
	}
	*pi = 100; //주소의 값으로 100을 할당
	x = 10;
	std::cout << "동적메모리=" << *pi << ", x=" << x;
	delete pi; // 메모리 해제
	return 0; // 정상 종료시 리턴값
}

정적: 변수선언, 스택에 할당

동적: heap에 할당하고 싶으면 new를 쓰고 자료형을 쓰면 자료형의 크기만큼 할당된다. 중요한 것은 주소가 튀어나와 포인터 변수에 저장을 해주어야 한다.

 

동적 메모리의 할당과 해제: new와 delete

42p,  [ ]안쓰면 기말고사때 감점 많음

동적메모리 할당으로 new를 썼으면 반드시 delete를 써야한다. 쓰지 않으면 다른 프로그램에서 메모리 할당을 하지 못한다.

파이썬튜터

 

실습 5-4: 동적메모리 할당(필요한 만큼의 메모리만 실행시 할당)

#include <iostream>
#include <stdlib.h> //exit(1)
int main()
{
	int i, n;
	int* num;
	std::cout << "몇 개의 숫자를 입력하시겠습니까==";
	std::cin >> i;
	num = new int[i];
	if (num == NULL) exit(1); //종료
	for (n = 0; n < i; n++)
	{
		std::cout << "숫자를 입력하십시오 : ";
		std::cin >> num[n];
	}
	std::cout << "당신이 입력한 숫자는: ";
	for (n = 0; n < i; n++)
		std::cout << num[n] << ", ";
	delete[] num; //[]을 생략하면?
	return 0;
} //기말고사 자주 나옴

 

배열의 이름은 배열의 시작 주소

int x[3] = {1, 2, 3}
//배열의 이름: 1이 저장된 곳의 주소

 

실습 5-5: 객체 동적할당

#include <iostream>
class Dog {
private:
	int age;
public:
	int getAge();
	void setAge(int a);
};
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
int main()
{
	Dog *dp;
	dp = new Dog; // Dog *dp=new Dog
	/*if (!dp) {
		std::cout << "메모리할당 불가!";
		return 1;
	}*/
	dp->setAge(5);

	std::cout << "메모리에 할당된 값은 " << dp->getAge() << "입니다.";
	delete dp;
	return 0;
}

 

실습 5-6: 배열객체 동적 할당

#include <iostream>
class Dog {
private:
	int age;
public:
	int getAge();
	void setAge(int a);
};
int Dog::getAge()
{
	return age;
}
void Dog::setAge(int a)
{
	age = a;
}
int main()
{
	Dog* dp;
	dp = new Dog[10]; // 객체배열 할당
	// Dog *dp=new Dog[10];
	for (int i = 0; i < 10; i++) // C++에서는 가능
		dp[i].setAge(i);
	for (int i = 0; i < 10; i++)
		std::cout << i << "번째 객체의 나이는 " <<
		dp[i].getAge() << " 입니다. " << std::endl;
	delete[]dp;
	return 0;
} //기말고사 많이 나옴

 

실습: const 추가

#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;
}

출처: C++ 프로그래밍 강의 ppt

'💻 프로그래밍 언어 > C++' 카테고리의 다른 글

C++ 12주차  (0) 2023.11.22
C++ 11주차  (1) 2023.11.15
C++ 9주차  (0) 2023.11.01
C++ 6주차  (1) 2023.10.18
C++ 5주차  (1) 2023.10.11