모두의 코드 커뮤니티

C++ new 동적할당 부분

#include <iostream>
#include <string>
class Employee {
protected:
	std::string name;
	int age;

	std::string position; // 직책 (이름)
	int rank; // 순위 (값이 클 수록 높은 순위)

public:
	Employee(std::string name, int age, std::string position, int rank)
		: name(name), age(age), position(position), rank(rank) {}

	// 복사 생성자
	Employee(const Employee& employee) {
		name = employee.name;
		age = employee.age;
		position = employee.position;
		rank = employee.rank;
	}

	// 디폴트 생성자
	Employee() {}

	void print_info() {
		std::cout << name << " (" << position << " , " << age << ") ==> "
			<< calculate_pay() << "만원" << std::endl;
	}

	int calculate_pay() { return 200 + rank * 50; }
};
class Manager : public Employee {
	int year_of_service;

public:
	Manager(std::string name, int age, std::string position, int rank,
		int year_of_service)
		: Employee(name, age, position, rank), year_of_service(year_of_service) {}

	// 복사 생성자
	Manager(const Manager& manager)
		: Employee(manager.name, manager.age, manager.position, manager.rank) {
		year_of_service = manager.year_of_service;
	}

	// 디폴트 생성자
	Manager() : Employee() {}

	int calculate_pay() { return 200 + rank * 50 + 5 * year_of_service; }

	void print_info() {
		std::cout << name << " (" << position << " , " << age << ", "
			<< year_of_service << "년차) ==> " << calculate_pay() << "만원"
			<< std::endl;
	}
};
class EmployeeList {
	int alloc_employee;

	int current_employee;
	int current_manager;

	Employee** employee_list;	// 직원 데이터
	Manager** manager_list;		// 매니저 데이터

public:
	EmployeeList(int alloc_employee) : alloc_employee(alloc_employee) {
		employee_list = new Employee * [alloc_employee];
		manager_list = new Manager * [alloc_employee];
		current_employee = 0;
		current_manager = 0;
	}

	void add_employee(Employee* employee) {
		// 사실 current_employee 보다 alloc_employee 가 더
		// 많아지는 경우 반드시 재할당을 해야 하지만, 여기서는
		// 최대한 단순하게 생각해서 alloc_employee 는
		// 언제나 current_employee 보다 크다고 생각한다.
		// (즉 할당된 크기는 현재 총 직원수 보다 많음)
		employee_list[current_employee] = employee;
		current_employee++;
	}
	void add_manager(Manager* manager) {
		manager_list[current_manager] = manager;
		current_manager++;
	}
	int current_employee_num() { return current_employee + current_manager; }

	void print_employee_info() {
		int total_pay = 0;
		for (int i = 0; i < current_employee; i++) {
			employee_list[i]->print_info();
			total_pay += employee_list[i]->calculate_pay();
		}
		for (int i = 0; i < current_manager; i++) {
			manager_list[i]->print_info();
			total_pay += manager_list[i]->calculate_pay();
		}
		std::cout << "총 비용 : " << total_pay << "만원 " << std::endl;
	}
	~EmployeeList() {
		for (int i = 0; i < current_employee; i++) {
			delete employee_list[i];
		}
		for (int i = 0; i < current_manager; i++) {
			delete manager_list[i];
		}
		delete[] employee_list;
		delete[] manager_list;
	}
};
int main() {
	EmployeeList emp_list(10);
	emp_list.add_employee(new Employee("노홍철", 34, "평사원", 1));
	emp_list.add_employee(new Employee("하하", 34, "평사원", 1));
	emp_list.add_manager(new Manager("유재석", 41, "부장", 7, 12));
	emp_list.add_manager(new Manager("정준하", 43, "과장", 4, 15));
	emp_list.add_manager(new Manager("박명수", 43, "차장", 5, 13));
	emp_list.add_employee(new Employee("정형돈", 36, "대리", 2));
	emp_list.add_employee(new Employee("길", 36, "인턴", -2));
	emp_list.print_employee_info();
	return 0;
}

씹어먹는 C++ 강의 중 클래스 상속2강에서 위 코드를 이용하시는데 여기서 main함수에서
emp_list.add_manager(new Manager(“유재석”, 41, “부장”, 7, 12)); 이 부분이 이해가 잘 되질 않습니다

(new Manager(“유재석”, 41, “부장”, 7, 12)); 이 동적할당을 하는 것은 알겠는데 보통 배열이면 중괄호를 이용해서 할당하거나 하는데 위 부분은 배열을 할당하는 것은 아니고
제가 보기에는 괄호 부분이 Manager 클래스의 생성자를 호출하는 부분 같은데
그럼 new Manager(Manager 유재석); 이렇게 되어서 무엇을 동적할당을 하겠다는건지 이해가 잘 되질 않습니다

좋아요 1

add_manager 함수의 파라미터를 동적으로 할당하는 것 같네요.

Manager* manager = new Manager(“유재석”, 41, “부장”, 7, 12); 으로 이해가 되는데
그 다음 add_manager를 실행하면
emp_list.add_manager(new Manager(“정준하”, 43, “과장”, 4, 15)); 인데

그럼 기존에 있던 manager(“유재석”, 41, “부장”, 7, 12) 에 대한 정보를 delete를 하고 다시 할당을 하는 방식으로 배웠는데 왜 전에 할당해준 공간을 지우지 않고 새로운 공간을 할당해주었는데 어떻게 이전 데이터에 접근이 가능한건가요?

좋아요 1

add_manager 함수를 쓸 때 전에 할당해준 공간을 지울 필요가 있나요?

좋아요 1

아 그렇네요 제가 착각했습니다 답변해주셔서 감사합니다 :slight_smile:

좋아요 1