일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 생성자호출
- 랜덤출력
- 코딩
- 멤버접근허용
- 자바스크립트
- freiend클래스
- freiend선언
- 프로그래밍
- 객체지향프로그래밍
- time()
- call by referance
- new연산자
- 데이터베이스
- JS
- C++
- this객체
- jQuery
- 연산자재정의
- friend함수
- SQL
- 제네릭 함수
- 웹개발
- C언어
- react
- 함수표현식
- 테이블
- 함수중복
- HTML
- 친구함수
- 자바스크립트라이브러리
- Today
- Total
Programming Storytelling
C언어 기원 C++프로그래밍,무엇이 추가 되었을까? 본문
C언어를 기반으로 구성된 C++은 어떤 기능이 추가되었을까?
이번 포스팅에서는 C언어에서 추가된 C++만의 새로운 기능을 대표적으로 살펴보겠다.
대표적인 추가기능으로는 크게 8개가 있는데 그 구성은 다음과 같다.
1.인라인 함수(inline function)
함수 호출 대신 함수 코드의 확장 삽입
2.함수 중복(function overloading)
매개변수에 디폴트 값이 전달되도록 함수 선언
3.참조와 참조 변수(reference)
하나의 변수에 별명을 사용하는 참조 변수 도입
4.참조에 의한 호출(call-by-reference)
함수 호출 시 참조 전달
5.new/delete 연산자
동적 메모리 할당/해제를 위해 new와 delete 연산자 도입
6.연산자 재정의
기존 c++연산자에 새로운 연산 정의
7.제네릭 함수와 클래스
데이터 타입에 의존하지 않고 일반화 시킨 함수나 클래스 작성 가능
ONE. 인라인 함수
인라인 함수를 사용함으로서 프로그래머는 함수를 호출하는 코드를 함수가 정의된 곳에다 생성하지 않고 컴파일러가 완전한 함수체를 함수가 호출되는 모든 장소에 삽입할 것을 요청할 수 있다.하지만 인라인함수에는 절대 범해서는 안될
주의사항이 세가지가 있다. 첫째로는 크기가 작은함수는 인라인 함수로 만들기말아야하며 둘째로는 코드길이가 긴 인라인함수는 사용하지 말아야한다. 마지막으로 가상함수를 인라인 함수로 만들어선 안된다.이러한 점들을 통괄적으로 인라인함수는 크기는 작지만 자주 사용하지 않는 경우에 사용하는것이 좋을거 같다.
다음은 인라인화가 되지않는 4가지의 경우이다.
- 가변인자를 가진 함수
- 함수포인터
- 가상함수
- 재귀 함수
#include<iostream>
inline int SQUARE(int x)
{
return x*x;
}
int main(void)
{
std::cout<<SQUARE(5)<<std::endl;
std::cout<<SQUARE(12)<<std::endl;
return 0;
}
TWO. 함수중복
아래의 코드는 함수중복을 보여주는 예시 코드이다.
#include <iostream>
#include <string>
using namespace std;
int MAX(int a, int b) {
if (a > b) return a;
else return b;
}
int MAX(int a[], int size) {
int result = a[0];
for (int i = 0; i < size; i++) {
if (result < a[i]) result = a[i];
}
return result;
}
int main() {
int array[5] = { 3, -7, 15, 60, 46 };
cout << MAX(4, 5) << endl;
cout << MAX(array, 5) << endl;
}
이와 같이 함수의 이름은 같지만 매개변수가 달라 함수의 중복이 허용되는 경우가 있다.
이러한 경우 이름이 같아도 컴파일러는 매개변수에 따라 다른 함수로 인식 하기 때문에
함수 호출시 개개인의 함수로 처리가 된다.
함수 중복도 알아보았으니 더 나아가 디폴트 매개 변수에 대해서도 알아보도록하자.
보통 디폴트값의 선언은 '매개 변수 = 디폴트 값' 형태로 선언된다.
void color(string c = "green"); // c의 값은 green
color(); // 매개 변수에 디폴트 값 green 자동 전달
color("blue") // 매개 변수 c에 blue값 전달
디폴트 값을 선언할 땐 반드시 끝 쪽에 몰려 선언되어야 한다는 규칙이 있다는 사실을 기억하도록 하자.
void sum(int a, int b=5, int c, int d=0); // 컴파일 오류
void sum(int a=0, int b, int c); // 컴파일 오류
void sum(int a, int b=5, int c=0, int d=0); // 컴파일 성공
디폴트값을 이해하기 어렵다면 쉽게말해 초기값으로 기억 해 두도록 하자.
THREE. 참조와 참조 변수
non-const 값에 대한 참조형은 자료형 뒤에 앰퍼샌드(&)를 사용하여 선언한다.
- 자료형& 별명 = 기존 변수명;
int value = 5; // normal integer int& ref = value; // reference to variable value
위 코드에서 &는 주소(address)를 의미하지 않고 참조(reference)를 의미한다.
그리고 참조형은 선언과 동시에 반드시 초기화해야 한다.
int value = 5; i
nt& ref = value;
null 값을 저장할 수 있는 포인터와 다르게, null 참조 같은 것은 없다.
non-const 값에 대한 참조는 non-const 값으로만 초기화할 수 있다. const 값 또는 r-value로 초기화할 수 없다.
FOUR. 참조에 의한 호출
참조에 의한 호출은 함수의 매개변수를 함수의 변수로 선언하는 방식이다.
C++에는 값에의한 호출,참조에 의한 호출,주소에 의한 호출 이렇게 3가지의 호출방식이 존재하는데
C와 달리 추가 된 참조에 의한 호출은 두 값을 바꿔주는 swap()로 그예를 들 수 있다.
#include<iostream>
using namespace std;
void swap(int &a, int &b) {
int tmp;
tmp = a;
a = b;
b = tmp;
}
함수의 원형을 살펴보면 참조변수로 매개변수를 받았다는 사실을 알 수 있다.
FIVE. new/delete 연산자
C언어에서는 동적으로 메모리를 할당하기 위해서 malloc()/free()를 사용하였다.
쉽게 말해 c언어의 malloc()가 c++의 new연산자 이고 free()가 delete 연산자이다.
int *p = (int*)malloc*sizeof(int));
이것은 C언어에서 동적 메모리를 할당하는 방법이다. C++에서는 위코드를
int *p = new int; ( '주소를 저장할 포인터' = new ''할당하고 싶은 크기의 자료형';)
로 설명 할 수가 있다.
C언어에 상대적으로 코드표현이 간결 해 지고 형변환이 없어 보기가 편해졌다.
그러면 int 크기의 데이터 5개가 그룹 지어서 메모리를 할당 했다면 어떻게 구성하면 될까?
방법은 아래와 같다.
int *p = (int *)malloc(sizeof(int)*10); -->C언어
int *p = new int[10]; -->C++
이제 C에서 free()에 부합하는 delete연산자에 대해 살펴 보도록 하자.
delete연산자는 new연산자와 쌍으로 많이 쓰기 때문에 new연산자로 동적 메모리를 할당했다면 꼭 delete연산자로
할당된 메모리를 해제 시켜 줘야 한다.
delete연산자 사용법
delete p; // 단순한 메모리 할당
delte [] p' // 그룹으로 메모리 할당
SIX. 연산자 재정의
연산자 오버로딩이란 C++에서 연산자가 하는 일을 함수로 개인의 필요에 맞게 구현한 것이다. 예를 들어, 클래스의 성격에 따라 필요한 연산 기능이 있다면 그에 맞게 동작하도록 기본 연산자의 기능을 재정의할 필요가 있는데 이것을 연산자 오버로딩이라 한다.대부분의 기본 제공 연산자 함수는 전역 함수 또는 클래스로 재정의 가능하다.대신
**과 같은 새로운 연산자는 정의 할 수 없으며 기본 제공 데이터 형식에 적용할 때 연산자의 의미 또한 정의 할 수 없다.
오버로드 된 연산자는 비정적 클래스 멤버함수거나 전역함수 이여야 하며 privte 또는 protected접근자의 전역함수는
해당 클래스의 friend로 선언해야 한다.
이제 오버로딩이 불가능한 연산자를 살펴 보도록 하겠다.
오버로딩이 불가능한 연산자 |
|
연산자 |
이름 |
. |
멤버선택 |
.* |
멤버 포인터 선택 |
:: |
범위 |
?: |
조건 |
# |
문자열 전처리기 변환 |
## |
전처리기 연결 |
SEVEN. 제네릭함수와 클래스
##제네릭 프로그래밍##
제네릭 프로그래밍이란 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식으로 템플릿은 STL제네릭 프로그래밍의 핵심이라고 할 수 있다.
##제네릭 함수##
어떤 종류의 컨테이너나 type에 대한 제약없이 사용할 수 있는 함수를 제네릭 함수라고 부른다.
제네릭 함수를 구현하는 언어적 기능을 소위 템플릿 함수라고 부른다.
템플릿 함수는 유사하게 동작하는 함수 그룹, 또는 타입 그룹에 대해 하나의 정의를 사용할 수 있도록 해 줘야 한다.
단, 그 템플릿 매개변수의 타입은 다르게 정해 주어야 한다.
using namespace std;
template<class T>
T bigbig(T a, T b) {
if(a > b) {
return a;
}
else
return b;
}
int main() {
int a = 10, b = 20;
char c = 'a' , d = 'z';
cout <<bigbig(a, b) << endl;
cout <<bigbig(c, d) << endl;
}
다음 코드는 큰값을 반환하는 프로그램을 템플릿 함수로 구현 한것이다.
이어서 배열의 합을 리턴하는 프로그램도 살펴보도록 하자.
using namespace std;
template<class T>
T sumArray(T A[], int length) {
T sum = 0;
for (int i = 0; i <length; i++) {
sum += a[i];
}
return sum;
}
int main()
{
int x[] = { 1,2,3,4,5 };
double y[] = { 1.3,2.4,3.5,4.6,5.7 };
cout << sumArray(x,sizeof(x)/sizeof(x[1])) <<endl;
cout << sumArray(y,sizeof(y)/sizof(y[1])) <<endl;
}
##클래스란?
구조체의 상위 호환으로 이해할 수 있고 c++의 구조체는 멤버로 함수를 포함할 수 있기에,C++의 구조체는 멤버로 함수를 포함할 수 있기에 C언어의 구조체보다 좀더 확장된 의미를 가진다. 클래스의 멤버변수를 프로퍼티,멤버변수를 메소드라고 한다.
1. 선언
class 이름 {
클래스 멤버변수 및 멤버함수
};
2.클래스 멤버 함수 정의
자료형 클래스이름::멤버함수(매개변수)
{
함수 내용;
}
3.클래스 멤버 접근 속성
- private :같은 클래스 멤버 내에서만 접근 허용, 접근 속성을 명시 하지않으면 class에서는 private이다.
- protected: 클래스 상속에서 사용하곤 한다.
- public : 모든 위치에서 접근이 허용된다.
보안성을 고려하여 기본속성이 private이며 일반적으로 멤버 변수는 private, 멤버함수는 public으로 클래스를 설계한다. 클래스 선언에서 멤버 접근 속성이 public -> protected -> private 순이다.
'C++' 카테고리의 다른 글
freind 클래스와 함수에 대하여 (0) | 2019.06.12 |
---|---|
정적 변수, static 키워드란? (0) | 2019.06.12 |
복사 생성자(copy constructor) (0) | 2019.06.12 |
랜덤함수 rand(),srand() 에 대하여 (0) | 2019.06.08 |
함수의 오버로딩과 인라인함수 및 매크로 함수 (0) | 2019.04.16 |