[포스코x코딩온] 스마트 팩토리 과정 1주차 회고 | C++

Dana·2023년 3월 24일
0

C++이란

  • 객체 지향 언어(c-절차 지향 언어) : 구조화된 프로그램을 짤 수 있음
  • 타입체크가 엄격 : 실행 시간 오류 가능성을 줄이고 디버깅을 돕는다
  • 이식성이 좋다 : 다양한 운영체제에서 사용 가능
#include <iostream>
int main() {
	
}
- #: 컴파일 시작 전 미리 처리하기 위한 전처리기
- #include: 외부에 선언된 함수, 상수 등을 사용하기 위해 선언
- <iostream>: 스트림을 이용한 입출력을 제공하는 객체 지향 라이브러리
- int main(): 프로그램이 시작될 때 가장 먼저 호출되는 함수

입/출력

std::cout<<

  • console out이라는 의미로 콘솔에 값을 출력해준다.

std::cin>>

  • console in 이라는 의미로 콘솔이 열렸을 때 원하는 값을 입력할 수 있게 해준다.
  • 값을 입력받으면 변수에 넣어줘야 한다.

변수와 자료형

  • 변수 : 데이터를 저장하기 위해 할당받은 공간
  • 변수 네이밍 규칙
    - 변수의 이름으로 예약어를 사용할 수 없다.
    - 예약어: C++에 미리 정의되어 있는 특별한 의미가 있는 단어

언어 타입

강한 타입 언어(strong)

  • 타입 검사를 통과하지 못한다면 실행 자체가 안된다.
  • 타입을 한종류로 명확히 지정
  • Java, C, C++, C#

약한 타입 언어(weak)

  • 런타임에서 타입 오류를 만나더라도 실행을 막지 않는다.
  • 타입이 여러 종류인 값들이 상관없이 지정된다.
  • Javascript, Python

기본 자료형 (Data Type)


문자열을 이용할때는 std::string 타입을 이용해야 한다.

조건문

if문

if (조건1) {
  실행코드1
} else if (조건2) {
  실행코드2
} else {
  실행코드3
}

switch문

switch(변수) {
  case 값1:
  	실행코드1;
  	break;
  case 값2:
  	실행코드2;
  	break;
  default:
  	기본실행코드;
}

삼항연산자

조건 ? 조건이 참일 때 실행할 코드 : 조건이 거짓일 때 실행할 코드;

반복문

for문

for(초기값; 조건문; 증감문){
  실행코드
}

for-each문

  • 배열의 원소에 대한 반복을 수행할 때 사용함
for (자료형 변수이름 : 배열) {}

while문

while (조건문) {}

do while문

do {} while(조건문);

함수

  • 어떤 일을 수행하는 코드의 묶음
  • 필요할 때마다 호출이 가능하다
  • 논리적인 단위로 분할이 가능하다
리턴타입 함수이름(인수목록) {}
- 리턴타입 : 이 함수가 결과로 어떤 유형의 값을 반환할지 선언
- 함수이름 : 함수의 이름을 결정, 추후 호출 할때 사용
- 매개변수 : 함수 외부의 값을 내부에서 사용할 수 있게 해주는 변수

함수 종류

  1. 매개변수 X return X
  2. 매개변수 O return X
  3. 매개변수 X return O
  4. 매개변수 O return O
  • 매개변수 : 함수의 외부에서 사용되는 값을 함수의 내부에서 사용하고 싶을 때
  • return(반환값) : 함수의 내부에서 얻은 값이 함수의 외부에서 필요할 때

배열

  • 한번에 여러 개의 값들을 저장할 수 있는 변수
- 선언과 초기화 분리
  string fruit[3];
  fruit[0] = "apple";
  fruit[1] = "banana";
  fruit[2] = "orange";
  
- 선언과 초기화를 동시에
  string fruit[] = {"apple", "banana", "orange"};
  • 인덱스 : 배열 안 원소의 순서, 0부터 시작

다차원 배열

std::string fruit[2][2] = {
    { "apple", "banana" },
    { "orange", "strawberry" }
};

배열과 for문

for(int i=0; i< sizeof(fruit)/sizeof(fruit[0]); i++)
{ 
  cout << fruit[i] << endl;
}                 
  • sizeof : 자료형 또는 변수의 크기를 byte단위로 반환

배열과 for-each문

for (string fr : fruit)
{
cout << fr << endl;
}

동적배열과 포인터

