홍정모의 따라하며 배우는 C++

홍정모의 따라하며 배우는 C++

(102개의 수강평)

2219명의 수강생
월25,666원
77,000원
3개월 할부시
지식공유자 · PP TREE
201회 수업· 총 48시간 27분수업
평생 무제한 시청
수료증 발급 강의
수강 난이도 초급
dlengus14 프로필

질문드립니다~ dlengus14 1일 전

Cents(int cents = 0) { m_cents = cents; }

int getCents() const { return m_cents; }

int& getCents() { return m_cents; }

클래스 안에서 이렇게 3개씩이나 정의하는 이유가 무엇인가요?

2
김기환 프로필

std::array function parameter data type 질문 김기환 5일 전

배열의 경우 값을 call by value 로 하면 배열 전체를 복사해서 비효율적이잖아요.

std::array 또한 함수 parameter 로

void fun_1(std::array<int, LEN> my_array);

이렇게 넘겨버리게 될경우 parameter 를 built in array 를 사용하는 것처럼 포인터로 넘어가는지 아니면 새로운 my_array 배열을 만들고 그 배열에 복사되는지 궁금합니다!

buit in array 를 parameter 로 할 경우

void fun_2(int *array_ptr);

감사합니다.

2
김성수 프로필

[2:31] 입출력 연산자 오버로딩을 friend로 사용하는 이유 김성수 5일 전

안녕하세요. 교수님

바쁘실텐데 늘 꼼꼼히 봐주시는 교수님 감사합니다.

friend 함수는 다른 class 안에 private 맴버를 접근하기 위해 사용하는 함수라고 배웠는데 입출력 연산자 오버로딩을 사용하기 위해서 friend를 꼭 사용해야 하나요?

입출력 연산자 오버로딩 앞에 friend를 지워보니 

operator에서 "too many parameters for this operator function" 라는 오류가 납니다.

1. 위에 오류와 friend 함수를 꼭 사용하는 이유는 무엇인가요?

2. friend 를 지우고 사용할수 있는 방법은 없을까요?

3. friend를 지울수 있다면 맴버 접근을  instance를 사용하지 않고 접근할수있나요? (ex. point.m_x -> m_x)

늘 정성드런 답변에 감사드립니다!!

1
김성수 프로필

[1:50]복사생성자를 사용하는 이유 김성수 10일 전

복사생성자 부분을 주석처리하고

Fraction frac(3,5);

Fraction fr_copy=frac; 

을 디버그해보니 클래스 안으로 들어가지도 않고 바로 복사가 됩니다. 

이렇게 해도 복사가 바로 되는데 복사생성자를 사용하는 이유는 무엇인가요? (다음 강의를 보면 이해가 되는건가요?)

1차원적인 질문만 계속하니 쑥쓰럽네요..

교수님 늘 감사드립니다.

1
비포 프로필

교수님! ArrayList!! 비포 11일 전

교수님 Java는 ArrayList나 , Hash Map을 유용하게 사용 하던데 C++에서도 구현이 가능한가요??

1
김성수 프로필

[1:57] 클래스 밖의 add 함수에서 L밸류 getCents맴버함수 사용 김성수 12일 전

안녕하세요. 연산자 오버로딩을 들어가면서 어려워지네요..

클래스 밖에서 맴버함수를 사용하기 위해

int getCents() const {return m_cents;} 대신

int& getCents() {return m_cents;} 를 사용하셨는데

참조를 사용하신 이유가 클래스 밖에서 사용하기 위해서인가요?

구체적으로 & 함수를 쓸때와 안쓸때의 차이점이 이해가 안갑니다. 강의 어느 부분을 다시보면 되는지도 답변 부탁드립니다!

1
kohy741 프로필

정모형 ㅜㅜ 힝 이거 설명좀 부탁드려요 ㅜㅜ kohy741 13일 전

GradedActivity.h파일

#ifndef GRADED_ACTIVITY_H_
#define GRADED_ACTIVITY_H_

class GradedActivity
{
    protected:
        double score;                // To hold the numeric score

