Java vs Ruby vs C++: 성적표 프로그램

Tags:

자바와 루비 버젼은 여기에 있습니다. 별 의미는 없고 Accelerated C++을 읽다가 만들어 보고 싶다는 생각에.. C++은 초보이기 때문에 잘못 짠 부분이 있을 수도 있습니다.

subject.hpp

#ifndef __SUBJECT
#define __SUBJECT

#include <iostream>
#include <string>

class Subject
{
private:

    std::string name;
    int score;

public:
    Subject() { }

    Subject(std::string name, int score):name(name), score(score) { }

    std::string getName() const
    {
        return name;
    }

    void setName(std::string name)
    {
        this->name = name;
    }

    int getScore() const
    {
        return score;
    }

    void setScore(int score)
    {
        this->score = score;
    }
};

#endif

subject.cpp

#include "subject.hpp"

subject_compare.hpp

#ifndef __SUBJECT_COMPARE
#define __SUBJECT_COMPARE

#include "subject.hpp"

#include <functional>

struct SubjectCompare: public std::binary_function<Subject, Subject, bool>
{
    bool operator()(const Subject& lhs, const Subject& rhs)
    {
        return lhs.getScore() - rhs.getScore();
    }
};

#endif

score_card.hpp

#ifndef __score_card
#define __score_card

#include "subject.hpp"

#include <iostream>
#include <string>
#include <vector>

class ScoreCard
{
private:
    std::string studentName;
    std::vector<Subject> subjectArray;

public:
    ScoreCard(std::string studentName, std::vector<Subject> subjectArray):studentName(studentName), subjectArray(subjectArray) { }

    double getTotal() const;

    double getAverage() const;

    std::string getStudentName() const
    {
        return studentName;
    }

    const Subject findBestSubject() const;
};

#endif

score_card.cpp

#include "score_card.hpp"
#include "subject.hpp"
#include "subject_compare.hpp"

#include <iostream>
#include <string>
#include <numeric>
#include <iterator>
#include <algorithm>

using namespace std;

static double subject_score_sum(double d, const Subject& s)
{
    return s.getScore() + d;
}

double ScoreCard::getTotal() const
{
    return accumulate(subjectArray.begin(), subjectArray.end(), 0.0, subject_score_sum);
}

double ScoreCard::getAverage() const
{
    return getTotal() / subjectArray.size();
}

const Subject ScoreCard::findBestSubject() const
{
    return *max_element(subjectArray.begin(), subjectArray.end(), SubjectCompare());
}

scorecardmain.cpp

#include "subject.hpp"
#include "score_card.hpp"

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    vector<Subject> sub = vector<Subject>();
    sub.push_back(Subject("Math", 90));
    sub.push_back(Subject("English", 86));
    sub.push_back(Subject("Physics", 88));
    sub.push_back(Subject("Biology", 97));


    ScoreCard sCard = ScoreCard("철수", sub);

    cout << sCard.getStudentName() << " 학생의 총점은 " << sCard.getTotal() << "입니다." << endl;
    cout << sCard.getStudentName() << " 학생의 평균점수는 " << sCard.getAverage() << "입니다." << endl;
    cout << "제일 잘한 과목은 " << sCard.findBestSubject().getName() << "로 " << sCard.findBestSubject().getScore() << "입니다." << endl;

    return EXIT_SUCCESS;
}

소감 및 총평. 역시 C++은 sucks 하군요. 역시 Ruby가 좋군요. 역시 자바는 배워놓으면 안까먹는군요 ㅎㅎ

C++의 장점.
– 성능을 위한 여러가지 배려나 inforamtion hiding을 위한 다양한 배려가 돋보임.

