반응형
강한 타입 검사란?

강한 타입 검사(Strong Type Checking)는 프로그래밍 언어에

변수와 표현식의 타입을 업격하게 검사하는 기능을 말한다.

 

타입의 일치 여부를 엄격하게 확인하여 데이터 타입 관련 오류를 

컴파일 단계에서 발견할 수 있도록 하는 기능이다.

 

C++는 정적 타입 언어(Static Typing)로서, 변수의 타입은 컴파일 시점에

결정되고 해당 타입에 따라 메모리 할당과 연산 등이 이루어진다.

강한 타입 검사는 이러한 정적 타입 시스템을 통해 코드의 안전성을 높이고

오류를 사전에 방지하는 역할을 한다.

 

강한 타입 검사 장점

1. 타입 관련 오류 예방 : 

변수와 표현식의 타입을 엄격하게 검사하므로, 타입 일치 여부를 확인하여

예기치 않은 타입 오류를 방지해주낟. 예를 들어, 정수형 변수에 문자열을 

대입하려고 할 때 컴파일러는 타입 불일치 오류를 감지하고 경고 또는 오류

메시지를 출력한다.

 

2. 코드 가독성 향상 :

타입 정보를 명시적으로 표현하고 검사하므로 코드의 의도를 명확히

전달할 수 있다. 타입 정보가 명시적으로 제공되기에 다른 개발자가

코드를 이해하고 유지보수하는데 도움이 된다.

 

3. 성능 최적화 :

강한 타입 검사는 타입 정보를 미리 알고 있기에 메모리 할당과 연산 등에서

최적화를 수행할 수 있다. 컴파일러는 타입에 대한 미리 알려진 정보를 활용하여

코드를 더 효율적으로 생성할 수 있다.

 

즉, C++의 강한 타입 검사는 컴파일러가 데이터 타입 관련 오류를 감지하고

경고 또는 오류 메시지를 출력하여 프로그래머에게 알려준다. 이를 통해 안전한

코드 작성과 디버깅을 용이하게 할 수 있다.

 

반응형

 

반응형

'C++' 카테고리의 다른 글

구조체  (0) 2023.05.30
인라인 함수  (0) 2023.05.30
C++ 표준 라이브러리  (1) 2023.05.30
동적 할당  (0) 2023.05.30
클래스에 대한 이해  (0) 2023.05.30
반응형
C++ 표준 라이브러리

C++ 표준 라이브러리는 C++ 프로그래밍에서 자주 사용되는 다양한 기능을 제공하는

헤더 파일들의 집합입니다. 이러한 헤더 파일들은 C++ 프로그램에서 표준 기능을

사용하기 위해서는 코드에 포함해줘야 합니다.

 

 

 

C++ 표준 헤더 파일

1. <iostream> : 

입출력 스트림을 다루는데 사용되는 헤더 파일.

std::cin, std::out 등의 표준 입출력 객체를 사용하여 사용자와

상호 작용하여 입력 데이터를 받거나 데이터를 콘솔에 출력하는 데 사용된다.

 

2. <vector> : 

동적 배열인 벡터(vector)를 사용하기 위한 헤더 파일.

std::vector 클래스는 크기 조정이 가능한 배열로, 요소를 추가, 삭제,

접근하는데 사용된다.

 

3. <string> : 

문자열을 다루기 위한 헤더 파일.

std::string 클래스는 문자열을 저장하고 조작하는 데 사용된다.

문자열 연결, 자르기, 검색 등 다양한 문자열 작업을 수행할 수 있다.

 

4. <algorithm> : 

다양한 알고리즘 함수를 제공하는 헤더 파일.

정렬, 검색, 변환 등과 같은 일반적인 알고리즘을 포함하고 있다.

std::sort, std::find, std::transform 등이 있다.

 

5. <array> : 

정적 배열인 배열을 다루기 위한 헤더 파일.

