코딩 46일차 C/ C++

마스터피스·2023년 11월 17일
0

C/ C++ 

목록 보기
17/35
post-thumbnail

클래스 멤버 / 생성자 / 소멸자

  1. 클래스)

  • 앞으로 생성되는 모든 구조화된 변수의 집합은 class로 생성하게 됩니다. 사용 방법은 struct와 동일하며, 클래스 내부에 꼭 public 을 넣어주어야 합니다.
  1. 인라인 조건절)
  • 인라인 조건절을 이용해 간단한 조건 결과를 작성할 수 있습니다.

정적인 클래스 선언 예제)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>

class Student {
public:
    int student_no;
    char name[20];
    int gender; //0 = 남자. 1 = 여자

    void printStudentInfo() {
        printf("학생명 : %d\n", student_no);
        printf("학생 이름: %s\n", name);
        //인라인 조건절 예제코드
        printf("성별 : %s\n", gender == 0 ? "남자" : "여자");
    }

};

int main() {
    Student s;
    s.student_no = 1234;
    strcpy(s.name, "김말똥");
    s.gender = 0;

    s.printStudentInfo();

    Student s2;
    s.student_no = 5678;
    strcpy(s.name, "김순이");
    s.gender = 1;

    s.printStudentInfo();

    return 0;
}
  1. 클래스 인스턴스간의 차이)
  • 정적인 형태(사실 정적인 형태는 아니고 Stack Allocated지만)의 클래스와 동적인 형태의 클래스는 생명주기간의 차이가 있습니다. 이는 객체지향 프로그래밍을 할 때 매우 중요한 부분입니다. 객체지향 개발을 하다 보면 함수의 생명주기에 관계 없는 객체 인스턴스를 만들 일이 너무나도 많습니다. 따라서 포인터 형태, 즉 동적할당된 클래스 인스턴스를 정말 많이 다루게 됩니다.
  1. delete)

  • new 키워드를 이용해 클래스 인스턴스를 만들었을 경우 delete 키워드를 이용해 클래스 인스턴스의 실제 값을 Heap 메모리에서 삭제해야만 합니다. 배열의 경우에는 delete[] 키워드를 활용합니다.

5.동적인(포인터타입) 클래스 선언)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>

class Student {
public:
    int student_no;
    char name[20];
    int gender; //0 = 남자. 1 = 여자

    void printStudentInfo() {
        printf("학생명 : %d\n", student_no);
        printf("학생 이름: %s\n", name);
        //인라인 조건절 예제코드
        printf("성별 : %s\n", gender == 0 ? "남자" : "여자");
    }

};

int main() {
    //정적 클래스 선언
    Student s;
    s.student_no = 1234;
    strcpy(s.name, "김말똥");
    s.gender = 0;

    s.printStudentInfo();

    //포인터
    Student* ps = new Student();
    ps->student_no = 1234;
    strcpy(ps->name, "김순자");
    ps->gender = 1;

    ps->printStudentInfo();
    delete ps;

    return 0;
}

6.생성자)

  • 생성자는 클래스가 생성될 때의 초기 행동을 지정해줄 수 있으며 파라미터를 받을 수 있습니다.생성자를 통해 클래스가 최초에 무엇을 해야 하는지를 지정하고 실행하게 할 수 있습니다

예제코드)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>

class Student {
public:
    int student_no;
    char name[20];
    int gender; //0 = 남자. 1 = 여자

    //생성자
    Student(int pStdNo, const char* n, int g) {
        student_no = pStdNo;
        strcpy(name, n);
        gender = g;

    }

    void printStudentInfo() {
        printf("학생명 : %d\n", student_no);
        printf("학생 이름: %s\n", name);
        //인라인 조건절 예제코드
        printf("성별 : %s\n", gender == 0 ? "남자" : "여자");
    }

};

int main() {
    //정적 클래스 선언
    Student s = Student(1234, "김말똥", 0);
    s.printStudentInfo();

    //포인터
    Student* ps = new Student(3456, "김순이", 1);
    ps->printStudentInfo();
    delete ps;

    return 0;
}

7.this)

  • this 키워드는 해당 멤버 함수를 호출한 인스턴스 그 자체의 포인터값을 나타냅니다.

    //참고 내용 : 생성자의 파라미터 내용과 변수 이름이 같으면 에러가 난다.
    그래서 this ->를 활용해 클래스 변수를 의미한다.

    class Student {

    public:
    int student_no;
    char name[20];
    int gender; //0 = 남자. 1 = 여자

      //생성자
      Student(int student_no, const char* n, int g) {
          this-> student_no = student_no;
          strcpy(name, n);
          gender = g;
    
      }

8.인스턴스)

  • 클래스를 선언하고 우리가 변수 형태로 만들어서 활용했습니다. 이 변수 형태로 만들어서 사용할 때 만든 이 '변수'를인스턴스라고 합니다. 지금까지는 이해하기 쉽게 클래스 변수, 구조체 변수라는 용어를 사용했지만, 이제부터는 정확한 명칭인 클래스 인스턴스라는 용어를 사용하게 될 것입니다

