반응형

Intro


이번 포스팅에서는 C++의 장점 중 하나인 다형성에 대해 알아보도록 하겠습니다. C++을 공부하다 보면 다형성이라는 단어를 자주 접하게 될 것입니다. 하지만 다형성...이라는 단어를 접했을 때 평소 사용하지 않아서 생소했습니다. 그래서 다형성이라는 국어사전에 나온 의미에 대해 찾아봤습니다.
다형성 : 동일종(同一種)의 생물이면서도 형태나 성질이 다양성을 보이는 상태. 암수에 의한 크기·형태·색깔 등의 차이와 꿀벌에서의 여왕벌과 일벌 같은 것(구글 국어사전 검색).
위에 다형성이라는 국어사전에서 나타내는 의미를 찾아보고 다형성에 대해 학습하니 C++에서의 다형성의 개념의 이해가 잘 갔습니다. 즉, C++에서 다형성이란 동일한 메시지에 대해 복수의 다른 응답을 하는 것입니다.

오버로드 vs 오버라이드


오버로드(overload) : 한 개의 클래스 내에 동일한 이름의 멤버 함수를 복수 정의하는 것입니다.
소스코드를 통해 오버로드에 대해 살펴보도록 하겠습니다.

#include <iostream>
using namespace std;
class Anabebe
{
public:
    int        func(int a);
    double    func(double b);
};
int Anabebe::func(int a)
{
    return a*2;
}
double Anabebe::func(double b)
{
    return b*3.14;
}

int main(void)
{
    Anabebe obj;
    int a;
    double b;
    a = obj.func(10);
    b = obj.func(1.0);
    cout << a << endl;
    cout << b << endl;
}

결과

소스코드를 보면 하나의 클래스에 동일한 이름의 함수가 두개가 있습니다. 두 함수의 차이는 함수의 리턴 타입이 int, double고 함수의 인수도 int, double입니다. 이렇게 하고 main함수에서 호출을 func함수를 호출하게 되면 컴파일러가 알아서 같은 형으로 컴파일이 되기 때문에 오버로드가 실현되고 있다는 뜻입니다.
주의해야 할 점은 C++ 컴파일러는 이름과 인수로 멤버 함수를 식별하지만 반환값은 식별의 대상이 되지 않습니다. 즉, func(인수)에서 인수에 따라 식별이 된고, return타입은 고려되지 않습니다. double b = obj.func(10)이런식으로 호출을 하게 되면 b에는 20이 저장됩니다.

오버로드 활용의 두 가지 패턴
오버로드를 활용하기 위한 패턴으로는 크게 두 가지가 있습니다.
하나는 완전한 동일한 작업 내용에서 인수의 자료형만이 다른 멤버 함수를 오버로드 하는 것입니다.
sample code

class Anabebe
{
public:
    int        func(int a);
    double    func(double b);
};
int Anabebe::func(int a)
{
    return a*2;
}
double Anabebe::func(double b)
{
    return b*3.14;
}

또 다른 패턴은 인수의 수가 다른 동일한 이름의 멤버 함수를 정의하는 것입니다.
sample code

class Anabebe
{
public:
    int        func(int a);
    void    func(char* s, double a);
};
int Anabebe::func(int a)
{
    return a*2;
}
void Anabebe::func(char* s,double a)
{
    cout << s << a << endl;
}

다른 수의 인수를 가진 멤버 함수를 오버로드 할 경우에는 하나의 멤버 함수가 다른 멤버 함수를 호출하게 하면 코드를 효율적으로 설명할 수 있습니다. 호출되는 측의 멤버 함수를 수정하면 그 내용이 다른 멤버 함수에게도 반영되기 때문입니다.

오버라이드(override): 기본 클래스의 멤버 함수 처리 내용을 파생 클래스에서 재정의 하는 것을 오버라이드라고 합니다. 오버라이드는 상속한 멤버 함수의 처리 내용이 파생 클래스의 목적에 맞지 않을 경우 멤버 함수의 원형을 그대로 두고, 처리 내용을 자유롭게 재정의할 수 있다는 점에서 편리합니다. 이 구조를 연구하여 사용함으로 다형성을 실현하고 클래스를 사용하는 측의 코드를 짧고 효율적으로 설명할 수 있게 됩니다.

소스코드를 통해 확인해 보겠습니다.

#include <iostream>
using namespace std;
class Anabebe
{
public:
    virtual void showdata();
};

void Anabebe::showdata()
{
    cout << "Anabebe Class 호출" << endl;
}

class Anabebe2 : public Anabebe
{
public:
    void showdata();


};
void Anabebe2::showdata()
{
    Anabebe::showdata();
    cout << "Anabebe2 Class 호출" << endl;
}

int main(void)
{
    Anabebe2 obj2;
    obj2.showdata();
}

결과

코드를 보면 Anabebe2에서 Anabebe클래스를 상속받아 showdata() 함수를 재정의 했습니다. 코드를 이렇게 보면 정말 아무것도 아닌 것처럼 보이는데 이걸 긴 코드에서 테크닉 적으로 사용하면 코드를 보다 짧고 효율적으로 설명할 수 있습니다.

마무리


이번 포스팅에서 C++에서 다형성을 실현하기 위한 오버로드와 오버라이드에 대해 알아봤습니다. 오버라이드에서 순수 가상 함수와 추상 클래스에 대한 내용이 빠졌는데.. 이걸 추가하다 보면 너무 길어질 것 같아서 다음번에 따로 포스팅을 하도록 하겠습니다.
마지막으로 오버로드, 오버라이드 두 개의 차이를 정리하자면 오버로드는 한 개의 클래스 내에 동일한 이름의 멤버 함수를 복수 정의하는 것이고, 오버라이드는 기본 클래스의 멤버 함수 처리 내용을 파생 클래스에서 재정의 하는 것을 오버라이드라고 합니다.
오버로드, 오버라이드 C++에 다형성을 실현하기 위한 기능이지만, 프로그래머가 코드를 구현할 때 꼭 사용해야 하는 테크닉은 아닙니다. 하지만 두 개념을 이해하고 프로그래밍을 하면 보다 효율적이고 재미를 느낄 수 있을 것입니다.
그럼 이만 포스팅 마치겠습니다. 감사합니다.

반응형
반응형

Intro


오늘은 제가 취업 준비에 활용한 채용 관련 사이트를 소개하려고 합니다.

저의 준비 방법을 최고라고 생각하지는 않지만, 정보 공유 차원에서 올리는 것이니 참고만 바랄게요ㅎ

저는 아래 사이트들에서 많은 도움을 받았던 거 같아요

- 구글 채용 정보 서비스

- 원티드

