안녕하세요! 공대남입니다. 제 4차 산업혁명이 진행되고 있음에 따라 머신러닝이나 딥러닝이라는 단어가 많이 사용되고 있습니다.

모두들 한번 이상은 다 들어 보셨을 것 입니다. 머신러닝과 딥러닝은 인공지능이라는 범주 안에 속하는 단어입니다.

아침에 일어나 인공지능 비서인 시리에게 날씨를 물어보거나, 장거리 운송차가 자율주행을 이용하여 주행하는 등

이미 우리의 일상에 인공지능이 많은 부분 스며들어 있습니다. 인공지능은 인간이 지는 지적능력을 인공적으로 구현해 내는 것 입니다.

머신러닝과 딥러닝은 이런 인공지능이라는 범주안에 속합니다. 그럼 자세히 알아보도록 하겠습니다.

차례

1. 인공지능, 머신러닝과 딥러닝 상관관계

2. 머신러닝 (기계학습)

3. 딥러닝 (심층학습)

1. 인공지능, 머신러닝과 딥러닝 상관관계

이 셋의 상관관계는 다음과 같습니다.

머신러닝과 딥러닝은 구분해서 쓰는 단어이지만 두개가 완전히 구분되거나 상관없지 않습니다.

그림에서 볼 수 있듯이 인공지능이 큰 범주이고 그 다음에 머신러닝, 딥러닝이 속합니다.

그럼 머신러닝과 딥러닝이 무엇이고 이 둘의 차이점이 무엇인지 알아보겠습니다.

-

2. 머신러닝 (기계학습)

머신러닝을 간단하게 설명하자면 기계학습으로써, 많은 데이터로 부터 프로그램이 스스로 학습하는 것 입니다.

머신러닝이라는 단어에서 알 수 있듯이 데이터를 처리하는 것이 아니라, 학습 자체가 초점입니다.

머신러닝은 프로그램에 내장된 알고리즘으로 부터 수많은 데이터로부터 학습하고 패턴을 분석합니다.

그리고 그러한 패턴 인식 기능이 스스로 오류를 인지하여 수정하고 또 다시 학습을하여 정확도를 높여갑니다.

3. 딥러닝 (심층학습)

딥러닝은 머신러닝의 부분집합이고 그 핵심은 분류를 통한 예측 입니다. 딥러닝은 인공신경망을 기반으로 하고 있는데 인공신경망이란,

인간의 뉴런 구조를 본떠 만든 기계학습모델입니다. 인간의 두뇌 연결성을 모방한 것 입니다.

그래서 딥러닝은 이러한 인공신경망의 원리를 이용해 인간의 두뇌 연결성을 모방하여 데이터들을 분류하며 상관관계를 찾아냅니다.

그래서 딥러닝이 머신러닝에 포함되는 개념입니다. 이러한 딥러닝을 이용하여 기계들이 직접 학습을 하게 됩니다.

딥러닝에는 크게 두가지 방식이 있는데 '지도 학습'과 '비지도 학습' 입니다.

'지도 학습'이란 컴퓨터에게 먼저 정보를 가르쳐주는 방식으로, 예를 들면 컴퓨터에게 사진을 보여주며 "이건 고양이다."

라고 알려주고 컴퓨터를 이것을 학습하여 이 결과를 바탕으로 정보를 구분하게 됩니다.

'비지도 학습'이란 배움의 과정이 없고 컴퓨터 혼자 "이 사진이 고양이다"라고 스스로 학습하게 됩니다.

즉, 이러한 딥러닝을 이용하여 데이터들의 상관관계를 따져서 분류하고 머신러닝으로써 학습하게 되어 보다 안정성있고 정확한

인공지능을 갖추게 되는 것 입니다.

-

오늘은 머신러닝과 딥러닝에 대해서 알아보았습니다.

다음번에너는 좀 더 유익한 글과 정보로 찾아뵙겠습니다.

안녕하세요! 공대남입니다. 오늘은 정보은닉 ( information hiding )에 대하여 알아보도록 하겠습니다.