    public:
        // Default constructor
        GradedActivity()
        { score = 0.0; }

        // Constructor
        GradedActivity(double s)
        { score = s; }

        // Mutator function
        void setScore(double s)
        { score = s; }

        // Accessor function
        double getScore() const
        { return score; }

        virtual char getLetterGrade() const;
};

#endif

GradedActivity.cpp파일

#include "GradedActivity.h"

/* **********************************************************
            Member function GradedActivity::getLetterGrade()
   ********************************************************** */

char GradedActivity::getLetterGrade() const
{
    char letterGrade;        // To hold the letter grade

    if (score > 89)
    {
        letterGrade = 'A';
    }
    else if (score > 79)
    {
        letterGrade = 'B';
    }
    else if (score > 69)
    {
        letterGrade = 'C';
    }
    else if (score > 59)
    {
        letterGrade = 'D';
    }
    else
    {
        letterGrade = 'F';
    }

    return letterGrade;
}

PassFailActivity.h파일

#ifndef PASS_FAIL_ACTIVITY_H_
#define PASS_FAIL_ACTIVITY_H_

#include "GradedActivity.h"

class PassFailActivity : public GradedActivity
{
    protected:
        double minPassingScore;            // Minimum passing score

    public:
        PassFailActivity()                // Default constructor
        { minPassingScore = 0.0; }

        PassFailActivity(double mps) : GradedActivity()
        { minPassingScore = mps; }

        // Mutator
        void setMinPassingScore(double mps)
        { minPassingScore = mps; }

        // Accessors
        double getMinPassingScore() const
        { return minPassingScore; }

        virtual char getLetterGrade() const;
};

#endif

PassFailActivity.cpp파일

#include "PassFailActivity.h"

/* **********************************************************
            PassFailActivity::getLetterGrade()
    This function returns 'P' if the score is passing,
    otherwise it returns 'F'.
   ********************************************************** */

char PassFailActivity::getLetterGrade() const
{
    char letterGrade;

    if (score >= minPassingScore)
    {
        letterGrade = 'P';
    }
    else
    {
        letterGrade = 'F';
    }

    return letterGrade;
}

PassFailExam.h파일

#ifndef PASS_FAIL_EXAM_H_
#define PASS_FAIL_EXAM_H_

#include "PassFailActivity.h"

class PassFailExam : public PassFailActivity
{
    private:
        int     numQuestions;            // Number of questions
        double pointsEach;            // Points for each question
        int     numMissed;                // Number of questions missed

    public:
        // Default constructor
        PassFailExam()                   
        {
            numQuestions = 0;
            pointsEach = 0.0;
            numMissed = 0;
        }

        // Constructor
        PassFailExam(int questions, int missed, double mps) : PassFailActivity(mps)
        {
            set(questions, missed);
        }

        // Mutator function
        void set(int, int);            // Defined in PassFailExam.cpp

        // Accessor functions
        int getNumQuestions() const
        { return numQuestions; }

        double getPointsEach() const
        { return pointsEach; }

        int getNumMissed() const
        { return numMissed; }
};

#endif

PassFailExam.cpp파일

#include "PassFailExam.h"

/* **********************************************************
            PassFailExam::set() : int, int
    The parameters are the number of questions and the number
    of questions missed.
   ********************************************************** */

void PassFailExam::set(int questions, int missed)
{
    double numericScore;            // To hold the numeric score

    // Set the number of questions and number missed
    numQuestions = questions;
    numMissed = missed;

    // Calculate the points for each questions
    pointsEach = 100.0 / numQuestions;

    // Calculate the numeric score for this exam
    numericScore = 100.0 - (missed * pointsEach);

    // Call the inherited setScore function to set the numeric score
    setScore(numericScore);
}

Essay.h파일

#ifndef ESSAY_H_
#define ESSAY_H_

#include "GradedActivity.h"

// Max amount of achievable points
const int GRAMMAR = 30;
const int SPELLING = 20;
const int CORRECT_LENGTH = 20;
const int CONTENT = 30;

