함수 오버로딩

매개변수는 다르지만 동일한 이름의 멤버 함수를 여러 개 작성할 수 있는 기능이다. 

 

1. 구현 방법

	void Add()
	{

	}	
    void Add(string s1, string s2)
	{
		...~~~
	}
	void Add(int a, int b)
	{
		...~~~
	}

함수 이름은 같지만 받는 매개변수가 다르다.

같은 이름의 함수를 호출하지만 상황에 따라 다른 결과를 얻어 낼 수 있다. 예를 들어 같은 기능이지만 매개변수 타입의 따른 다른 결과를 원할 때 사용하면 된다. 

 


연산자 오버 로딩

기존의 제공하고 있는 연산자를 재정의하여 원하는 방식으로 수정하여 사용할 수 있다. 전역 함수나 클래스로 재정의도 가능하다.

1. 구현 방법

	Student() { name = "ji"; }
	Student(string name) :name(name) {}

	Student operator + (const Student& other)
	{
		return Student(Student(name + " & " + other.name));
	}

operator를 사용하여 '+'의 연산자를 재정의 한다. 

	Student st1;
	Student st2("han");
	Student result = st1 + st2;

'+'은 기본적으로 더한다라는 정의하지만 내가 만든 Student의 객체를 '+'한다는 의미는 컴파일러는 알지 못한다. 하지만 위에서 정의한 '+'의 기능을 정의하였기에 아래와 같은 결과를 볼 수 있다. 이런 기능을 사용하므로 코드의 길이를 줄일 수 있는 장점이 있다.

결과

 

2. 규칙

연산자 오버 로딩의 규칙들이 있다.

기존의 있는 연산자만 가능하다 (새로운 연산자를 만들어 낼 수는 없음)

멤버 연산자(.), 범위 지정 연산자(::), 전처리기 연결(##)등의 몇몇 연산자는 불가능하다.

피연산자의 개수 규칙 등 기본적인 연산자의 규칙 등 기본적인 연산자의 규칙을 따라야 한다. 

오버 로딩이 된 연산자 중 하나는 사용자 정의 자료형 이어야 한다.

 

반응형

'프로그래밍언어 > C++' 카테고리의 다른 글

C++) 클래스 상속, 오버라이딩  (0) 2020.06.22
C++) 생성자와 소멸자  (0) 2020.06.10
C++)접근 제한자  (0) 2020.06.09
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02

클래스 상속

부모(베이스) 클래스 안에 있던 멤버 변수와 멤버 함수를 물려받아 새로운 클래스를 작성할 수 있게 된다. 객체지향 언어의 가장 큰 특징이며 장점이라고 생각된다.


 

1. 구현방법

class Person
{
	~~~~부모
}


class Student : Person 
{
	~~~~자식
}

Person은 부모 클래스 Student는 자식 클래스라 보면 자식 클래스 옆에  : 을 사용하여 Person의 자식이라는 것을 정의한다.

2. 예시

class Person
{

private:
	string name;

public:
	Person(string name) : name(name)
	{
	}
	string GetName()
	{
		return name;
	}

};

class Student : Person 
{
private:
	int studentID;
public:
	Student(int studentID, string name) : Person(name)
	{
		this->studentID = studentID;
	}

	void Show()
	{
		cout << "학생 번호 : " << studentID << '\n';
		cout << "학생 이름 : " << GetName() << '\n';
	}

};
int main()
{
	Student student(1,"han");
	student.Show();
	system("pause");
}

Student라는 객체를 새로 생성하면서 생성자를 통해 학생 번호와 이름을 부여하고 있다. Student는 name이라는 변수는 없지만 Person(name)을 통해 부모의 변수의 값을 넣을 수 있게 된다.

실행 결과

 

3. 다중 상속

class TempClass
{
public :
	void ShowTemp()
	{
		cout << "임시 부모 \n";
	}

};

class Student : Person, public TempClass
{
private:
	int studentID;
public:

~~~...

int main()
{
	Student student(1,"han");
	student.ShowTemp();
	system("pause");
}

C#은 안되지만, C++은 다중 상속이 가능하다. 

 

4. 장점

1) 코드 중복이 없어진다. 2) 함수 재활용이 가능해진다.


 

오버라이딩

 

상속받은 자식 클래스에서 부모 클래스의 함수를 사용하지 않고 자식 클래스의 함수로 재정의 해서 사용하는 것이다. 아래 예시를 보면 쉽게 이해가 될 것이다.

class Person
{

private:
	string name;

public:
	Person(string name) : name(name)
	{
	}
	string GetName()
	{
		return name;
	}

	void ShowName()
	{
		cout << "이름 :" << GetName() << '\n';
	}
};

class Student : Person, public TempClass
{
private:
	int studentID;
public:
	Student(int studentID, string name) : Person(name)
	{
		this->studentID = studentID;
	}

	void Show()
	{
		cout << "학생 번호 : " << studentID << '\n';
		cout << "학생 이름 : " << GetName() << '\n';
	}
	void ShowName()
	{
		cout << "학생 이름 :" << GetName() << '\n';
	}
};