std::array 클래스는 고정 크기 배열로, C 스타일의 배열보다

안전하고 편리한 기능을 제공한다.

 

6. <map> : 

키-값 쌍을 저장하는 맵(map)을 사용하기 위한 헤더 파일.

std::map 클래스는 키를 기반으로 값을 저장하고 검색하는데 사용된다.

 

7. <unordered_map> : 

해시 기반의 맵(unordered map)을 사용하기 위한 헤더 파일.

std::unordered_map 클래스는 해시 테이블을 사용하여 키-값 쌍을

저장하고 검색하는데 사용된다.

 

8. <list> : 

이중 연결 리스트인 리스트(list)를 사용하기 위한 헤더 파일.

std::list 클래스는 요소를 추가, 삭제하고 순회하는데 사용된다.

 

9. <queue> : 

큐(queue)자료 구조를 사용하기 위한 헤더 파일.

std::queue 클래스는 선입선출(FIFO)동작을 지원하는

큐를 구현하는데 사용된다.

 

10. <stack> : 

스택(stack)자료 구조를 사용하기 위한 헤더 파일.

std::stack 클래스는 후입선출(LIFO)동작을 지원하는

스택을 구현하는데 사용된다.

 

이 외에도 C++ 표준 라이브러리는 다양한 헤더 파일과 클래스를 제공해준다.

특정한 기능이 필요한 경우 해당 기능을 제공하는 헤더 파일을 찾아보고,

해당 헤더 파일을 포함시켜 사용하면 된다.

 

 

 

C기반 헤더파일

C++에서는 C기반 헤더파일도 제공해준다

.

아래의 코드처럼 C기반 헤더 파일명 앞에 c를 붙여주고

뒤에 헤더 파일을 의미하는 h를 빼면 C기반 헤더 파일을

C++에서도 사용 가능하다.

// C 헤더 파일
#include <stdio.h>
// C++ 헤더 파일
#include<cstdio>

 

반응형

 

반응형

'C++' 카테고리의 다른 글

구조체  (0) 2023.05.30
인라인 함수  (0) 2023.05.30
강한 타입 검사  (0) 2023.05.30
동적 할당  (0) 2023.05.30
클래스에 대한 이해  (0) 2023.05.30
반응형
동적 할당이란?

C++ 에서 동적 할당은 프로그램 실행 중에 메모리를 동적으로 할당하고 해제하는

프로세스를 의미합니다. 동적 할당은 정적 할당과 달리 프로그램이 실행되는 동안

필요한 메모리를 유연하게 관리할 수 있게 해줍니다.

 

C++ 에서는 new 연산자와 delete 연산자를 사용하여 동적 할당을 할 수 있습니다.

 

 

 

new 연산자

new 연산자는 동적으로 메모리를 할당하고 해당 메모리에 대한 포인터를

반환합니다. 할당된 메모리는 힙(heap)영역에 위치하며, 필요에 따라

크기를 조정할 수 있습니다. new 연산자를 사용하여 동적으로 할당된 메모리는

반드시 delete 연산자를 사용하여 해제해야 합니다.

 

int* num = new int; // int 타입의 메모리 할당
*num = 10; // 메모리에 값 할당

 

 

 

delete 연산자

delete 연산자는 new 연산자로 할당한 동적 메모리를 해제합니다.

메모리를 해제하지 않으면 프로그램이 종료되더라도 할당된 메모리는

반환되지 않으며, 메모리 누수(memeory leak)가 발생합니다.

int* num = new int;
*num = 10;
delete num; // 메모리 해제

 

 

 

배열의 동적 할당

C++에서 배열 또한 동적으로 할당할 수 있습니다.

아래의 코드와 같이 배열을 동적 할당, 해제할 수 있습니다.

int* arr = new int[5]; // 크기가 5인 int 배열 할당
arr[0] = 10;		// 배열 요소에 값 할당
delete[] arr;		// 배열 해제

 

 

 