// Essay class derived from the GradedActivity class
class Essay : public GradedActivity
{
    private:
        double essayScore;            // The score a student has achieved
        int     grammar;                // Grammar score
        int    spelling;                // Spelling score
        int     length;                    // Correct length score
        int     content;                // Content score

    public:
        // Constructor
        Essay()
        {
            essayScore = 0.0;
            grammar = 0;
            spelling = 0;
            length = 0;
            content = 0;
        }

        // Parameterized constructor
        Essay(int gr, int sp, int len, int cont)
        {
            set(gr, sp, len, cont);
        }

        // Mutator functions
        void set(int, int, int, int);
        void addScore();

        // Accessor functions
        int getGrammarScore() const
        { return grammar; }

        int getSpellingscore() const
        { return spelling; }

        int getCorrectLengthScore() const
        { return length; }

        int getContentScore() const
        { return content; }
};

#endif

Essay.cpp파일

#include "Essay.h"

/* **********************************************************
            Essay::set() : int, int, int, int
    This function assigns the scores achieved by a student to
    the appropriate member variables.
   ********************************************************** */

void Essay::set(int gr, int sp, int len, int cont)
{
    grammar = gr;
    spelling = sp;
    length = len;
    content = cont;

    addScore();
}

/* **********************************************************
            Essay::addScore()
    This function calculates the total score achieved, then
    calls the inherited setScore() function to set the numeric
    score.
   ********************************************************** */

void Essay::addScore()
{
    essayScore = grammar + spelling + length + content;

    setScore(essayScore);
}

FinalExam.h파일

#ifndef FINAL_EXAM_H_
#define FINAL_EXAM_H_

#include "GradedActivity.h"

class FinalExam : public GradedActivity
{
    private:
        int     numQuestions;        // Number of questions
        double pointsEach;        // Points for each question
        int     numMissed;            // Number of questions missed

    public:
        // Default constructor
        FinalExam()
        {
            numQuestions = 0;
            pointsEach = 0.0;
            numMissed = 0;
        }

        // Constructor
        FinalExam(int questions, int missed)
        {
            set(questions, missed);
        }

        // Mutator function
        void set(int, int);            // Defined in FinalExam.cpp
        void adjustScore();            // Defined in FinalExam.cpp

        // Accessor functions
        double getNumQuestions() const
        { return numQuestions; }

        double getPointsEach() const
        { return pointsEach; }

        int getNumMissed() const
        { return numMissed; }
};

#endif

FinalExam.cpp파일

#include "FinalExam.h"

/* **********************************************************
            FinalExam::set() : int, int
    The parameters are the number of questions and the number
    of questions missed.
   ********************************************************** */

void FinalExam::set(int questions, int missed)
{
    double numericScore;        // To hold the numeric score

    // Set the number of questions and number missed
    numQuestions = questions;
    numMissed = missed;

    // Calculate the points for each question
    pointsEach = 100.0 / numQuestions;

    // Calculate the numeric score for this exam
    numericScore = 100.0 - (missed * pointsEach);

    // Call the inherited setScore function to set the numeric score
    setScore(numericScore);

    // Call the adjustScore function to adjust the score
    adjustScore();
}

/* **********************************************************
            FinalExam::adjustScore()
    If score is within 0.5 points of the next whole point, it
    rounds the score up and recalculates the letter grade.
   ********************************************************** */

void FinalExam::adjustScore()
{
    double fraction = score - static_cast<int>(score);

    if (fraction >= 0.5)
    {
        // Adjust the score variable in the GradedActivity class
        score += (1.0 - fraction);
    }
}

CourseGrades.h파일

#ifndef COURSE_GRADES_H_
#define COURSE_GRADES_H_

#include "GradedActivity.h"
#include "PassFailExam.h"
#include "FinalExam.h"
#include "Essay.h"

#include <array>

const int NUM_OBJ = 4;

class CourseGrades
{
    private:
        std::array<GradedActivity *, NUM_OBJ> grades;        // Array of GradedActivity pointers
       
    public:   
        // Constructor
        CourseGrades() : grades{}
        {
        }

        // Mutator functions
        void setLab(GradedActivity *);
        void setPassFailExam(PassFailExam *);
        void setEssay(Essay *);
        void setFinalExam(FinalExam *);