int main()
{
	Student student(1,"han");
	student.ShowName();
	system("pause");
}

부모인 Person클래스도 ShowNmae() 함수가 있고, 자식인 Student도 ShowName() 함수가 있다. 이 과정을 오버 라이딩이며 부모 함수를 무시하고 자식 함수를 실행하게 된다.

실행 결과


 

추가적으로

1. 자식(파생) 클래스의 객체를 생성하면, 부모(베이스) 클래스의 생성자를 호출한 뒤, 자식 클래스의 생성자가 호출된다.

2. 소멸자는 반대로 자식 클래스가 먼저 호출되고 그 후에 부모 클래스의 소멸자가 호출된다. 

반응형

'프로그래밍언어 > C++' 카테고리의 다른 글

C++) 함수 오버로딩 / 연산자 오버로딩  (0) 2020.06.23
C++) 생성자와 소멸자  (0) 2020.06.10
C++)접근 제한자  (0) 2020.06.09
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02

생성자

객체를 생성함과 동시에 멤버 변수를 초기화할 수 있다. 인스턴스화될 때 자동으로 호출되며,  클래스의 멤버 변수를 적절한 기본값 또는 사용자가 정의한 값을 갖는 인스턴스가 생성되는 것이다. 

 


 

1. 구현방법

class Student
{
private:
	string name;
	int englishScore;
	int mathScore;

public:

	Student(string n ,int e, int m)
	{
		name = n;
		englishScore = e;
		mathScore = m;
	}

};

일반 메서드를 작성하는 방법과 같다. 이름은 클래스 이름과 같게 설정해주면 된다.(반환 값은 없음) Student인 새로운 객체를 만들 때 name, englishscore, mathscore의 각각 해당하는 값을 할당해주면서 이 객체는 초기화된다.

 


 

2. 사용방법

1) 클래스 이름과 같아야함 2) 반환 값이없어야함

int main(void)
{
	Student a = Student("Mr.Han",100,98); // Student 생성!

}

 이렇게 해주면 끝!

	Student* st1 = new Student("han" , 100, 98);
	st1->NumberUp();

이런식으로 동적으로 생성할때도 생성자는 동작한다.


 

3. 디폴트 생성자

public:

	//Student(string n ,int e, int m) //생성자 주석.
	//{
	//	name = n;
	//	englishScore = e;
	//	mathScore = m;
	//}
};

int main(void)
{
	Student a = Student(); //매개변수 X

}

작성한 생성자가 없을때는 매가변수가 없는 기본 생성자로 인식한다. 멤버 변수들은 '0'혹은 'NULL'인 값으로 설정된다.

 


 

4. 복사생성자

매개변수의 값을 넘겨주는 일반 생성자와 다르게 객체를 넘겨 복사를 하도록 하는 생성자이다.

int number = 0;

class Student
{


private:
	string name;
	int englishScore;
	int mathScore;
	int num;

public:

	Student(string n, int e, int m)
	{
		name = n;
		englishScore = e;
		mathScore = m;
	}
	Student(const Student &st)
	{
		name = st.name;
		englishScore = st.englishScore;
		mathScore = st.mathScore;
	}
	void NumberUp()
	{
		number++;
		num = number;
	}

	void Show()
	{
		cout << "번호 " << num << "이름 " << name << "영어 " << englishScore << "수학 " << mathScore << '\n';

	}
};

int main()
{
	Student* st1 = new Student("han" , 100, 98);
	st1->NumberUp();
	Student st2(*st1);
	st2.NumberUp();
	st1->Show();
	st2.Show();

	system("pause");
}

st1을 만들고 st2를 만들때 생성자에 *st1을 넘김으로 써 st1을 그대로 복사한다. 각 Student객체는 NumberUp()으로 int number를 한개씩 증가 시켜 각각 num의 값을 다르게 넣도록 했다. 

 

소멸자

객체의 수명이 끝났다고 판단되면 이 객체를 제거하기 위한 목적으로 사용된다. 객체의 수명이 끝났을 때 자동으로 컴파일러가 소멸자 함수를 호출한다. 클래스명 앞에 '~'기호를 사용하여 작성한다. 

 


 

1. 구현방법

	~Student()
	{
		cout << "객체 소멸 \n";
	}
int main()
{
	Student* st1 = new Student("han" , 100, 98);
	st1->NumberUp();
	Student st2(*st1);
	st2.NumberUp();
	st1->Show();
	st2.Show();
	
	delete st1;
	system("pause");
}

st1은 선언한 지역이 끝날 때 메모리를 해제하기 전에 소멸자를 먼저 수행하지만, 동적으로 생성한 st2같은 경우는 delete키워드를 이용해 메모리를 해제요청하고 소멸자를 먼저 수행하도록 해야한다.

반응형

C++ 역시 클래스 멤버 선언 시 접근 제한자를 지정할 수 있다.

접근 제한자는 왜 필요할까?

