자료구조: 기본개념(Part 2)

김동현·2023년 3월 14일
0

자료구조

목록 보기
2/2
post-thumbnail

1. C++에서의 영역


  • 지역 영역
    • 블록 안에서 선언된 이름
  • 클래스 영역
    • 클래스 정의와 관련된 선언
  • 파일 영역
    • 함수 정의에 속하지 않은 선언, 클래스 정의, 네임 스페이스
  • 네임스페이스 영역
    • 논리적으로 연관된 함수나 변수를 하나의 그룹으로 만드는 기법
    • 영역 정보를 사용해서 네임 스페이스 안의 개체에 접근
      std::cout

2. C++ 명령문과 연산자


  • C++연산자

    • new : 할당 메모리 추가

    • delete : 할당 메모리 삭제

      → 위의 2 연산자를 제외하고 C의 연산자와 동일하다

  • C++의 입출력

    • 시프트 연산자의 사용
    • >> 연산자: a에 값을 넣겠다
      cin >> a     -> 화살표의 방향으로 생각하면 쉬움
    • << 연산자: b의 값을 빼겠다
      cout >> b     <- 화살표의 방향으로 생각하면 쉬움
  • C와 C++의 중요한 차이점

    • 연산자 다중화(Operator Overloading)가 허용된다.

    • 위의 코드는 문자열 타입을 이용하여 C++에서 연산자 다중화를 구현한 간단한 예시입니다. 코드에서는 MyString 클래스를 정의하고, 이 클래스 내부에 + 연산자 다중화 함수를 정의합니다.연산자 다중화 함수는 MyString 클래스의 두 객체를 이어붙인 결과를 새로운 MyString 객체로 반환하는 함수입니다. 이를 위해, 함수 내부에서는 string 클래스의 + 연산자를 이용하여 두 문자열을 이어붙인 후, MyString 객체로 다시 반환합니다.또한, 코드에서는 << 연산자 다중화 함수를 전역에 정의합니다. 이 함수는 MyString 객체를 출력할 때 문자열을 출력하는 역할을 합니다. 이를 위해, 함수 내부에서는 MyString 객체 내부에 저장된 문자열을 출력하도록 구현합니다. 마지막으로, main 함수에서는 MyString 클래스를 이용하여 두 개의 문자열을 이어붙이고, 이를 출력합니다. 이때, << 연산자를 이용하여 MyString 객체를 출력합니다.

3. C++ 데이터 선언


  • 데이터 선언
    • 한 데이터 타입을 어떤 이름에 연결하는 것
    • 변수
      • 이름과 데이터 형식(type)를 갖는다
      • 예를 들어, int 형식의 변수는 정수 값을 저장할 수 있다
      • 변수는 프로그램에서 값을 계속해서 변경할 수 있습니다
      • 상수변수: 선언을 한번 값을 변경할 수 없다
        const int Max = 500;
      • 열거 타입: 일련의 정수 상수를 선언한다.
        enum semester{SUMMER, FALL, SPRING}
    • 포인터와 참조타입

4. C++ 에서의 입출력


  • 시스템 정의 헤더 파일 iostream이 필요하다
#include <iostream>
using namespace std;

int main() {
    cout << "Hello, world!" << endl;
    return 0;
}
💡 using namespace std;

→ 이 부분에 정의된 std에 cout에 관한 정의가 포함되어있다