정보은닉은 쉽게 말 하자면 변수를 초기화할 때 제한을 두는 겁니다.

예를 들자면 자연수만을 입력 받아야 할 때 음의 값을 입력받게 되면 안됩니다.

그래서 선언된 변수에 값을 입력할 때 자연수만 입력되도록 제한을 두는 겁니다. 그럼 자세히 알아보겠습니다.

차례

1. 정보은닉의 이해

2. 정보은닉을 이용한 프로그래밍 예시

1. 정보은닉의 이해

일단, 간단한 예시 코드를 보겠습니다.

naturalNumber (자연수)라는 클래스를 선언하고 private 부분에 정수형 변수를 선언했습니다.

변수가 private로 선언되어 있기 때문에 public의 init 함수에서 접근해서 값을 할당합니다.

하지만 코드를 보시면 

void Init(int n)

{           

      num = n;

... }

값을 할당하는데 어떠한 조건도 없기 때문에 할당되는 값이 자연수 인지 아닌지 구분하지 못합니다.

그렇게 때문에 main함수에서 n.Init(-2)로 -2값을 보내면 그대로 할당됩니다.

이를 방지하기 위해, 변수가 선언될 때 함수를 별도로 정의해서 안전한 형태로 변수의 접근을 유도하는 것이 정보은닉 입니다.

그럼 이를 정보은닉을 올바르게 사용해서 고친 코드를 보겠습니다.

-

2. 정보은닉을 이용한 프로그래밍 예시

위의 코드를 보시면 void Init 의 if문을 추가하여 자연수 인지 아닌지를 판별하게 했습니다.

if (n > 0) 에 의해서 함수에서 전달된 인수 값이 양수인지 음수인지 판단하게 됩니다.

그리고 자연수일 경우에 num = n; 으로 값을 할당하고 그 값을 출력하도록 했습니다.

그리고 그 밖의 값 즉, 음수 일때는 자연수가 아니라는 문구를 출력하도록 했습니다.

이것을 컴파일 하게 되면

5를 입력했기 때문에 Init 함수의 if,else 문에 의해서 값을 판별하고 입력이 되었습니다.

하지만, 다른 음수를 넣게 되면

자연수가 아니라는 문구가 출력됩니다.

이렇게 자연수만 입력되도록 변수 입력을 유도하는것이 정보은닉입니다.

-

오늘은 정보은닉에 대해서 아주 간단하게 코드를 짜서 알려드렸습니다. 정리하자면 정보은닉이란

제한된 방법으로의 접근만 허용을 해서 잘못된 값이 저장되지 않도록 돕고, 실수를 했을 때는 쉽게 발견되도록 하는 것입니다.

정보은닉이 잘 쓰인 프로그램일 수록 좀 더 안정적이고 정교합니다. 그렇기 때문에 필수적으로 쓰입니다.

처음엔 이해하기 힘들수도 있지만, 잘 알아두시면 좋습니다.

오늘 준비한 글은 여기까지입니다. 다음번에는 좀 더 유익할 정보와 글로 찾아뵙겠습니다. 감사합니다!

안녕하세요! 공대남입니다. C언어부터 공부하시고 C++를 하시는 분들은 클래스를 처음 접하실 것 입니다.

(객체지향언어를 처음 하신다면) 객체지향언어에서는 클래스와 객체가 중요한 개념입니다.

오늘은 클래스의 정의에 대해 알아보고 구조체와 어떤 차이점이 있는지 알아보겠습니다.

차례

1. 클래스의 정의

2. 접근제어 지시자

3. 구조체와 클래스의 차이점

1. 클래스의 정의

클래스의 정의를 설명하기 앞서 간단한 구조체의 코드를 예를 보겠습니다.

2차원 좌표계 데이터를 구조체를 통해서 만들었습니다. 메인함수에서 p1을 선언하고 구조체를 초기화해주면 됩니다.

구조체와 클래스 둘 다 연관 있는 데이터를 묶을 수 있는 문법적 장치입니다.