9.소멸자)

10.소멸자 호출의 필요성)

  • C++은 특성상 소멸자를 통해 멤버 변수에 할당되어 있는 동적 배열이나 멤버 동적 인스턴스들을 적당히 제거해줄 필요가 있습니다.우리가 이것을 클래스 외부에서 수동으로 하나하나 해 줄 수 있겠지만 이건 번거롭고 좋은 방법이 아니겠죠 이 때문에 C++은 이런 일을 할 수 있는 '소멸자' 라는 옵션을 제공합니다.

11.strlen(...) )

  • strlen( ... ) 함수는 cstring 헤더파일에 포함된 함수로서 문자열을 파라미터로 받아 길이를 리턴합니다. 길이 값은 널문자가 포함되지 않은 값이 됩니다.

연습문제)

sol)
해더파일)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <cmath>

int number_counter = 1;



class Employee {
public:
    int no;
    char name[20];
    int gender;
    char rank[20];

    Employee(char* name, int gender, char* rank) {
        strcpy(this->name, name);
        this->gender = gender;
        strcpy(this->rank, rank);
        this->no = number_counter;
        number_counter++;
    }




    void printInfo() {
        printf("사원 번호: %d /", no);
        printf("사원 이름: %s\n", name);
        printf("사원 성별 : %s / ", gender == 1 ? "남자" : "여자");
        printf("직급 : %s\n", rank);
    }
};

int getInt(const char* prompt);

//함수 실행 후 메모리 해제를 꼭 해줘야 한다.
char* getString(const char* prompt);

소스코드 파일)

#include "Header1.h"



int main() {
    //1. 사원 보기
    //2. 사원 추가
    //3. 사원 삭제
    //4. 프로그램 종료
    Employee* employee[100];
    int count = 0;



    while (true) {

        printf("명령어를 입력하세요\n");
        printf("1. 사원 보기\n");
        printf("2. 사원 추가\n");
        printf("3. 사원 삭제\n");
        printf("4. 프로그램 종료\n");

        fseek(stdin, 0, SEEK_END);
        int input;
        scanf("%d", &input);


        if (input == 1) {
            // 사원 보기
            for (int i = 0; i < count; i++) {
                employee[i]->printInfo();
            }
        }
        else if (input == 2) {
            // 사원 추가
            char* name = getString("사원명 입력해주세요. :");
            int gender = getInt("성별을 입력해주세요. (1. 남성, 2.여성):");
            char* rank = getString("직급을 입력해주세요.");

            Employee* e = new Employee(name, gender, rank);
            delete[] name;
            delete[] rank;

            employee[count++] = e;

        }
        else if (input == 3) {
            // 사원 삭제
            int number = getInt("사원번호를 입력해주세요.");
            int deletedIndex = -1;
            for (int i = 0; i < count; i++) {
                if (number == employee[i]->no) {
                    delete employee[i];
                    int deletedIndex = i;
                    break;
                }
                printf("삭제가 완료 됐습니다.");
            }
            if (deletedIndex >= 0){
                for (int i = deletedIndex; i < count; i++) {
                    employee[i] = employee[i + 1];
                }

            }
            count--;


        }

        else if (input == 4) {
            // 프로그램 종료
            printf("프로그램을 종료 합니다.");
            break;

        }
        else {
            printf("잘못 입력하셨습니다");

        }





    }

    return 0;
}

int getInt(const char* prompt) {
    int input;
    printf("%s", prompt);
    fseek(stdin, 0, SEEK_END);

    scanf("%d", &input);
    return input;

}

char* getString(const char* prompt) {
    char* input = new char[100];
    printf("%s", prompt);
    fseek(stdin, 0, SEEK_END);
    scanf("%99[^\n]s", input);
    return input;

}



과제형 문제)
![](https://velog.velcdn.com/images/yayar98/post/05098db9-40d2-4601-8c8c-da95f40f64f4/image.webp)


sol)

                                         // 헤더파일의 부분 수정하면 됨

class Employee {
public:
    int no;
    //동적 할당을 받기 위해 포인터로 나타낸다.
    char* name;
    int gender;
    //동적 할당을 받기 위해 포인터로 나타낸다.
    char* rank;

    Employee(char* name, int gender, char* rank) {

        //동적 할당 시작
        // + 1하는 이유는 null 문자가 들어갈 길이를 정해주는 것.
        this->name = new char[strlen(name) + 1];
        this->rank = new char[strlen(rank) + 1];

        strcpy(this->name, name);
        this->gender = gender;
        strcpy(this->rank, rank);
        this->no = number_counter;
        number_counter++;
    }
    //소멸자 생성
    ~Employee() {
        delete[] name;
        delete[] rank;
        //소멸자 확인
        printf("%d의 사원번홀르 가진 사원이 삭제 되었습니다.", no);
    }
profile
코딩 일지

0개의 댓글