- 그 외. 프로그래머스, 백준, SW expert academy

하나씩 소개해 드리겠습니다!

구글 채용 정보 서비스


웹 사이트는 아니지만, 구글 검색창에 원하는 직무를 검색하면, 여러 채용 사이트에 올라온 공고를 한 눈에 확인할 수 있어요!

아래는 "머신러닝 채용"을 검색한 결과 입니다.

채용정보 더보기를 클릭하면, 더 구체적인 정보를 확인할 수 있습니다.

프로그래머스, 원티드 등 채용 사이트 뿐만 아니라, 회사 자체 홈페이지의 공고를 함께 볼 수 있습니다.

다만 잡플래닛, 사람인 등 대형(?) 취업 정보 사이트의 공고는 올라오지 않는 거 같아요. 저는 여기에서 원하는 공고를 거의 다 찾을 수 있었는데, 부족하다고 생각하시는 분은 잡플래닛과 사람인 등을 함께 사용하시는게 좋겠네요.

제가 구글 채용 정보 서비스를 추천하는 다른 이유는, 사이트 하단의 신규 채용 정보 알림 기능입니다!

취업 준비하면서 가장 귀찮아도 필요했던 일이 새로운 공고가 올라온게 없는지 확인하는 거였는데요, 이 기능을 활성화 시키면, 제가 찾는 조건과 키워드에 맞는 새로운 공고가 올라왔을 때 연결된 이메일로 해당 공고 정보를 보내줍니다.

저는 이 기능 덕분에 원하는 공고를 쉽게 찾을 수 있었던 거 같아요! 안 써보신 분은 한 번 써보세요 ㅎㅎㅎ

원티드

원티드는 제가 머신러닝 관련 공고를 많이 찾다보니까, 자주 눈에 보여서 사용하게된 사이트입니다.

제가 원티드를 추천하는 이유는 2가지 입니다.

  1. 쉬운 (자소서를 안써도 되는) 공고 지원
  2. 채용 담당자의 빠른 피드백

조금 더 자세하게 말씀드릴게요.

쉬운 (자소서를 안써도 되는) 공고 지원

원티드는 처음에 조금 시간만 들이면, 그 이후에 공고 지원이 아주 쉽더라고요.

처음에 시간을 들여야 하는 일은, 1) 이력서2) 포트폴리오를 만드는 겁니다. 정해진 양식없이 자기의 능력을 어필할 수 있도록 (자신 있는 성과를 초반에 배치) 만드는게 좋을 거 같아요. 이력서와 포트폴리오 작성하는 방법은 이 글에서 다루지 않겠습니다.

이력서와 포트폴리오를 만든 다음에는 원하는 직무를 찾고, 미리 작성한 이력서와 포트폴리오를 첨부하고, 지원 버튼을 누릅니다. 지원 버튼을 누르고 나면, 지원한 공고와 비슷한 여러 공고가 보여집니다. 여기서 맘에 드는 공고를 선택하고, 지원하기 버튼을 한 번 더 누르면, 한 번에 여러 회사를 지원할 수 있게 됩니다!

회사마다 자소서의 질문 항목도 달라서 그동안 자소서 쓰느라 머리아팠는데, 원티드를 통해 지원하니 너무 편했어요.

같은 회사의 같은 공고라도, 회사 홈페이지를 통해 지원하면 자소서를 쓰고, 원티드를 통해 지원하면 자소서를 안써도 되는 경우가 있더라고요!

채용 담당자의 빠른 피드백

위 사진을 보면, 원티드에서 제가 지원한 공고의 평균 응답일과 응답 비율 정보를 제공해줘요. 이렇다 보니, 기업의 채용 담당자분들이 이 수치를 관리하기 위해서, 다른 경로를 통해 지원했을 때보다 비교적 빠르게 응답해주는 느낌을 받았습니다.

저만의 경우일 수도 있지만, 5개의 기업에 지원하고, 4개의 기업에서 3일 이내에 피드백이 왔습니다.

4개 중 1개 기업은 자소서 작성을 부탁하고, 나머지 3개 기업은 바로 코딩 테스트나 과제 테스트를 진행했습니다.

코딩 테스트와 과제 테스트는 개인이 얼마나 준비했느냐에 달린 것이기 때문에, 여기에 대해서는 팁이라고 할 수 있는게 없지만, 저는 원티드를 통해 이 과정까지 도달하는 시간을 많이 절약할 수 있었다고 생각합니다.

그 외


프로그래머스

  • 개발 관련 직군 채용 공고와, 코딩 테스트를 대비할 수 있는 사이트에요! 많은 회사들이 프로그래머스를 통해 코딩 테스트를 진행하므로, UI에 익숙해질 필요가 있으며, 다른 코딩 테스트 대비 사이트에는 없는 SQL문제도 있기 때문에, 머신 러닝이나, 데이터 분석 직무를 준비하시는 분들은 프로그래머스의 SQL문제 꼭 풀어보는걸 추천 드려요!

백준

  • 코딩 테스트 공부의 바이블이라고 생각합니다. 수많은 알고리즘 문제들이 종류별, 난이도별, 테마별로 정리되어있습니다. 모르는 문제는 구글에 검색하면 답을 찾을 수 있을 정도로 많은 사람들이 사용하고 있습니다.

SW expert academy

  • 삼성전자의 SW 역량 테스트를 준비하시는 분들은 꼭 봐야할 사이트 입니다. 문제의 품질?이나 테스트 케이스가 백준만큼 정교하지는 않지만, 지난 기출 문제와 함께 모의 문제까지 풀어보는 걸 추천드립니다.

마무리


오늘은 제가 취업 준비하는데 참고했던 사이트들을 정리해봤습니다. 더 좋고 효율적인 방법 알고계신 분은, 댓글을 통해 공유해주시면 감사하겠습니다.

좋은 하루 보내세요!

반응형
반응형

Intro


이번 포스팅에서는 tuple에 대해 알아보도록 하겠습니다. 튜플은 보통 프로그래밍을 하다 보면 함께 사용되는 변수들을 하나로 묶어서 사용할 때 사용합니다. 특히 함수의 반환 값으로 2개 이상의 값을 반환할 때가 자주 사용됩니다. 보통은 변수들을 묶을 때 구조체(struct)를 사용하지만 구조체를 구현하면 귀찮기 때문에 tuple을 사용하면 편리합니다. 보통 2개의 데이터를 묶을 때는 std::pair을 사용하고 3개 이상이면 std::tuple를 사용합니다.

tuple