여기서 클래스로 바꾸고싶다면, struct를 지우고 class를 써주면 됩니다.

그런데 그대로 컴파일을 한다면 오류가 발생합니다.

그러면 둘 다 데이터를 묶는 문법적 장치이고 선언하는 법도 같은데 왜 이런 오류가 발생할까요?

그 이유는 바로 접근법의 차이입니다. 이 차이가 클래스와 구조체의 차이입니다.

이 차이는 접근제어 지시자를 설명하며 구체적으로 설명하겠습니다.

-

2. 접근제어 지시자

C++ 접근제어 지시자는 다음과 같이 총 세가지가 존재합니다.

public : 어디서든 접근허용

protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용

private : 클래스 내(클래스 내에 정의된 함수)에서만 접근허용

다음과 같이 정의 됩니다. 그럼 여기서 위에서 왜 오류가 났는지 설명이 됩니다.

구조체의 경우 접근제어 지시자를 따로 선언하지 않는다면 모든 변수와 함수는 public으로 선언됩니다.

그래서 어디서든 접근이 가능해서 main함수에서의 초기화가 가능했습니다.

반면, class의 경우 접근제어 지시자를 따로 선언하지 않는다면 모든 변수와 함수는 private로 선언됩니다.

그렇기 때문에 main함수에서 초기화가 불가능했습니다.

 그래서 다음과 같이 코딩을 해보겠습니다.

좌표 x, y의 데이터를 private로 선언합니다. main에서 이 객체로 직접적으로 접근이 불가능합니다.

그리고 초기화 함수를 class 안에 public으로 정의합니다.

이 클래스의 함수를 public으로 정의했기 때문에 메인함수에서 접근이 가능합니다.

Init() 이라는 함수는 Point2D라는 클래스 안에 있기 때문에 좌표 x, y 의 데이터의 접근이 가능합니다.

그렇기 때문에 메인함수에서 클래스 함수를 호출하여 초기화가 가능합니다.

-

3. 구조체와 클래스의 차이점

마무리로 정리하자면 클래스와 구조체의 역할은 큰 차이는 없습니다.

둘 다 객체를 묶는 문법적인 역할을 합니다. 이 둘을 가르는 차이는 선언에 따른 차이 입니다.

즉, 구조체는 접근제어 지시자를 선언하지않으면 public 으로

클래스는 private로 선언된다는 것 입니다.

안녕하세요? 공대남 입니다. 오늘은 C++ 참조자에 관하여 알아보겠습니다.

참조자는 포인터와 비슷한 성격을 띄지만 다른 개념입니다.

그리고 포인터와 참조자의 차이점에 대해서도 알아보도록하겠습니다.

C언어에서는 다루지 않았기 때문에, 처음 접하시면 햇갈리실 수도 있습니다.

차례

1. 참조자의 개념

2. 참조자와 포인터의 차이

1. 참조자의 개념

변수는 할당된 메모리 공간에 붙여진 이름입니다.

num1 = 10; 과 같습니다.

여기에 이름을 더 부여할 수 있습니다.

참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름입니다.

간단히 말하면 별칭같은 것 입니다.

위의 코드를 보겠습니다.

참조자는 & 을 이용하여 선언합니다

이미 선언된 변수의 앞에 이 연산자가 오면 주소 값의 반환을 명령하는 뜻이지만,

새로 선언되는 변수의 이름 앞에 오면 참조자의 선언을 뜻하게 됩니다.

그래서 int &num2 = num1; 과 같이 선언합니다.

num1에 num2라는 참조자를 선언했습니다. 이 코드를 실행해보겠습니다.

num2에 다가 10을 더해 줬기 때문에 num1도 20으로 출력됩니다.

num2가 num1의 다른이름이라고 생각하시면 좀 더 잘 이해가됩니다.

즉 num2는 num1의 다른이름이고 num2를 변화시키는 것은 num1을 변화 시키는 것 입니다.

또 레퍼런스는 하나의 변수에 다수의 참조자를 선언할 수 있습니다.