이 짧은 코드에서 드러나는 C++의 단점
(1) #ifndef,#define,#endif 시리즈는 정말 짜증납니다. 왜왜왜왜왜왜왜왜왜왜왜왜왜 MS의 #pragma once 와 같은 멋진 키워드가 표준에 안들어 오는걸까요.
(2) 왜왜왜왜왜왜왜왜왜왜왜 functor는 그 자리에서 곧바로 익명클래스로 만들어서 넘길 수 없는겁니까..
(3) binary_function 라니;; 물론 언어의 한계지만, 언어 차원으로 이런 predicate을 흡수할 수는 없는건지. 정말 싫어요;;

Comments

2 responses to “Java vs Ruby vs C++: 성적표 프로그램”

  1. CN Avatar

    #pragma once와 같은 키워드는 gcc 등의 컴파일러에서도 구현이 되었지만 비추하고 있습니다. 안정성의 문제로 주요 컴파일러의 구현 단체/회사 들이 비추하는 특성이 표준에 들어가는 일은 없으니깐요. MS 쪽의 상당히 자주 쓰는데 구현의 방식이 다른지는 모르겠습니다. 어쨌든 표준은 여러 구현을 통해서 현실적으로 “널리” 쓰이는 쪽에 손을 들어주는 관계로 가까운 장래에 #pragma once가 도입될 가능성은 없어 보입니다. (물론 지금도 아무도 안쓰는 export 키워드를 삽입한 고집불통 C++ 표준화 위원들의 눈에 들면 C++ 표준에는 삽입될 가능성도 있겠지요. …)

    C++의 문법적인 단점은 있지만 java와 같은 언어는 표현력에서 C++의 상대가 되지 못한다고 생각하고 있습니다. Andrei Alexandrescu의 코드를 보면 더 확신하게 됩니다. 물론 Ruby는 더 뛰어난 언어라고 생각합니다.

    예전에 루비에 대한 메타블로그 사이트를 만드셨던 걸로 기억하는데 최근에는 블로그 폭파후 (..) 루비에 대한 아티클을 적지 못하고 있네요. 다시 글을 적게 되면 연락드리겠습니다.

  2. MKSeo Avatar
    MKSeo

    C에는 전혀 없는 name 의 collision을 방지하는 기능이 C++에는 있습니다. 바로 namespace와 class라는 것이죠. 한편, C++에는 또다른 잠재적인 이름 충돌의 위험성이 있는데 그것이 바로 #ifndef/#define/#endif 입니다. #pragma 를 사용해서 한번에 unique identifier를 만들 수 있다면 무척 좋겠지만, 현실은 그렇지 않네요..

    C++과 자바의 표현력에 대해선, “Andrei Alexandrescu”의 Modern C++ Design 을 중간까지보다가 일단은 잠시 포기해버린 저로서도 C++이 더 다양한 표현이 가능하다는 점을 인정합니다. 아쉬운 점은, C++의 메타프로그래밍은 디자인된것이 아니라 ‘발견된 것’이란 점이죠. 그것이 메타프로그래밍을 작성하기도 이해하기도 난해하게 만드는 장애요소로 작용하고 있습니다. 어쨌든 C++의 장점은 말씀하신대로, 표현력(맘만 먹으면 완전한 procedural 언어로도, functional로도, 메타프로그래밍도, oop도..), performance, 수많은 레거시코드들이 아닐까 싶어요.

    루비는 메타프로그래밍이 어떻게 시작된 건지는 모르겠으나, 일단 메타 프로그래밍 자체는 꽤나 깔끔하고 쉽게 작성할 수 있습니다. 문제는 역시나 작성되는 코드가 visible 한것이 아니므로 코딩이 여전히 아주 쉬운 것만은 아니며 (하지만 템플릿에 비하겠습니까), 눈에 잘 보이지도 않는 객체의 hierarchy를 두개나 따라가야하는 문제(하나는 superclass, 다른 하나는 class)가 있습니다. 언젠가 이 쪽에 대해 완벽하고 쉽게 설명하는 바이블이 하나 나와야할텐데 말이죠. 그리고 루비 블로그에는 언제돌아오셔도 좋아요. ㅎㅎ

Leave a Reply

Your email address will not be published. Required fields are marked *