간단한 코드를 통해 tuple을 사용해 보겠습니다. tuple을 사용하기 위해선 tuple을 include 해 줘야 합니다. #include

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    int nNum = 10;
    char a = 'A';
    string str = "anabebe";
    tuple<int, char, string>User = tuple<int, char, string>(nNum, a, str);
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;
    get<0>(User) = 20;
    get<1>(User) = 'B';
    get<2>(User) = "anebebe2";
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;

}

결과

tuple에 int, char, string 세가지 변수를 tuple로 묶었습니다. tuple을 값을 참조할 때 get을 사용합니다. get은 해당 값을 얻을 수 있고, 저장된 값을 변경할 수도 있습니다. 값 얻을 때 : get<0>(User), 값 바꿀 때 : get<0>(User) = 10;
그리고 tuple의 값을 호출할 때 호출하는 자료의 형이 맞지 않으면 인수 목록이 일치하는 생성자의 인스턴트가 없다는 메세지와 오류가 뜹니다.

make_tuple
방금 전 코드는 변수로 tuple을 초기화 했는데 make_tuple를 사용하면 더 편리하게 tuple을 정의할 수 있습니다. 코드를 통해 확인하도록 하겠습니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{

    tuple<int, char, string>User = make_tuple(30, 'C',"anabebe3");
    cout << get<0>(User) << endl;
    cout << get<1>(User) << endl;
    cout << get<2>(User) << endl;

}

결과

이전 코드와의 차이는 tuple 생성과 make_tuple를 통해 User라는 tuple을 초기화해줬습니다. 물론 tuple을 선언할 때 빈 값으로 생성도 가능합니다.

tuple_size
tuple의 저장된 데이터 개수를 알고 싶을 때 std::tuple_size를 사용합니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    tuple<int,int,int, char, string>User = make_tuple(10,20,30, 'C',"anabebe3");
    auto nTupleCount = tuple_size <decltype(User)>::value;
    cout <<"저장된 User의 요소 수 : " <<nTupleCount << endl;
}

결과

tuple_cat
tuple_cat를 사용하면 tuple와 tuple를 합칠 수 있습니다.

#include <iostream>
#include <tuple>
using namespace std;

int main(void)
{
    tuple<int, char, string>User = make_tuple(10, 'A', "anabebe1");
    tuple<int, char, string>User2 = make_tuple(20, 'B', "anabebe2");
    auto User_cat = tuple_cat(User, User2);
    cout << get<0>(User_cat)<<endl;
    cout << get<1>(User_cat) << endl;
    cout << get<2>(User_cat) << endl;
    cout << get<3>(User_cat) << endl;
    cout << get<4>(User_cat) << endl;
    cout << get<5>(User_cat) << endl;

}

결과

User_cat의 값을 출력해주면 User + User2의 인덱스의 순서대로 User_cat에 저장 되는걸 볼 수 있습니다.

마무리


이번 포스팅에서는 tuple에 대해 다뤄 봤는데 tuple의 가장 큰 장점은 귀찮게 구조체나 컨테이너를 사용하는 번거로움을 줄여준다고 생각합니다.
그럼 이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

'[C++ STL]' 카테고리의 다른 글

[C++ STL - forward_list]  (0) 2021.06.24
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr]  (0) 2021.06.08
[C++ STL - range based for]  (0) 2021.05.13
[C++ STL - 람다(lambda)]  (0) 2021.05.04
[C++ STL - auto]  (0) 2021.04.28
반응형

Intro


이번에 포스팅에서는 auto와 더불어 유용하고, 사용하기 쉬운 기능 중 하나인 range based for에 대해 포스팅을 시작하겠습니다.

range based for


range based for를 사용하면 반복만을 아주 쉽고 안전하게 사용이 가능합니다. 이 기능은 기존의 visual C++의 특화 기능인 for each문과 비슷합니다. 때문에 기존의 for each를 사용하고 있는 개발자라면 for each를 range based for 문으로 바꾸어 사용하면 됩니다.

간단한 예시코드를 통해 일단 for문과 range based for문의 차이를 알아보겠습니다.

#include <iostream>
using namespace std;
int main(void)
{
    int nNumList[5] = { 5,6,7,8,9 };
    cout << "for문" << endl;
    for (int i = 0; i < 5; i++)
        cout << nNumList[i] << endl;

    cout << "ranged based for문" << endl;
    for(auto i : nNumList)
        cout << i << endl;
}

결과

코드로 보면 별차이 없어 보입니다. 하지만 가장 큰 차이는 for문은 for(int i = 0;i<5;i++) i = 0, i = 5까지 직접 넣어주었고 ranged based for문은 for(auto i : nNumList) nNumList의 처음부터 끝까지 자동으로 범위를 지정해주었습니다. 자동으로 for문의 범위를 지정해준다는 의미는 생각보다 큽니다. 보통 for문을 이용해 배열의 끝까지 자동으로 데이터 값을 얻기 위해서는 개발자가 직접 for문의 범위를 지정해주거나 sizeof를 사용하여 배열의 크기를 얻는 방법이 있는데 range based for문을 사용함으로 반복문의 사용이 편리해졌을 뿐만 아니라 for문을 사용할 때 종료 조건이 잘못되어 메모리를 침범하게 되는 위험도 피할 수 있습니다.

range based for문을 STL 컨테이너도 사용이 가능합니다. 간단한 예시 코드로 알아보겠습니다.

#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;

int main(void)
{
    cout << "range based for - vector" << endl;

    vector<int>NumList;
    NumList.push_back(5);
    NumList.push_back(6);
    NumList.push_back(7);
    NumList.push_back(8);
    NumList.push_back(9);

    for (auto i : NumList)
        cout << i << endl;

    cout << endl;

    cout << "range based for - unoedered_map" << endl;
    unordered_map<int, string> NumString;
    NumString.insert(make_pair<int, string>(1, "abc"));
    NumString.insert(make_pair<int, string>(2, "def"));
    NumString.insert(make_pair<int, string>(3, "ghi"));

    for (auto i : NumString)
        cout << "Num : " << i.first << ", string : " << i.second << endl;


}

결과

기본적으로 STL의 iterator를 지원하는 컨테이너라면 range based for문을 문제없이 사용할 수 있습니다. 그러므로 프로그래머가 자신만의 컨테이너를 만들 때 STL에서 정의한 iterator의 기능을 구현하면 range based for문을 사용할 수 있습니다.

코드를 구현하다보면 for문을 이용해 데이터 요소 값을 바꾸고 싶을 때가 있습니다. 그럴 때는 참조를 사용하면 됩니다.
for (auto& i : nNumList)

예시코드