int &num2 = num1;

int &num3 = num1;

int &num4 = num1;

다음과 같이 선언하면 하나의 변수에 다향한 레퍼런스를 선언할 수 있습니다.

-

2. 참조자와 포인터의 차이

(1) 포인터는 NULL 값이 있지만, 참조나는 NULL 값이 없다.

NULL값이란, 결정되지 않거나 모르는 값을 의미합니다.

하지만 참조자는 선언시 바로 초기화 해주어야 합니다.

(2) 참조자는 변수를 입력 받고 포인터는 주소값을 입력 받는다.

(3) 참조자는 한번 지정한 객체를 변경할 수 없지만, 포인터는 가능하다.

참조자는 한번 객체를 정하면 바꿀 수 없습니다.

하지만 포인터의 경우 주소값을 변경하여 바꿀 수 있습니다.

다음과 같은 차이점이 있습니다.

공통점은 둘 다 다른 객체(변수)를 간접적으로 참조한다는 것 입니다.

처음 참조자를 접하신다면 햇갈리실테니 차이점을 숙지하고 계시면 쉽게 이해가 될 것입니다.

-

간단하게 레퍼런스의 개념과 레퍼런스와 참조자의 차이점과 공통점에 대해서 알아보았습니다.

저는 C언어의 포인터와 개념이 비슷해서 처음에 햇갈렸지만, 차이점을 알고나니 잘 이해가 되었습니다.

이번 정보는 유용하셨나요? 다음번 강의에는 좀 더 유용하고 좋은글로 찾아 뵙도록하겠습니다. 감사합니다!


안녕하세요? 공대남입니다. 오늘은 이름공간에 대하여 알아보도록 하겠습니다.

namespace 같은 경우는 함수의 이름이 겹칠 때 사용하게 됩니다.

이전에 배웠던 함수 오버로딩은 매개변수의 형식이나 수가 다를 때 자동으로 구분되지만

매개변수 형식이나 수도 같다면 함수를 구분할 수 없습니다.

여기서 함수 이름과 매개변수 형식도 같을 때 구분할 수 도 있도록 해주는것이

'이름공간(namespace)' 입니다.

차례

1. namespace

2. using 을 통한 명시

1. namespace

쉽게 설명하기 위해 예를들어 보겠습니다.

A,B라는 회사에서 프로그래밍 대형화를 위해 서로가 시스템을 개발하는데 참가했습니다.

그리고 서로의 코드를 비교해보니 상당 부분 함수가 겹치는 것입니다.

이럴 때는 두 회사 중 하나가 바꾸어야 하지만, 서로가 좀 처럼 양보하기 싫은겁니다.

그럴 때 이름공간이 유용합니다. 이름공간의 함수 호출법은 다음과 같습니다

만약 Func1 이라는 함수가 겹친다면 namespace 를 이용하여 호출하면

A회사의 Func1을 호출해라 ! 이처럼 됩니다.

다음 코드의 예시를 보겠습니다.

namespace를 이용해 각각 Acom, Bcom를 명시하고 함수를 그 안에 적습니다.

(함수를 먼저 선언하고 정의해도 됩니다.)

그리고 main 함수에서 Acom::Func1(); , Bcom::Func1(); 로 각각 호출을 합니다.

여기서 :: 은 범위지정 연산자 입니다. 즉, 이름공간을 지정할 때 사용합니다.

그러면 다음과 같이 출력됩니다.

함수의 이름과 매개변수의 형식이 같더라도 namespace를 사용하여

얼마든지 구별하여 사용할 수 있습니다.

그러면 여기서 앞서 입출력 코드로써 std::cout , std::cin , std::endl을 사용했는데,

이것도 namespace의 사용과 유사하다고 느끼셨을 것 입니다.

그렇습니다. cout, cin, endl은 std안에 선언되어있고 그것을 사용하던 것이 였습니다.

-

2. using을 이용한 명시

cout, cin, endl이 std에 선언된 함수라는 것은 알았는데