포인터

  • 메모리의 주소를 가진 변수
  int* p; // 포인터변수
  int n = 10;
  p = &n; // p에 n의 메모리 주소를 저장함
  • 메모리 영역
    - 힙 영역 : 동적 메모리 저장, 할당과 해제를 직접 관리해줘야함
    - 스택 영역 : 정적 메모리 저장, 빌드할 때 크기가 지정되어 있어야 함

  • 포인터를 이용하면 동적 메모리를 생성할 수 있다. 하지만 포인터를 이용한 모든 변수가 동적 메모리는 아니다.

동적 배열

  • 선언과 할당
	int* arr = new int[n];
  • 사용과 해제
	delete[] arr;

2차원 동적 배열

  • 동적 배열 선언과 할당
  int** arr = new int* [n]; 
  for (int i=0; i<n; i++)
  {
      arr[i] = new int[n];
  }
  • 동적 배열 해제
  for (int i=0; i<n; i++)
  {
      delete[] arr[i];
  }
  delete[] arr;

vector

  • 자동으로 메모리를 할당해주는 배열
  • 포인터를 쓰지 않아도 배열 크기를 나중에 지정할 수 있으며, 중간에 배열의 크기를 바꿀 수 있다.
#include <vector>

vector<int> v = { 1,2,3,4,5 };
vector<int>v(4); //int형 백터 크기를 4로 할당하고 모든 백터요소 0으로 초기화
vector<int> v(5, 1); //int형 백터 크기를 5로 할당하고 모든 백터요소 1로 초기화
v.assign(5, 1); //벡터 크기 5, 모든 요소 1로 초기화

기본 벡터 기능

  • .at(index) : 인덱스에 해당하는 값 반환
  • .size() : 벡터의 길이 반환
  • .push_back(원소) : 배열의 마지막에 원소 삽입
  • .begin() : 벡터 시작점의 주소값 반환
  • .insert(v.begin()+3, 원소) : 3번 인덱스에 원소를 삽입

실습

영어로 된 문자열 모두 소문자로 입력 받아서 문자열에 사용된 문자의 개수를 구하시오
ex)
입력예시 : apple
출력예시 : 4 개 ( a, p, l, e )
입력예시 : bacon
출력예시 : 5 개 ( b, a, c, o, n )
입력예시 : i have a pen
출력예시 : 7 개 ( i, h, a, v, e, p, n )

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

int main()
{
	string str;
    cout << "입력예시 : ";
    getline(cin, str); <!-- 공백 포함 입력받기 --!>
    <!-- str.erase(remove(str.begin(), str.end(), ' '), str.end()); 문자열 공백 제거 --!>
    vector<char> v;
    int i;
    for (char s : str)
    {
        if (s != ' ')
        {
            for (i=0; i<v.size();i++)
            {
                if (v.at(i)==str[j]) break;
            }
            if(i==v.size())
            {
                v.push_back(str[j]);
            }
        }
    }
    cout << "출력예시 : "<< v.size() << " 개(";
    for (i=0; i<v.size(); i++)
    {
        cout << v.at(i);
        if (i != v.size()-1)
            cout << ",";
    }
    cout << ")";
}

결론

  • c++를 오랜만에 복습할 수 있는 시간이었다.
  • C에서는 대입연산으로 문자열 값을 변경할 수 없었는데 C++에서는 가능하다.
  	std::string test = "포스코";
  	test = "코딩온";
  • 나누기 연산(/)의 결과값을 실수로 강제형변환 하는 방법
	(double)a/b
  • 배열에서 for-each문은 매우 편리하지만 조금 헷갈린다.
  int num[3] = {1, 2, 3};
  for (auto n : num) { // int n이 아닌 auto도 가능하다.
      cout << n << " ";
  }

  //값을 변경시키기 위해서는 &를 붙여주어야 한다.
  for (auto &n : num) {
      cin >> n;
  }
  for (auto &n : num){
      n += 1;
  }

  //2차원 배열에서는 값을 읽어오기 위해서도 &를 붙여주어야 한다.(그냥 헷갈리면 다 붙이자)
  char alpha[2][4] = {{'a','b','c','d'}, {'e','f','g','h'}};
  for (auto &arr : alpha) {
      for (auto a : arr) {
          cout << a << " ";
      }
      cout << endl;
  }
  • std::cin<< 으로는 공백을 포함해서 입력받지 못하므로 getline을 써야한다.

0개의 댓글