만약 std;를 설정해두지 않은 경우 코드를 작성할 때에 std: 를 모든 코드의 앞에 작성해야하는 불편함이 있다
  • cout

    • 표준 출력 장치로 출력된다
    • " << " 연산자는 위에서 나온 것 처럼, cout 키워드와 함께 쓰이며 출력될 개체를 구분한다
  • cin

    • 입력을 위해 사용된다
    • " >> " 연산자는 입력될 변수들을 구분한다
  • 정규함수

    • 정규 함수는 다른 함수나 클래스 내부에 정의되지 않은 일반적인 함수이다

      addNumbers() 함수는 두 개의 정수 매개 변수를 받아들이고, 이들을 더한 값을 반환하는 정규함수이다

  • 멤버함수

    • 특정 클래스와 연관된 함수이다

      C++에서 멤버 함수는 클래스 내에 선언되어 해당 클래스의 인스턴스에서 호출될 수 있는 함수이다.

      멤버 함수는 일반적으로 클래스의 정의 내부에 선언되며, 클래스의 멤버 변수에 대한 접근을 위해 this 키워드를 사용합니다. this 키워드는 멤버 함수가 호출된 객체의 포인터를 나타냅니다. 이를 통해 멤버 함수는 객체의 데이터 멤버에 접근할 수 있습니다.

  • 함수의 구성

    • 함수 이름
    • 인자 리스트 (signature) 입력
    • 반환 타입 (출력)
    • 몸체 (함수를 구현한 코드)

5. C++ 의 매개변수 전달


  • 상수 참조 (constant reference)
    • 인자 변경이 불가능하다.
    • 상수 참조 자체는, “값이 변경될 일을 없습니다!” 를 의미한다.
    • const T & a 로 나타낸다.
      void swap(const int %a, const int&b){
      int temp = a;
      a = b;
      b = temp;
      }
  • 배열은 참조로 전달한다.

  • 값(value)에 의한 전달

    • 전달된 객체는 그 함수의 지역 저장소에 복사된다
    • 실제 인자에 영향을 주지 않는다
    • 실제 인자로 제공되는 변수가 함수에 의해 변경되지 않는다
  • 참조(reference)에 의한 전달

    • 인자 리스트의 타입 명세에 “&”를 첨가한다
    • 전달된 객체의 주소만 함수의 지역 저장소에 복사한다.
    • 전달된 객체가 큰 메모리를 요구하는 경우 더 빨리 수행한다.

6. C++의 함수 다중화


  • 함수 다중화
    • 같은 이름을 가진 함수가 서로 다른 매개변수 타입을 가질 수 있는 기능
    • 함수의 인자 리스트가 다르기만 하면 같은 이름을 가진 함수가 둘 이상 존재할 수 있다.
    • 같은 함수 이름을 가지지만 인자의 형식이나 개수가 다르면 컴파일러는 이를 서로 다른 함수로 인식하고 호출하는 것이 가능합니다.
    • **#include <iostream>
      using namespace std;
      
      // int형 매개변수 하나를 받는 함수
      void print(int n) {
          cout << "int: " << n << endl;
      }
      
      // double형 매개변수 하나를 받는 함수
      void print(double d) {
          cout << "double: " << d << endl;
      }
      
      // 문자열을 받는 함수
      void print(string s) {
          cout << "string: " << s << endl;
      }
      
      int main() {
          print(10);
          print(3.14);
          print("Hello World!");
          return 0;
      }**
      →print 함수를 세 번 다중화하여, 각각 int형, double형, string형 매개변수를 받을 수 있다.