객체지향 프로 래밍은 특히 이 접근 제한자를 잘 사용할 필요가 있다. 객체지향 프로그래밍은 한 완제품을 생상하는 공장의 기계들과 같다고 생각하면 좋을 것 같다. 예를 들어 자동차 한 대를 만들어 내기 위해서는 엔진, 부품 등등 여러 가지 제작, 결합 과정을 거치게 된다. 이 공장 기계들은 서로의 어떻게 부품을 만들어 내는지, 전혀 알 필요가 없다. 공장 기계들은 설계자가 시킨 작업만 진행하면 된다. 서로의 작업들의 내용을 공유하지 않기 위해 필요한 것이 정보은닉이다.

프로그램도 프로그래머가 설계한 클래스, 함수를 통해 자기 자신의 작업만 진행하면 된다. 이 접근 제한자는 프로그램을 보통 한명이 만들 때보다 여러 프로그래머가 동시에 작업을 할 때 특히 확실히 필요하게 된다.

#include <iostream>
#include <string>

using namespace std;

class Student
{
private:
	string name;
	int englishScore;
	int mathScore;
	int getSum()
	{
		return englishScore + mathScore;
	}
public:
	Student(string n ,int e, int m)
	{
		name = n;
		englishScore = e;
		mathScore = m;
	}
	void show() { cout << name << " : [합계 " << getSum() << "점]\n"; }

};

int main(void)
{
	Student a = Student("Mr.Han",100,98);
	a.show();

	system("pause");
}

반응형

'프로그래밍언어 > C++' 카테고리의 다른 글

C++) 클래스 상속, 오버라이딩  (0) 2020.06.22
C++) 생성자와 소멸자  (0) 2020.06.10
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02
C) ASCII 아스키코드  (0) 2020.05.01

배열과 포인터는 동일하다고 보면된다. 배열을 선언하면 그 이름자체가 포인터 변수가 되는 것이다.

a자체가 선언한 배열의 주소를 가지고 있는 것이다. 

 

문자열의 개념

문자열은 문자들의 배열이다. 끝을 알리는 목적으로 컴퓨터 메모리 구조상 마지막에 널값을 포함한다. 

문자열 형태로 포인터를 사용하면 포인터에 특정한 문자열의 주소를 넣게된다. 

"Hello World"문자열을 읽기 전용으로 메모리 공간에 넣은 뒤 그 위치를 처리한다. 

배열은 포인터와 치환되기 때문에 이런식으로 각각 char한 문자씩 출력이 가능하다. 

반응형

간단한 txt파일에 문자 입력하기

 

fopen() 함수의 원형 

FILE * fopen( const char *, const char * );

첫번째 인자 : 처리할 파일 명 

두번째 인자 : 파일 처리 종류 지정 (모드) 

 

r = 읽기 모드 / 파일이 없을 경우 에러 발생 

w = 쓰기 모드 / 파일이 없을 경우 새로 만들고, 파일이 존재하면 내용을 삭제하고 처음부터 기록 

a = 추가 쓰기 모드 / 파일이 없을 경우 새로 만들고, 파일이 존재하면 뒤에부터 이어서 기록 

 

fopen으로 파일을 열었다면 fclose를 사용하고 닫아 주도록 한다.

 

이렇게 실행하면 해당 프로젝트 폴더에 "temp"파일이 생성된것을 볼 수 있다.

그 안에는 "Hello World"가 입력되어있다.

 

1. 파일 읽고 쓰기.

input.txt 파일을 만든다.

이제 이 input.txt파일을 한줄 씩 읽고 하나씩 출력하는 프로그램을 만들기 위한 코드를 작성한다. 

 

Student라는 데이터를 입력받을 구조체 모델을 만든다.

구조체 포인터를 이용해 크기를 동적으로 할당한다. n은 총 학생수.

 빌드 후 확인한다.

 

1. 메모리 해제, 파일 닫기

sum에 다가 학생들의 점수를 모두 더하고 출력하도록 했다.

반응형

아스키 코드

아스키코드는 0~127중의 1바이트로 구성된다.

https://namu.wiki/w/%EC%95%84%EC%8A%A4%ED%82%A4%20%EC%BD%94%EB%93%9C

캐릭터형 자체에 숫자를 넣어서 처리할 수 있다. 

char 형으로 48을 받으면 아스키코드로 0을 나타내고 있는것을 알 수있다. char각각 매칭된다는것을 알 수 있다. 컴퓨터는 실제로 받아 들일때는 문자가아닌 숫자로 받고 있다는것이다.

 

반응형

call by value(값에 의한 호출)

값을 복사해서 전달하기 때문에 원본의 값(매개변수로 넘겨준 값)이 변경될 가능성이 없다. 하지만 참조에 의한 호출보다는 고비용이다. 

 

call by reference(참조에 의한 호출) 

원본의 값의 변경이 될수도 있다. 

반응형

'프로그래밍언어 > C++' 카테고리의 다른 글

C++) 생성자와 소멸자  (0) 2020.06.10
C++)접근 제한자  (0) 2020.06.09
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02
C) ASCII 아스키코드  (0) 2020.05.01

+ Recent posts