#include <iostream>
using namespace std;
int main(void)
{
    int nNumList[5] = { 5,6,7,8,9 };
    cout << "for문" << endl;
    for (int i = 0; i < 5; i++)
        cout << nNumList[i] << endl;
    cout << "ranged based for문" << endl;
    for (auto& i : nNumList)
        i = 10;
    for (int i = 0; i < 5; i++)
        cout << nNumList[i] << endl;
}

결과

for문에서 요소 값을 변경하지 못하도록 하려면 const를 사용하면 됩니다.
for(auto const i : nNumList)

마무리


저 같은 경우 영상처리 알고리즘을 돌릴 때 보통 for문의 범위를 수동으로 지정하거나 자료형의 sizeof를 통해 크기를 얻어 범위를 지정해서 돌리기 때문에 가끔 메모리 침범해서 벅나는 경우가 많았습니다. 하지만 range based for을 사용하면 개발자의 실수에 의한 메모리 침범을 피할 수 있는 게 가장 큰 장점인 것 같습니다.

그럼 이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

'[C++ STL]' 카테고리의 다른 글

[C++ STL - forward_list]  (0) 2021.06.24
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr]  (0) 2021.06.08
[C++ STL - tuple]  (0) 2021.05.21
[C++ STL - 람다(lambda)]  (0) 2021.05.04
[C++ STL - auto]  (0) 2021.04.28
반응형

 안녕하세요, 이번 시간에는 AWS에서 Machine Learning 기반 어플리케이션을 제작하고, 배포하기 위해서 사용되는 주요 서비스들을 정리하려고 합니다.

 아래 사진은 AWS에서 제공하는 서비스들을 일부 캡처한 것입니다. 보시는 바와 같이, 다양한 목적에 따라 세분화된 걸 볼 수 있습니다. 따라서 Machine Learning 기반 어플리케이션을 제작, 배포하기 위해서는 여러 서비스를 함께 사용해야 합니다.

AWS에서 제공하는 다양한 서비스들

 이번 글에서는 제가 실습에 사용했던 서비스들만 정리하도록 하겠습니다. 이것들만 있어도 Machine Learning 기반 어플리케이션을 제작, 배포할 수 있습니다. 위 사진에서 이미 즐겨찾기 되어있네요 ㅎㅎ.

 

  • EC2 (Elastic Compute Cloud)
    • 한 줄 요약 - 클라우드의 가상 서버
    • GPU가 없는 나만의 컴퓨터라고 생각할 수 있습니다. (GPU는 특수한 업무를 수행할 때만 필요하므로, 따로 그 업무를 실행할 때 설정해서 사용할 수 있습니다.)
    • 필요에 따른 CPU, RAM, 네트워크 사양에 따라 적절한 EC2 intance를 생성하면, 사용가능합니다.  
  • IAM (Identity and Acess Management)
    • 한 줄 요약 - 사용자 엑세스 및 암호화 키 관리
    • 우리처럼 튜토리얼 수준이 아닌, 여러 명이 AWS를 활용해서 대규모 프로젝트를  수행할 수 있죠, 이때 명시적인 역할 분담을 돕는 서비스가 IAM이라고 할 수 있습니다. (1명인 경우에도 IAM은 필요합니다! root 처럼요.)
    • IAM을 사용해서 협업하는 사람들의 역할을 정하고, 각각 사용할 수 있는 서비스, 자원 등의 접근 권한을 부여합니다. 그래야 혹시 모를 자원의 낭비나, 실수로 인한 피해를 방지할 수 있죠!
    • policy (정책), user (사용자), role (역할)을 설정해서 사용할 수 있습니다.
  • Cloud9
    • 한 줄 요약 - 클라우드 기반 IDE (통합 개발 환경)
    • 코드의 작성, 실행 및 디버깅을 위한 IDE를 클라우드 (web) 상에서 다룰 수 있게 해주는 서비스입니다.
    • Cloud9 instance를 생성할 때, IDE를 실행할 EC2 instance도 함께 만들어집니다.
    • 터미널을 통한 data 다운로드 및 코드 실행 (application 배포까지)도 가능합니다.
  • S3 (Simple Storage Service)
    • 한 줄 요약 - 클라우드 기반 데이터 저장소
    • 우리가 프로젝트를 진행할 때, 필요한 데이터를 저장하고 검색할 수 있는 기능을 지원하는 서비스입니다.
    • 예를 들어, 아래에 있는 SageMaker의 jupyter notebook instance를 통해서 training dataset을 다운로드 할 때, 다운로드 받을 파일이 저장된 위치나, 다운로드한 파일을 저장할 S3 instance (bucket이라고도 합니다.) 의 주소?를 통해 접근할 수 있습니다.   
  • SageMaker (Sage: 현자)
    • 한 줄 요약 - Machine Learning 모델의 구축, 학습, 및 배포
    • Cloud9에서, Machine Learning과 관련된 기능을 따로 때왔다고 볼 수 있습니다.
    • 크게 jupyter notebook, inference (endpoint)로 구성되어있습니다.
    • 다양한 기능을 수행할 수 있는 GUI를 제공하지만, jupyter notebook instance에서 EDA, 모델 훈련, 모델 배포 등 거의 대부분의 기능을 수행할 수 있습니다.
      • EDA를 위한 기본적인 library가 설치되어있고, 터미널도 지원합니다.
    • 모델을 배포해서 새로운 data에 대해서 inference를 수행하기 위해서는 endpoint가 필요합니다.
      • 새로운 data를 학습된 모델에게 전달하고, 그 output을 다시 돌려주는 역할을 합니다.  
  • Lambda
    • 한 줄 요약 - 배포된 어플리케이션의 트래픽 자동 관리
    • 어플리케이션을 배포하는 걸로 끝이 아닙니다. Cloud9 instance를 통해 어플리케이션을 성공적으로 배포했다고 해도, Cloud9이 구동되는 EC2 instance의 사양은 동적으로 변하지 않고 그대로 입니다.
    • 하지만 우리가 배포한 어플리케이션을 사용하고자 하는 사용자들은 몰릴 때도 있고, 그렇지 않을 때도 있죠.
    • 따라서 트래픽이 변해도 안정적으로 어플리케이션을 서비스할 수 있도록, 부하를 관리해주는 load balancer 역할을 해주는 서비스가 Lambda 입니다.

이렇게 실습을 위해 필요한 AWS 서비스들에 대한 정리가 끝났습니다!

다음 글부터는 본격적인 실습에 들어가면서, 이 글에서 소개해드린 서비스들이 어떻게 서로 연결되어서, 하나의 어플리케이션을 배포할 수 있게 되는지 정리해보겠습니다.

글 읽어주셔서 감사합니다!

 

반응형

'[Machine Learning]' 카테고리의 다른 글