이를 사용할 때 마다 std:: 을 붙여주기에는 귀찮으실 수도 있습니다.

이를 위해 using을 사용하면 생략하고 사용 가능합니다.

다음과 값이 using을 통해 선언하면

cout, cin, endl을 std의 이름공간에서 찾으라고 하는 것과 같습니다.

그렇게하면 std를 생략하고 코드를 사용할 수 있습니다.

만약 일일히 std::cout, std::cin, std::endl을 선언하시는게 귀찮으시다면

using namespace std; 을 선언함으로써

름공간 std 에 있는 모든 것에 대해 이름공간 지정을 생략할 수 있습니다.

하지만 프로그램이 복잡해지고 커진다면 오류가 생길 확률도 커집니다.

-

이상 오늘은 namespace에 대하여 알아보았습니다. 도움이 되셨는지요?

다음 c++강의에서는 좀 더 유익하고 좋은 글로 찾아뵙겠습니다. 감사합니다!

안녕하세요? 공대남입니다. 오늘은 함수 오버로딩과 매개변수 디폴트값에 대해서 살펴보겠습니다.

오버로딩과 매개변수 디폴트 값은 C언어에서는 동작하지 않는 기능입니다.

둘 다 함수에 관한 기능이고 그렇게 어렵지 않습니다. 그럼 자세히 알아보도록 하겠습니다.

차례

1. 함수 오버로딩 (Function Overloading)

2. 매개변수의 디폴트 값

1. 함수 오버로딩

C언어에서는 함수 이름이 같으면 컴파일 오류가 생깁니다. 그 이유는 간단합니다.

C언어에서 함수를 호출할 때 함수 이름으로 그 함수를 찾습니다. 그런데 함수 이름이 같은것이

두개 이상 있다면 컴파일 오류가 생깁니다. 하지만 C++에서는 함수 이름이 같아도

컴파일 오류가 생기지 않습니다. 그 이유가 뭘까요?

다음 예시와 함께 알아보겠습니다.

MyFunc 이라는 이름이 같은 함수 3가지를 정의합니다.

그런데 여기서 매개변수가 다를 다는 것이 보이시나요?

함수의 내용은 "MyFunc(void) called" 와 같이 어떤 매개변수를 가진 MyFunc이 호출 되었다고 출력합니다.

그런 다음 int main 에서 함수를 하나씩 호출 합니다. 각 매개변수 자료형에 맞게 인수를 입력합니다.

그러면 다음과 같이 컴파일 오류가 나지않고 프롬프트창에 출력됩니다.

즉, 함수 이름이 같아도 매개변수의 선언형태가 다르면 함수를 구분하여 호출 가능 한다는 것 입니다.

여기서 중요한 포인트는

C언어함수의 이름으로만 함수를 찾고 호출한다.

C++ 함수의 이름 매개변수(자료형, 개수)를 고려하여 호출한다.

그렇기 때문에 이름이 같아도 컴파일 오류가 나지 않습니다.


2. 매개변수의 디폴트 값

'디폴트 값'이란 '기본적으로 설정되어 있는 값'을 의미합니다.

예상해보자면, 매개변수의 기본 값이 설정되어 있다는 것 입니다.

다음 예시로 자세히 알아보겠습니다.

함수 Addnum (두 매개변수의 합을 반환하는 함수) 의 매개변수의 디폴트값을 5, 10으로 지정했습니다.

이 말은 인수가 전달되지 않는다면 num1 과 num2의 값을 5, 10으로 지정한다는 의미입니다.

int main에서 인수가 없을 때, 하나만 전달했을 때, 모두 전달했을 때를 출력하도록 되어있습니다.

컴파일을 완료시키면 다음과 같이 나옵니다.

첫번째 AddNum() 인수가 하나도 전달 되지 않았을 때는 매개변수의 디폴트값이 더해져 5+10의 값이 출력됩니다.

그 다음 인수가 하나가 전달되면 전달된 인수 1과 num2의 디폴트값 10이 더해집니다.