동적 객체 생성

클래스 객체 또한 동적으로 할당이 가능하다.

new 연산자를 사용하여 객체를 할당 후, delete 연산자로 해제합니다.

class Test 
{
public:
    Test() 
    {
        cout << "Test 생성자 호출" << endl;
    }

    ~Test() 
    {
        cout << "Test 소멸자 호출" << endl;
    }
};

Test* testObject = new Test; // Test 객체 할당
delete testObject; // 객체 해제

 

동적 할당 정리

동적 할당은 필요한 만큼의 메모리를 프로그램 실행 중에 할당할 수 있게 해주어

유연성을 제공해 줍니다. 그러나 적절한 메모리 관리가 필요하며, 할당된 메모리를

해제하지 않으면 메모리 누수 문제가 발생할 수 있으므로 주의해야 합니다.

 

반응형

 

반응형

'C++' 카테고리의 다른 글

구조체  (0) 2023.05.30
인라인 함수  (0) 2023.05.30
강한 타입 검사  (0) 2023.05.30
C++ 표준 라이브러리  (1) 2023.05.30
클래스에 대한 이해  (0) 2023.05.30
반응형
클래스 (Class)

C++에서 클래스는 객체 지향 프로그래밍의 기본적인 개념 중 하나이다.

클래스는 데이터와 해당 데이터를 조작하는 함수를 함께 묶어 놓은 사용자 정의

데이터 형식이다. 클래스는 객체의 설계도나 템플릿으로 볼 수 있으며, 

객체를 생성하기 위한 템플릿으로 사용된다.

 

클래스는 멤버 변수와 멤버 함수로 구성된다.

멤버 변수는 클래스 내에서 데이터를 저장하는 변수를 나타내며,

멤버 함수는 클래스 내에서 데이터를 조작하거나 처리하기 위한

함수를 나타냅니다.

 

객체는 클래스로부터 생성되며, 클래스의 인스턴스라고도 부릅니다.

객체는 클래스의 멤버 변수에 저장된 데이터에 접근하고, 멤버 함수

를 호출하여 작업을 수행할 수 있습니다.

 

아래의 코드처럼 사용된다.

class MyClass {
  private:
    int myVariable;  // 멤버 변수

  public:
    void setMyVariable(int value) {
        myVariable = value;
    }

    int getMyVariable() {
        return myVariable;
    }
};

int main()
{
    MyClass myObject;  // MyClass의 객체 생성

	myObject.setMyVariable(10);  // 멤버 함수 호출하여 myVariable 값을 설정
	int value = myObject.getMyVariable();  // 멤버 함수 호출하여 myVariable 값을 얻음
	return 0;
}

 

 

 

클래스 구조

1. 멤버 변수(Member Variables) : 

클래스 내에 선언된 변수로, 객체의 상태나 속성, 즉 정보를 나타낸다.

 

멤버 변수는 클래스의 어디에서든 접근 가능한 범위를 가지는데, 일반적으로

private, public, protected 와 같은 접근 지정자를 사용하여 접근 법위를 제한한다.

 

멤버 변수는 클래스 내에서 사용되는 데이터를 저장하며,

클래스의 객체마다 독립적인 각각의 멤버 변수를 가진다.

 

2. 멤버 함수(Member Functions) : 

클래스 내에 선언된 함수로, 주로 객체의 동작이나 행위를 정의한다.

 

멤버 함수는 클래스 내에서 멤버 변수에 접근할 수 있으며, 멤버 변수를

조작하거나 사용할 수 있는 기능을 제공한다.

 

멤버 함수는 객체를 통해 호출되며, 객체의 상태에 따라 멤버 변수를

조작하거나 결과를 반환할 수 있다.

 

3. 객체(Objects)

클래스로부터 생성된 인스턴스를 의미한다. 즉 클래스의 실제 예시이다.