HNE - proximity preserving methods(2)  (0) 2021.09.27
HNE - proximity preserving methods(1)  (0) 2021.09.27
HNE (Heterogeneous Network Embedding) - 소개  (0) 2021.08.31
AWS (1) 시작하기  (0) 2021.04.27
반응형

Intro


이번 포스팅에서는 객체지향의 3가지 특성에 대해 알아보도록 하겠습니다. 객체 지향의 이해 방법의 하나로 "객체지향이란 상속, 캡슐화, 다형성을 사용하는 것"이라는 말이 있을 정도로 객체지향을 이해하는데 핵심 내용입니다.

객체지향의 3가지 특성


  1. 상속(inheritance)
    • 다른 클래스의 멤버를 인계하여 새로운 클래스를 정의하는 것입니다.
    • 같은 특징 있는 클래스를 그대로 물려받아 재사용 가능하기 때문에 효율성을 늘릴 수 있습니다.
    • 하위 클래스는 상위 클래스로부터 상속받은 멤버 외에 새로운 멤버 구성하여 사용할 수 있습니다.

상속의 가장 큰 장점은 재사용에 있다고 생각이 됩니다. 상위 클래스의 멤버를 하위 클래스에서 재사용함으로 소프트웨어 개발에 편의성이 증대된다고 생각이 됩니다.

  1. 캡슐화(Encapsulation)
    • 연관 있는 멤버를 클래스로 묶는 작업을 의미합니다.
    • 클래스의 멤버를 부분적으로 은폐하는 것입니다.
    • 클래스가 지닌 멤버 가운데 클래스를 사용하는 측에서 필요한 것만을 공개하고 클래스 내에서만 사용되는 멤버를 감추는 것입니다.

캡슐화는 외부에 데이터를 은닉하는데 많이 사용이 되는데 멤버의 정의를 접근 지정어로 private, protected, public로 선언을 해줍니다.

  1. 다형성
    • 같은 모양의 함수가 동일한 메시지에 대해 복수의 다른 응답을 하는 것입니다.
    • 하나의 클래스의 내부에 동일한 이름의 함수를 만들어 함수의 타입을 다르게 하거나, 파라미터의 개수를 다르게 하눈 오버 로딩(overloading)의 특성이 있습니다.
    • 상속받은 함수를 재정의 하는 오버 라이딩(overriddng)의 특성이 있습니다.
      멤버의 오버 로딩과 오버 라이딩을 통해 동일한 함수의 다른 메시지를 출력하여 객체지향의 특징인 다형성을 실현할 수 있습니다.

마무리


상속, 캡슐화, 다형성의 목적은 현실 세계를 그대로 모델링하여 프로그래밍의 효율화에 목적이 있습니다. 따라서, 프로그래밍을 할 때 객체지향의 특성을 꼭 사용해야 필수는 아닙니다. 그냥 필요한 상황에 쓰는 테크닉입니다. 필수는 아니지만 아마도 개발을 하시게 되면 분명히 쓰시게 될 거라고 생각합니다. 다음 시간에는 위에 설명했던 객체지향의 특성이 어떻게 사용되는지 자세히 알아보도록 하겠습니다.

반응형
반응형

Intro


절차지향 프로그래밍과 객체지향 프로그래밍의 차이는 많은 책들에서 초기 도입 부분에 많이 설명되고 기업의 신입 면접에서도 가끔 맨 처음 기본이 있는지 알아보기 위해 물어보던 내용입니다. 이번 포스팅을 통해 절차 지향 프로그래밍과 객체지향 프로그래밍의 차이의 비교와 장, 단점을 이해하는 시간을 가져보도록 하겠습니다.

절차지향 vs 객체지향


절차지향 프로그래밍이란?
절차지향 프로그래밍은 일련의 흐름에 의해 진행되는 프로그래밍입니다. 사람들이 폭포에 많이 비교를 하는데 물이 위에서 아래로 떨어지듯 코드의 흐름이 위에서부터 아래로 순서대로 진행되는 방식입니다. 예를 들어 사람을 프로그래밍화 해서 구성할 때 머리->몸통->왼팔->오른팔->왼다리->오른다리 이런 식으로 일련의 순서를 기준으로 잡고 프로그래밍하는 방식입니다. 사람이라는 코드를 만들 때 구성하는 순서는 기준에서 바뀌지 않습니다.

절차지향 프로그래밍 대표 언어

  • C언어
  • 파스칼
  • 코볼

C언어는 아는데.. 파스칼 언어와 코볼은 잘 몰라서 위키에서 찾아봤습니다.
파스칼 언어 : 포인터를 사용한 구조적 프로그래밍과 데이터 구조화(data structuring)를 그 특징으로 한다. 파스칼 참조 링크
코볼 언어 : 사무용으로 설계된, 영어와 같은 컴퓨터 프로그래밍 언어이다. 코볼은 주로 비즈니스, 금융, 회사/정부 관리 시스템에 주로 사용된다.코볼 참조 링크

장점

  • 컴퓨터 구조와 유사하여 처리속도가 빠르다.
  • 개인 프로젝트나 과제 같이 길지 않은 프로젝트에 적합.

단점

  • 유지 보수가 어렵다.
  • 대규모 프로젝트에 적합하지 않다.
  • 실행 순서가 정해져 있으므로 코드의 순서가 바뀌면 동일한 결과를 보장하기 어렵다.

객체지향 프로그래밍이란?
객체지향 언어는 대상에 주목하여 프로그램을 작성하는 프로그래밍입니다. 여기서 대상에 주목한다는 말은 작업의 소유자가 객체이고, 개개의 객체는 작업(함수)을 가지고 객체가 다른 객체의 함수를 호출함으로 프로그래밍을 작동시키는 프로그래밍입니다. 객체지향을 통해 사람을 프로그래밍할 때 절차 지향과는 달리 사람을 구성하는데 순서에 제약이 없습니다.

객체지향 프로그래밍 대표언어

  • C++
  • Java
  • Python

장점

  • 코드의 재사용이 쉽고, 유지 보수가 쉽다.
  • 디버깅이 상대적(절차 지향에 비해)으로 쉽다
  • 직관적인 코드 분석이 가능하다.

단점

  • 코딩의 난이도 증대
  • 실행 속도가 상대적으로 절차 지향 프로그래밍에 비해 느림

마무리