        // Accessor function
        void print() const;
};

#endif

CourseGrades.cpp파일

#include "CourseGrades.h"

#include <iostream>
using std::cout;

#include <string>
using std::string;

/* **********************************************************
            CourseGrades::setLab() : obj *
    Assigns a GradedActivity object to element 0 of the grades
    array.
   ********************************************************** */

void CourseGrades::setLab(GradedActivity *gradedActivity)
{
    grades[0] = gradedActivity;
}

/* **********************************************************
            CourseGrades::setPassFailExam() : obj *
    Assigns a PassFailExam object to element 1 of the grades
    array.
   ********************************************************** */

void CourseGrades::setPassFailExam(PassFailExam *passFailExam)
{
    grades[1] = passFailExam;
}

/* **********************************************************
            CourseGrades::setEssay() : obj *
    Assigns a CourseGrades object to element 2 of the grades
    array.
   ********************************************************** */

void CourseGrades::setEssay(Essay *essay)
{
    grades[2] = essay;
}

/* **********************************************************
            CourseGrades::setFinalExam() : obj *
    Assigns a FinalExam object to element 0 of the grades
    array.
   ********************************************************** */

void CourseGrades::setFinalExam(FinalExam *finalExam)
{
    grades[3] = finalExam;
}

/* **********************************************************
            CourseGrades::print()
    The print function outputs the activity name and grade
    data for each element in the grades array.
   ********************************************************** */

void CourseGrades::print() const
{
    std::array<string, NUM_OBJ> activity { "LAB ACTIVITY", "PASS FAIL EXAM",
                                                       "ESSAY", "FINAL EXAM" };
   
    for (size_t i = 0; i < NUM_OBJ; i++)
    {
        cout << activity[i] << "\n";
        cout << "Score: "    << grades[i]->getScore() << "\n";
        cout << "Letter Grade: " << grades[i]->getLetterGrade() << "\n\n";
    }
}

CourseGradesDm.cpp파일

#include "CourseGrades.h"

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

int main()
{
    // Create a course grades object
    CourseGrades grades;

    // Create a dynamically allocated GradedActivity object
    GradedActivity *gradedActivity = new GradedActivity(89);
    grades.setLab(gradedActivity);

    // Create a dynamically allocated PassFailExam object
    PassFailExam *passFailExam = new PassFailExam(10, 3, 70.0);
    grades.setPassFailExam(passFailExam);

    // Create a dynamically allocated Essay object
    Essay *essay = new Essay(25, 18, 14, 11);
    grades.setEssay(essay);

    // Create a dynamically allocated FinalExam object
    FinalExam *finalExam = new FinalExam(50, 13);
    grades.setFinalExam(finalExam);

    cout << "YAMAGATA 4th JUNIOR HIGH SCHOOL - GRADE SUMMARY\n\n";
    cout << "Student Name: Aikawa, Ryoji\n\n";

    grades.print();

    // Free the memory
    delete finalExam;
    delete essay;
    delete passFailExam;
    delete gradedActivity;
   
    cin.get();
    cin.ignore();
    return 0;
}

2
Dr. Unggyu KIM 프로필

유투브로 수강하다 이제 인프런으로 건너왔습니다. Dr. Unggyu KIM 14일 전

교수님의 유투브 [따배씨++]로 공부하다 인프런으로 건너왔습니다.

4.10 구조체 Structure까지 공부했습니다.

* 저는 1987년부터 7년간 대한항공 시스템부에서 IBM Macro Assemble어로 프로그래밍, 설계, PM을 했고

PC가 처음 나왔을 때, Turbor-C와 DBase IV를 이용해 Mainframe-PC Interface Program을 1년간 했었습니다

이제 나이 많이 먹었지만, C++을 도전하고 싶습니다. 나이들어도 프로그래머가 되고 싶다는 젊은 시절의 꿈을 이루고 싶습니다.

다음은 파이선도 해보고 싶구요.

어셈블러->C->C++->Python 으로 이어지는 같은 계열의 프로그래밍으로 이어가고 싶군요.