여기서 인수는 매개변수의 왼쪽부터 채워집니다. 즉, 하나가 전달되면

num1과 num2 중 왼쪽에 있는 num1부터 채워집니다.

마지막으로 인수가 모두 전달되면 전달된 두 인수의 합이 출력됩니다.


-

지금까지 C언어와 차이점인 오버로딩과 매개변수 디폴트값에 대하여 알아보았습니다.

유익한 정보였기를 바랍니다. 다음번에는 좀 더 유용한 정보와 글로 찾아오겠습니다.

감사합니다!

안녕하세요? 공대남입니다. 어떠한 프로그래밍 언어이던지 가장 처음 배우는 코드는 입출력 코드입니다.

C++언어에 관한 글을 본격적으로 연재를 시작하며 iostream 헤더에 대하여

그리고 입출력에 관한 명령어 cout, cin에 대하여 알아보겠습니다.

이 부분은 크게 어렵지 않아서 "아하 그렇구나" 이 정도로 알고 한번씩 코딩만해봐도 충분합니다.

차례

1. C++언어의 간략한 소개

2. 헤더파일 iostream

3. std::count , cin

1. C++ 언어의 간략한 소개

C++언어는 C언어의 확장판의 개념입니다. 하지만, 공통점도 있지만 전체적으로 프로그래밍하는 방식이 다릅니다.

가장 큰 차이점이 C++언어는 객체지향적 언어이고, C언어는 절차지향적 언어입니다.

! 객체지향언어 vs 절차지향언어 차이점 !

(위 링크를 누르시면 절차지향 vs 객체지향 차이점에 대하여 자세히 보실 수 있습니다.)

그렇기 때문에 C언어를 어느정도 아셔야 프로그래밍 언어 공부가 수월합니다.

C++는 많은 응용프로그램을 만드는데 최적화 되어있습니다.


2. 헤더파일 iostream

C언어에서는 입출력을 위한 printf 함수와 scanf 함수를 사용하기 위해 해더파일

#include <stdio.h> 

같이 헤더파일을 선언합니다.

iostream은 C++에서의 위와같은 헤더파일이라고 생각하시면 됩니다.

그렇기 때문에 C++에서 입출력 함수를 쓰기위해

#include <iostream> 을 선언합니다.


3.std::cout, cin

(1) : std::cout 는 출력을 담당하는 코드입니다.

(2) : std::cin 은 입력을 담당하는 코드입니다.

다음 코드를 예시로 하나씩 살펴보겠습니다.

이 코드를 실행시키고 숫자 두개를 키보드로 입력하면

다음과 같이 출력됩니다.

여기서 << 는 하나의 연산자 입니다.  출력대상을 연이어 출력할 수 있게 도와줍니다.

std::cout 로 출력함수를 입력하고 그 다음 <<를 사용하여 출력할 것을 입력합니다.

여기서 C언어의 경우에는 %d, %s, %c 처럼 자료형에 따라 서식지정가 필요합니다.

그러나 C++ 경우에는 필요가 없습니다. 

문자열의 경우 "" 문자의 경우 '' 숫자일 경우 숫자만 입력하여 출력할 수 있습니다.

연이어 출력하고 싶은 경우 <<를 사용하여 출력하면 됩니다.

-

std::cout 밑에 std::cin을 보겠습니다. 예상하셨듯이 입력 코드입니다.

여기서 주의할 점은 <<가 아닌 >> 입니다.

숫자를 입력하고 엔터키를 누르면 개행이 됩니다.

그리고 std::endl은 개행을 하는 코드입니다. \n 와 같은 기능입니다.


-

오늘은 가볍게 입출력 함수를 사용하기 위한 헤더파일, 그리고 입출력 코드에 대하여 알아보았습니다.

관심을 가지고 꾸준히 한다면 프로그래밍은 언어 문법은 금방 배울 수 있습니다.

다음 번에는 좀 더 유용한 정보와 글로 찾아오겠습니다. 감사합니다~

+ Recent posts