이번 포스팅에서 절차지향 프로그래밍과 객체지향 프로그래밍이 무엇인지와 장, 단점을 비교해봤습니다. 위에 내용만 봤을 때는 객체지향 프로그래밍이 더 좋은 프로그래밍 기법이라고 생각할 수 있습니다. 하지만 객체지향 프로그래밍이 더 우수한 프로그래밍 기법은 아닙니다. 용도의 차이가 있을 뿐입니다. 요즘에는 컴퓨터의 성능이 아주 우수하기 때문에 메모리에 크게 제약을 받지는 않습니다. 하지만 예를 들어 메모리가 작은 아주 저가의 임베디드 보드에 숫자를 카운트할 수 있는 기능을 넣었다고 가정했을 때 절차 지향 프로그래밍은 그냥 숫자를 세는 함수를 호출하면 되는데 객체지향 프로그래밍은 객체를 선언하고 함수를 호출해야 되기 떄문에 메모리 관리 측면에서 절차지향 프로그래밍이 더 유리합니다.
이상으로 포스팅을 마치며 다음 시간에는 객체지향의 특징인 상속, 캡슐화, 다형성에 대해 알아보도록 하겠습니다. 감사합니다.

반응형
반응형

Intro


안녕하세요. 이번 시간에는 C++에서 함수를 호출 방법에 대해 알아보도록 하겠습니다. 지난 시간에 STL 람다에 대해 스터디를 할 때 캡처에서 Call by value(값에 의한 호출)와 Call by reference(참조에 의한 호출)의 개념이 나와서 정리해보는 시간에 대해 갖겠습니다.

Call by value(값에 의한 호출) vs Call by reference(참조에 의한 호출)


함소를 호출하는 방법에는 2가지 방법이 있습니다. Call by value(값에 의한 호출)과 Call by reference(참주에 의한 호출)입니다.

Call by value(값에 의한 호출) : Call by value는 함수에 원본 값을 그대로 전달하여 복사해서 사용하는 방식입니다. 원본을 그대로 복사하여 사용하기 때문에 원본에 영향을 미치지가 않습니다. 함수에서 원본에 대해 아무리 무언가를 바꿔도 그 함수 내에서만 영향을 끼치고, 함수 밖에서는 전혀 영향을 끼치지 못합니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>  
void func(int n)  
{  
    n = 20;  
    std::cout << "함수에서 호출" << n << std::endl;  
}  

int main(void)  
{  
    int nNum = 0;  
    func(nNum);  
    std::cout <<"Main함수 호출"<< nNum << std::endl;  
    return 0;  
}  

결과

결과를 보면 func함수의 매개 변수로 원본값인 nNum을 전달하여 nNum에 숫자를 대입했습니다. 대입 후 결과를 봤을 때 nNum의 값은 func함수에서만 변화하였고, Main함수에서는 초기 초기화한 그대로 0이 출력이 됩니다. 함수 안에 n = 20; 은 함수가 종료되며 자동으로 소멸되기 때문입니다. 그래서 실제 함수에서 변경되는 값을 받고 싶으면 함수에 return값을 주거나 Call by reference를 통해 주소를 참조하면 됩니다.

return 타입을 통해 값 변경

#include <iostream>
int func()
{
    int n = 20;
    std::cout << "func함수 호출" << n << std::endl;
    return n;
}