앞으로 많은 가르침 받겠습니다.

1
지호손 프로필

역시 제일 어려운건 프로젝트 구성(설정)이네요. 지호손 15일 전

구성 원리를 정확히 이해하면 나을 것 같은데 홍정모교수님은 어떻게 학습하셨나요?? ㅠㅠ 맨날 검색해서 블로그봐도 이해가 별로 안됐던거 같습니다.

질문1)


Property =>  C/C++ => Additional Include Directories 
 : 컴파일과정 중 Object 파일을 생성하기 위해 사용되는 헤더들의 경로

Linker => input =>  Additional Library Dependencies 

: 의존 외부라이브러리 경로

LInker => General => Additional Dependencies

: 프로젝트에 사용되는 의존 외부 라이브러리 파일 이름
ex) nanogui.lib

까지는 이해가 뙜는데 DLL파일을 복사해서 프로젝트 실행 경로에 옮겨두는 것이 이해가 안되네요. 항상 dll파일들은 exe와 같은 경로상에 위치해야하나요? (그런 규칙이 있는지 궁금합니다.)

4
지호손 프로필

Performance 측정을 처음 해보네요. 좋은 정보 감사합니다. 지호손 16일 전

전문가분들이 visual studio를  선호하는 이유를 조금씩 알 것 같네요.

1
지호손 프로필

c++이 정말 모던해졌다는걸 느낀 강의였습니다.ㄷㄷ;; 지호손 17일 전

람다는 js나 python에서 즐겨사용했는데 C++ 이런 기능을 제공하니 정말 유연해졌네요. 

혹시나하고 클로저도되는지 테스트해봤는데 안되는 것같네요.

대신 바인드를 이런 식으로 이용해서 흉내는 내볼수 있을 것 같네요.

std::function<void()> doSomething(int x)

{

    int a = x;

    auto f = [](int a)->void {cout << a << endl; };

    return std::bind(f, a);

}


좋은 강의 감사합니다.( 유트브도 잘보고 있습니다 :) ) 

1
지호손 프로필

중간 삽입처리는 파일에서 어떻게 처리해야할가요? 지호손 17일 전

강의 정말 잘 들었습니다. 매우 활용도가 높을거같은 내용이네요.
임의 접근이 가능한 것을 알게되었는데  궁금한 것이 생겼습니다.

중간에 값을 넣었을 때 밀어내기를 처리할 때는 메모리에 배열처리하듯이 뒷 부분모두 복사하고 처리해야할가요??

aaaaaa ... (매우 큰 데이터)aaaa

에 맨앞에 b를 추가한다면 다 한칸씩 밀어주는 작업이 필요한가요?? 아니면 효율적인 알고리즘이 있으려나요?

트리 구조로 파일의 내용을 저장하면 수정작업 시간이 단축될 것 같은데 보통 에디터나 IDE들은 어떻게 이런 삽입 작업을  처리할가요?

1
지호손 프로필

수업내용과 살짝 외람된 질문이지만 cctype 함수들은 왜 인자가 int일까요? 지호손 17일 전

질문 제목 그대로 cctype헤더들은 입력값들이 문자를 검증할 텐데 왜 int를 인자로 받는 형태로 함수가 설계됐을 까요?

wchar_t (short int)를 고려해서 그런가요? 그러면 short로 하는 게 바람직하지않을까요?

1
비포 프로필

교수님의 C강의 까지 수강하고 C++강의를 듣는데.. 비포 18일 전

지금 C++강의를 듣는데 C강의랑 초반에 겹치는 부분이 있어서 그런데 어떻게 수강하는게 좋을지 여쭤보고 싶습니다.

1
지호손 프로필

Exception 의 Scope는 어떻게되나요? 지호손 19일 전

throw Exception(); 을 호출시 

catch받는 쪽에서 reference로 받는데 생성된 Exception은 임시 객체 로 취급하지않는건가요? 아니면
Exception은  로컬변수로 취급을 안하는 건가요?

Exception 객체의 duration 이 궁금합니다.

1
지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스