클래스는 객체를 만들어 내는 틀이고, 객체는 그러한 틀에서 만들어진

표본이라고 생각하면 된다.

 

객체는 클래스의 맴버 변수에 저장된 데이터에 접근하고, 멤버 함수를 호출하여

작업을 수행할 수 있습니다.

 

클래스를 정의하고 객체를 생성하여 사용하는 것은 객체 지향 프로그래밍의

핵심 개념 중 하나이다.

 

다수의 객체를 생성하여 각 객체의 상태와 동작을 독립적으로 관리할 수 있다.

 

4. 생성자(Constructors)와 소멸자(Destructors) : 

생성자는 객체가 생성될 때 호출되는  특별한 멤버함수이다.

객체의 초기화를 담당한다.

 

생성자는 클래스와 동일한 이름을 가지며, 객체를 생성 할 때

자동으로 호출된다.

 

소멸자는 객체가 소멸될 때 특별한 멤버 함수이다.

객체가 메모리에서 해제될 때 필요한 정리 작업을 수행한다.

 

소멸자는 클래스 이름 앞에 '~' 기호를 붙여서 정의한다.

 

5. 접근 지정자(Access Specifiers)  : 

클래스의 멤버 변수와 멤버 함수에 대한 접근 범위를 제한하기 위해 사용한다.

 

세 가지 주요 접근 지정자인 private, public, protected 가 있다.

  • private : 해당 멤버는 클래스 내부에서만 접근 가능. 클래스 외부에서 는 접근 불가능.
  • public : 해당 멤버는 클래스 외부에서도 접근 가능. 클래스를 통해 객체를 생성하거나 객체의 멤버 함수를 호출할 떄 사용
  • protected : 해당 멤버는 클래스 내부와 해당 클래스를 상속받은 파생 클레스에서 접근 가능.

 

아래의 코드는 생성자를 이용한 코드의 예시이다.

#include <iostream>
#include <string>

class Person {
  private:	// 접근 지정자
    std::string name;
    int age;

  public:	// 접근 지정자
    // 생성자
    Person(std::string n, int a) {
        name = n;
        age = a;
    }

    // 멤버 함수
    void introduce() {
        std::cout << "이름: " << name << std::endl;
        std::cout << "나이: " << age << std::endl;
    }
};

int main() {
    // Person 클래스의 객체 생성
    Person person1("Alice", 25);
    Person person2("Bob", 30);

    // 객체의 멤버 함수 호출하여 정보 출력
    person1.introduce();
    std::cout << std::endl;
    person2.introduce();

    return 0;
}

 

 

 

class와 struct의 차이

C++ 에서 struct와 class는 모두 사용자 정의 데이터 형식을 정의하는데 사용되는 키워드다.

하지만 두 키워드에는 몇 가지 차이점이 있다.

 

1. 접근 지정자 :

struct : 멤버 변수나 멤버 함수에 별도로 지정해주지 않으면 기본적으로

            멤버 변수와 멤버 함수의 접근 지정자가 public이다.

class : 멤버 변수나 멤버 함수에 별도로 지정해주지 않으면 기본적으로

           멤버 변수와 멤버 함수의 접근 지정자가 private이다.

 

2. 상속 : 

struct : 별도로 지정해주지 않으면 기본적으로public 상속을 지원한다.

             struct에 상속된 멤버들은 상속받은 클래스 외부에서 접근이 가능하다.

class : 별도로 지정해주지 않으면 기본적으로 private 상속을 지원한다.

            class에 상속된 멤버들이 상속 받은 클래스 외부에서 접근 불가능하며,

            접근 지정자를 명시적으로 지정해야 외부에서 접근 가능하다.

 

3. 사용 용도 : 

struct : 주로 데이터의 집합을 표현하는데 사용. 일반적으로 멤버 변수만을 가지며,

            메서드는 제한적으로 사용된다.