int main(void)
{
    int nNum = 0;
    nNum = func();
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

Call by reference(참조에 의한 호출) : Call by reference는 주소에 의한 호출로 주소를 참조하여 호출하는 방식입니다. 원본의 주소값을 전달하기 때문에 원본을 변경할 수 있습니다.

간단한 example 코드에서 확인해 보겠습니다.

#include <iostream>
void func(int *n)
{
    *n = 20;
    std::cout << "func함수 호출" << *n << std::endl;
    std::cout << "func함수 호출" << n << std::endl;
}

int main(void)
{
    int nNum = 0;
    func(&nNum);
    std::cout <<"Main함수 호출"<< nNum << std::endl;
    return 0;
}

결과

함수에 주소를 전달하여 값을 변경했기 때문에 nNum의 값은 함수가 종료가 되어도 메모리 상에 있는 20이라는 값을 유지 합니다. 이유는 원본(nNum)에 주소 값을 통해 접근했기 때문입니다. 위의 결과에 0000009C08FCF710이 원본이 가지고 있는 주소 있니다. 저 주소는 프로그램이 끝날 때까지 가지고 있는 주소입니다.

마무리


오늘은 Call by value vs Call by reference에 대한 포스팅을 해 봤습니다. Call by value vs Call by reference는 C++에서 가장 기본이 되는 개념중 하나입니다. 함수를 호출할 때 매개변수로 전달받은 값이 원본에 영향을 끼치는지 주의 깊게 살펴봐야 합니다.

이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형
반응형

Intro


오늘은 STL 람다에 대해 알아보도록 하겠습니다. 람다는 저도 써본 적이 없고 솔직히 회사 생활하면서 누가 구현한 걸 본 적도 없었습니다.. 그냥 어떤 거구나 정도만 알고 있었던 기능입니다.

실제로 써본적은 없지만 이번에 공부하며 잘만 활용한다면 괜찮은 기능 이 될 것 같습니다(과연... 잘 활용할 수 있는지 의문입니다).

그럼 STL 람다에 대해 자세히 알아 보도록 하겠습니다.

람다(lamda)


람다는 람다 함수 또는 이름 없는 함수라고 불립니다. 그 성질은 함수 객체와 비슷하다고 생각하시면 될 것 같습니다.

람다의 장점

  1. find_if, sort 등의 알고리즘을 사용할 때 특정 조건자를 사용하려면 함수 객체를 선언해야 하는데 람다를 사용하면 객체를 선언할 필요가 없다.
  2. 코드의 길이가 줄어든다.(객체를 선언할 필요가 없기 때문에 코드의 길이가 줄어든다.)

단점

  1. decltype와 sizeof에서 사용이 불가능하다.

람다의 기본 구조

 #include<iostream>
int main(void)
{
    []//  람다 캡쳐
    ()//  함수의 인수 정의
    {}//  함수의 본체
    ();// 함수의 호출
    return 0;
}

Example


지난 시간에 스터디한 auto를 활용하여 람다 변수를 대입할 수 있습니다.auto가 편하긴 편하네요...

 #include<iostream>
int main(void)
{

    auto func = []() {std::cout << "anabebe" << std::endl;};
    func();
    return 0;
}

결과

일반 함수처럼 파라미터도 넘길 수 있습니다.
Example Code

#include<iostream>
int main(void)
{
    auto func = [](int Num) {std::cout << Num << std::endl;};
    func(99);
    func(999);
    func(9999);
    return 0;
}

결과

람다는 변환값(return)을 넘길 수도 있는데, 변환 값(return)의 형은 명시적으로 지정할 수도 있고 암묵적으로 추론이 가능합니다. 그냥 함수처럼 반환 값을 넘기는데 형을 이건 float로 반환해라, 이건 int로 반환해라 할 수도 있고 값을 넘기면 알아서 추론이 가능하게 암묵적으로 추론도 가능하다는 뜻입니다.
Example Code

#include<iostream>
int main(void)
{
    auto func1 = []() {return 3.14;};
    auto func2 = [](float f) {return f;};
    auto func3 = []()->float {return 3.14;};

    float f1 = func1();
    float f2 = func2(3.14f);
    float f3 = func3();
    return 0;
}

람다 캡처
람다를 사용할 때 외부에 정의되어 있는 변수를 내부로 사용하고 싶을 면 그 변수를 캡처하면 됩니다. 캡처는 참조나 복사로 전달이 가능하고, 참조할 때는 &를, 복사로 전달할 때는 그냥 변수 이름을 대입하면 됩니다.

보통 C++에서 사용할 때 Call by Value & Call by Reference를 생각하시면 될 것 같습니다. 흠.. STL을 공부하시면 개념은 알 거라고 생각하고.. 넘어가도록 하겠습니다.

Example Code

#include <iostream>
#include <vector>
#include <algorithm>
int main(void)
{
    std::vector<int>Num;
    int nSum = 0;
    for (int i = 1;i <= 10;i++)
        Num.push_back(i);

    std::for_each(Num.begin(), Num.end(), [&nSum](int sum) {nSum += sum;});
    std::cout << "Sum = " << nSum << std::endl;

    return 0;
}


vector Num에 1~10까지의 숫자를 넣고 for_each함수에 람다 함수를 넣고 캡처 기능을 써서 nSum에 vector값을 더해 줬습니다. 만약 &nSum을 그냥 nSum으로 복사로 캡쳐를 하게 되면 컴파일 에러가 납니다. 이 때 std::for_each(Num.begin(), Num.end(), [=](int sum)mutable {nSum += sum;}); mutable를 추가 하게 된다면 컴파일 에러 없이 사용이 가능합니다. 하지만 복사로 캡쳐를 했기 때문에 람다 내부에서 변경한 외부 변수의 값은 람다를 벗어나면 원래 값인 0으로 출력이 됩니다.

std::for_each(Iterator first, IIterator last, Function fn);
first부터 last전까지 원소들의 각각에 대해 fn을 실행합니다.

Default 캡쳐
람다는 외부의 모든 변수를 참조로 캡처하고 일부는 복사 또는 참조로 캡처가 가능합니다.

int n1, n2, n3, n4, n5;
[&, n1, n2] {};//n3,n4,n5는 참조, n1,n2는 복사
[=, &n1, &n2] {};//n3,n4,n5는 복사, n1,n2는 참조

예를 들어 람다를 [&, n1, n2] {};으로 선언을 했을 때 n1와 n2는 복사로 캡처를 하고, 맨 앞에 &을 선언함으로 나머지 n3,n4,n5는 참조로 캡쳐를 한다는 의미입니다. 반대로 [=, &n1, &n2] {};했을 때 n1과 n2는 참조로 캡쳐를 하고, =을 선언함으로 나머지 n3,n4,n5는 복사로 캡쳐를 한다는 의미입니다.

마무리


람다는 공부하며 느낀 람다의 가장 큰 장점은 STL 중에 find_if나 sort, 그리고 아까 사용했던 for_each 등 알고리즘을 사용할 때
특정 조건자를 사용하려면 함수 객체를 따로 정의해야 했는데, 람다를 사용하니 그 부분이 줄어들었습니다. 확실히 코드의 길이는 줄어듭니다. 하지만 아직 숙련이 부족해서 그런지 익숙하지 않네요....  분명 잘 활용하면... 좋을 것 같긴한데...

이상으로 포스팅을 마치겠습니다. 감사합니다.

반응형

'[C++ STL]' 카테고리의 다른 글

[C++ STL - forward_list]  (0) 2021.06.24
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr]  (0) 2021.06.08
[C++ STL - tuple]  (0) 2021.05.21
[C++ STL - range based for]  (0) 2021.05.13
[C++ STL - auto]  (0) 2021.04.28
반응형

Intro


이번에 MySQL문법을 따르는, table에서 정보를 검색하는 query를 정리하겠습니다.

최근 코딩테스트에서 SQL문제가 나오는 경우가 많은데, 아래 명령어들을 참고해서 문제를 해결하는 연습을 해보면 좋을거 같습니다.

추천 사이트: 프로그래머스

기초 query (제 기준ㅎㅎ)


SELECT

  1. 기본 형식
    SELECT col_name
    FROM table_name;
  2. 중복 제거 검색
    SELECT DISTINCT col_name
  3. 개수 검색 ##합: SUM, 평균: AVG
    SELECT COUNT(col_name)
  4. UNIQUE값 개수 검색
    SELECT COUNT(DISTINCT col_name)
  5. 검색 결과 중 n개만 보기
    Query 마지막에 LIMIT n;
  6. NULL값 채우기: IFNULL( , )
    SELECT IFNULL(col_name, 0)

 

 

ORDER BY

  1. 기본 형식
    SELECT col_name, column1, column2
    FROM table_name
    ORDER BY
        column1 [ASC|DESC], ##1순위 정렬
        column2 [ASC|DESC], ##2순위 정렬
        ...;
  2. 실행 순서
    FROM -> SELECT -> ORDER BY
  3. FIELD: 정렬할 때 숫자나, 알파벳 순으로 정렬하지 않고, 정렬 순서를 지정하고 싶을 때 사용
    ORDER BY FILED ([col_name], priority1, priority2, …, );

WHERE

  1. 기본 형식
    SELECT lastname, firstname
    FROM employees
    WHERE condition1 (AND/OR condition2 AND/OR condition3 ….)
    ORDER BY firstname;
    A. AND가 OR보다 우선 순위임, OR먼저 하려면 괄호를 사용해야함
  2. 실행 순서
    FROM -> WHERE -> SELECT -> ORDER BY
  3. BETWEEN - 범위 조건에 사용
    WHERE officeCode BETWEEN 1 AND 3
  4. LIKE - %, _을 이용해서 패턴 매칭, %은 문자열 길이 상관 X, _은 1글자만 가능
    WHERE lastName LIKE ‘%son’ ## lastName이 son으로 끝나는 사람 조회
  5. IN – membership 조건
    WHERE officeCode IN (1, 2, 3)
  6. IS (NOT) NULL – NULL 있(없)는지 확인
    WHERE officeCode IS (NOT) NULL
  7. CAST- 형 변환에 사용
    CAST('2003-01-01' AS DATE) ##string to date variable

MIN(), MAX()

  1. MIN
    SELECT MIN(Price) AS SmallestPrice
    FROM Products;
  2. MAX
    SELECT MAX(Price) AS LargestPrice
    FROM Products;