7. 인라인 함수 (inline function)


  • 인라인 함수

    • 함수를 호출하는 대신 함수의 코드를 직접 복사하여 해당 위치에 삽입하는 함수이다.
    • 내가 사용하고 싶어서 코드에 첨부한다 할지라도, 컴파일러의 판단에 따라 인라인 함수를 실행하지 않을 수도 있다. → (오히려 인라인 함수를 사용해서 저장 공간에 들어갈 내용이 많아지는 단점…)
    • 인라인 함수는 함수 호출을 피하고 실행 속도를 높이기 위해 사용되지만, 코드의 길이가 길거나 반복적으로 사용되는 함수를 인라인 함수로 정의하면 코드의 크기가 커지고, 따라서 캐시 메모리에 로드되는데에 걸리는 시간이 더 오래 걸리게 됩니다. 따라서, 인라인 함수를 사용할 때에는 해당 함수가 실행될 때마다 복사되는 코드의 크기와 실행 빈도를 고려하여 사용하는 것이 좋습니다.
  • 장점

    • 함수 호출이 아니라 함수 내용이 그 자리에 바로 실행되므로 함수 호출에 따른 오버헤드를 줄일 수 있다.
    • 이를 통해 실행 속도가 빨라지고, 코드의 크기도 작아진다.
  • 단점

    • 함수의 코드가 매우 길거나, 많은 연산을 포함하거나, 반복적으로 사용되는 함수는 인라인 함수로 정의하는 것이 오히려 성능 저하를 가져올 수 있다.
    • 인라인 함수를 사용하면 코드의 크기가 작아지므로 코드의 저장공간을 절약할 수 있다.
  • 예시

    • 인라인 함수를 사용하지 않은 경우
      **int x = 10, y = 20;
      int z = x + y;**
    • 인라인 함수를 사용한 경우
      **int x = 10, y = 20;
      int z = add(x, y);**
    • 인라인 함수를 사용한 경우 함수 호출 대신 코드가 그 자리에 삽입되므로 함수 호출에 따른 오버헤드가 없어지고, 코드 실행 속도가 빨라진다.
      **#include <iostream>
      using namespace std;
      
      // 인라인 함수 선언
      inline int add(int a, int b) {
          return a + b;
      }
      
      int main() {
          int x = 10, y = 20;
          cout << add(x, y) << endl;  // 함수 호출 대신 코드가 그 자리에 삽입됨
          return 0;
      }**
      → 값을 추가적으로 계산하는 과정이 생략되고 위에서 정의한 inline 함수에 의해 계산된 값을 가져옴

8. C++에서의 동적 메모리 할당


  • new / delete 연산자
    • C++에서 new 연산자와 delete 연산자는 동적 메모리 할당과 해제를 담당하는 연산자이다.
    • new 연산자로 할당한 메모리는 반드시 delete 연산자로 해제해야한다. 그렇지 않으면, 메모리 누수(memory leak)가 발생할 수 있다.
      **// new 연산자의 사용 형태
      포인터_변수 = new 자료형;**
      **// delete 연산자의 사용 형태
      delete 포인터_변수;**
  • new 연산자
    • new 연산자는 동적으로 메모리를 할당하고, 해당 메모리의 주소를 반환한다.

    • 즉, 메모리 공간을 동적으로 할당할 때 사용하는 연산자입니다.

    • 원하는 타입의 객체를 생성하고 포인터를 반환한다.

    • **// int형 변수를 동적으로 할당하는 코드
      int* p = new int;**
  • delete 연산자
    • delete 연산자는 동적으로 할당된 메모리를 해제하는 연산자이다.

    • **// int형 변수를 해제하는 코드
      delete p;**

9. 예외 발생


  • 개념
    • 오류와 다른 특별한 조건이 발생했음을 알리는데 사용한다.
    • 다양한 예외 각각에 대해 예외 클래스를 정의해야 한다.
  • throw
  • try-catch
    • try 블록은 예외가 발생할 가능성이 있는 코드를 포함한다.
    • catch 블록에서는 해당 예외를 처리할 코드를 작성한다.
    • 예외가 발생하지 않으면, catch 블록을 건너뛰고 try-catch 문 다음의 코드를 실행한다.
    • 하지만 예외가 발생하면, try 블록을 실행하는 도중에 예외가 발생하면, 예외 타입에 해당하는 catch 블록으로 제어가 이동한다.
    • **try {
          // 예외 발생 가능성이 있는 코드
      } catch (예외 타입1 예외_객체1) {
          // 예외 타입1이 발생한 경우 처리할 코드
      } catch (예외 타입2 예외_객체2) {
          // 예외 타입2이 발생한 경우 처리할 코드
      } catch (...) {
          // 이외의 예외가 발생한 경우 처리할 코드
      }**
profile
디자인과 개발을 모두 할줄 아는 능력있는 개발자가 되고싶습니다.

0개의 댓글