class : 주로 객체 지향 프로그래밍의 개념을 구현하는데 사용. 데이터와 해당 데이터

            를 조작하는 메서드를 포함하는데 사용된다.

 

4. 호환성 : 

stuct와 class는 문법적으로 다르지만, C++에서는 두 키워드를 상호 교환 가능하게 만들었다.

즉 struct를 class로 대체하거나 그 반대로 사용해도 문제가 없다. 다만, 관례적으로 struct는

주로 데이터 구조에 사용되고, class는 주로 객체 지향적인 기능을 나타내는데 사용된다.

 

외형적인 차이는 아래의 코드와 같이 키워드 struct를 대신해 class사용한 것 뿐이다.

// struct 예시
struct MyStruct {
    int myVariable;
    void myFunction() {
        // 멤버 함수의 구현
    }
};

// class 예시
class MyClass {
  private:
    int myVariable;

  public:
    void myFunction() {
        // 멤버 함수의 구현
    }
};

 

class 파일 분할

class를 사용할 때는 파일을 분할해 줘야한다.

클래스명.h 로 헤더파일을 만들고 그 안에 class를 선언하고

멤버변수와 멤버함수를 선언만한다. 

 

멤버함수의 정의는 cpp파일에 따로 만들어서 관리하도록 한다.

 

 

반응형
반응형

'C++' 카테고리의 다른 글

구조체  (0) 2023.05.30
인라인 함수  (0) 2023.05.30
강한 타입 검사  (0) 2023.05.30
C++ 표준 라이브러리  (1) 2023.05.30
동적 할당  (0) 2023.05.30
반응형
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 문제 두 파일 비교하기

void CreateFilesNComp(char* fileName1,char* fileName2)
{
	FILE* file1 = fopen(fileName1, "wt");
	FILE* file2 = fopen(fileName2, "wt");
	if (file1 == NULL || file2 == NULL)
	{
		printf("파일을 열 수 없습니다.\n");
		return -1;
	}

	char words1[100];
	char words2[100];

	printf("d1파일 텍스트 입력 : ");
	fgets(words1, sizeof(words1), stdin);
	printf("d2파일 텍스트 입력 : ");
	fgets(words2, sizeof(words2), stdin);

	fprintf(file1, "%s", words1);
	fprintf(file2, "%s", words2);
	//fgets(words1, sizeof(words1), file1);
	//fgets(words2, sizeof(words2), file2);

	fclose(file1);
	fclose(file2);
	file1 = NULL;
	file2 = NULL;
}

void Comp(char* fileName1, char* fileName2)
{
	FILE* file1 = fopen(fileName1, "rt");
	FILE* file2 = fopen(fileName2, "rt");
	if (file1 == NULL || file2 == NULL)
	{
		printf("파일을 열 수 없습니다.\n");
		return -1;
	}
	char string1[100];
	char string2[100];

	fscanf(file1, "%s", string1);
	fscanf(file2, "%s", string2);

	fclose(file1);
	fclose(file2);
	file1 = NULL;
	file2 = NULL;

	for (int i = 0; i < sizeof(string1); i++)
	{
		if (string1[i] != string2[i])
		{
			printf("두 개의 파일은 일치하지 않습니다!\n");
			return 0;
		}
	}

	printf("두 개의 파일은 완전히 일치합니다!\n");

}

int main()
{
	char* fileName1 = "d1.txt";
	char* fileName2 = "d2.txt";

	CreateFilesNComp(fileName1, fileName2);
	Comp(fileName1, fileName2);
    
    return 0;
}

 

반응형

 

반응형

'연습문제' 카테고리의 다른 글

C 파일 입출력 문제1  (0) 2023.05.24
C 복소수 구하기  (0) 2023.05.24
C언어 주사위 굴리기  (0) 2023.05.22
C언어 달팽이 정렬  (0) 2023.05.22
C언어 90도씩 회전하기  (0) 2023.05.22

+ Recent posts