Aliases (AS)

  1. 이름을 바꿀 때 사용, 이때, 바꿀 이름에 띄어쓰기가 있으면 “”이나 []로 감싸야함

고오급 query (제 기준ㅎㅎ)


INDEX

  1. 역할
    A. DB를 full-scan하지 않고 자주 필요한 정보를 빠르게 찾기 위해서 위치를 저장해 놓음
  2. 사용 예시: CREATE INDEX index_category ON book_store(category)
    A. 테이블 book-store의 컬럼 category에 대해서 인덱스 index_category생성
    B. 이후 SELECT * FROM book_store WHERE category = 'java'할 때 full-scan없이 탐색 가능 (category가 ‘java’인 instance에 id를 통해 바로 접근 가능)

JOIN

  1. 역할
    A. 공통 컬럼을 기준으로 2개 이상의 테이블의 instance (컬럼까지)를 합치는 연산
  2. 사용 예시
    SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
    FROM Orders
    INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
  3. INNER JOIN
    A. 대상 테이블들에 공통된 값을 가진 instance들을 합침
    B. 3개 이상의 테이블에 대해서 join을 할 때는, 계산 효율성을 따져서 하나씩 join
  4. LEFT (RIGHT) JOIN
    A. 기준 테이블의 모든 instance를 유지한 채로, 매칭되는 값이 있는 다른 테이블의 값을 가져오는 JOIN, 매칭되지 않은 instance의 다른 테이블 컬럼 값은 NULL이 된다.
  5. FULL OUTER JOIN
    A. JOIN에 참여하는 모든 테이블의 instance를 합침, 결과가 매우 커질 수 있음
    B. 최소 크기는 JOIN에 참여하는 테이블 중 가장 큰 테이블, 최대는 모든 테이블의 합
  6. SELF JOIN
    A. 자기 자신과 하는 JOIN, JOIN을 쓰지 않음
    B. 기본 형태
        SELECT column_name(s)
        FROM table1 T1, table1 T2 ## 같은 테이블에 대한 다른 aliases
        WHERE condition;
    C. 예시
    SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
    FROM Customers A, Customers B
    WHERE A.CustomerID <> B.CustomerID AND A.City = B.City
    ORDER BY A.City;

UNION

  1. 여러 개의 SELECT문으로부터 나온 결과의 합집합을 보여주는 명령어 (행 방향 CONCAT)
  2. 단, 두 SELECT문의 컬럼 순서가 달라도 무조건 붙여서 보여주기 때문에 주의해야함
  3. 기본 예시
    SELECT City, Country FROM Customers
    WHERE Country='Germany'
    UNION ## UNION ALL로 하면 중복 제거 없이 보여줌
    SELECT City, Country FROM Suppliers
    WHERE Country='Germany'
    ORDER BY City;
  4. UNION하는 두 결과를 구분하고 싶을 때
    SELECT 'Customer' AS Type, ContactName, City, Country
    FROM Customers
    UNION
    SELECT 'Supplier', ContactName, City, Country
    FROM Suppliers;

DATE_FORMAT

  1. 날짜를 지정한 형식으로 출력
  2. 예시
    SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') AS DATE
    FROM DUAL

IF

  1. IF(조건, ‘참인 경우 출력’, ‘거짓인 경우 출력’)
  2. 예시
    SELECT user.seq, IF(user.seq <= 3, 'A', IF(user.seq <=6, 'B', 'C')) AS if_result
    FROM user
  3. Case문 변환
    SELECT user.seq,
    CASE
    WHEN (user.seq <= 3) THEN 'A'
    WHEN (user.seq BETWEEN 4 AND 6) THEN 'B'
    ELSE 'C'
  4. END AS case_result
    FROM user

GROUP BY

  1. The GROUP BY statement is often used with aggregate functions (COUNT, MAX, MIN, SUM, AVG) to group the result-set by one or more columns.
  2. 예시 (ShipperName별 주문 수를 확인하기 위한 query)
    SELECT Shippers.ShipperName, COUNT(Orders.OrderID) AS NumberOfOrders
    FROM Orders
    LEFT JOIN Shippers ON Orders.ShipperID = Shippers.ShipperID
    GROUP BY ShipperName;

HAVING

  1. The HAVING clause was added to SQL because the WHERE keyword could not be used with aggregate functions. -> aggregated function의 결과에 조건을 명시할 때 사용
  2. 예시
    SELECT Employees.LastName, COUNT(Orders.OrderID) AS NumberOfOrders
    FROM Orders
    INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
    WHERE LastName = 'Davolio' OR LastName = 'Fuller'
    GROUP BY LastName
    HAVING COUNT(Orders.OrderID) > 25;

ANY, ALL

  1. WHERE, HAVING절과 함께 사용
  2. ANY
    A. Subquery의 row 중 조건을 만족하는 row가 1개 이상이면 true
    B. 예제
    SELECT ProductName
    FROM Products
    WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
  3. SELECT DISTINCT(ProductName)
    FROM Products
    INNER JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID
    WHERE OrderDetails.Quantity = 10;
  4. ALL
    A. Subquery의 모든 row가 조건을 만족하면 true

WITH (CTE, Common Table Expressions)

  1. Single statement의 범위 안에서 존재하는 임시 결과 set
  2. CTE사용을 위해선 WITH 명령어를 함께 사용, ‘,’로 구분해서 세부 내용 채우기
    A. 기본 형태
    WITH [RECURSIVE]
    cte_name [(col_name [, col_name] ...)] AS (subquery)
    [, cte_name [(col_name [, col_name] ...)] AS (subquery)]
  3. i. Recursive는 여러 cte중 하나라도 recursive인게 (cte가 자기 자신 참고) 있으면 명시해야함
    B. 예시
    WITH
    cte1 AS (SELECT a, b FROM table1),
    cte2 AS (SELECT c, d FROM table2)
    SELECT b, d FROM cte1 JOIN cte2
    WHERE cte1.a = cte2.c;
    cte_name [(col_name [, col_name] ...)] AS (subquery)
    i. 각 CTE (cte1, cte2)는 ; 이전의 어디에서나 reference될 수
  4. RECURSIVE CTE
    A. 예시
    WITH RECURSIVE cte (n) AS (
    SELECT 1
    UNION ALL # 행방향 concat
    SELECT n + 1 FROM cte WHERE n < 5
    )
    SELECT * FROM cte;

마무리


다음에는 본격적인, TABLE에서 정보를 추출하기 위한 Query에 대해서 정리하겠습니다!

References

w3school
carami님 블로그

반응형

+ Recent posts