'C/C++'에 해당되는 글 3건

  1. 2015.04.22 C++의 객체간 대입
  2. 2015.04.22 기본 자료형과 변수
  3. 2015.04.21 C++ 강의 글 목록 (목차) 2

  이미 생성된 인스턴스에 다른 인스턴스를 대입할 때 대입 연산자(=)가 이용되며 실제로는 복사가 수행된다. 다음과 같은 간단한 클래스를 고려해 보자.


-------------------------------------------

class Led {

    public :

        int pin;

        char *name;

};

-------------------------------------------


이 클래스는 복사 생성자도 없고 =연산자도 오버로딩되지 않았다. 이 경우 디폴트=연산자 함수는 얕은 복사를 수해하게 된다. 이제 다음과 같은 두 예를 보자


-------------------------------------------

//ex1

Led led1;

led1.pin=13;

Led led2 = led1; // 복사생성자 호출


//ex2

Led led1, led2;

led1.pin=13;

led2 = led1; // 대입 함수 호출

-------------------------------------------


<ex1>에서 led2가 생성될 때는 복사생성자가 실행되고  <ex2>에서는 대입 연산 함수가 호출된다.


하지만 멤버변수에 포인터가 있으므로 여기에 문자열이 저장된 경우 얕은 복사는 문제가 일어나게 된다. 


-------------------------------------------

Led led1, led2;

led1.name = new char[3];

strcpy(led1.name, "hi");


led2 = led1; // 얕은 복사가 일어나므로 문제를 야기함.

-------------------------------------------


심지어 깊은 복사를 수행하는 복사생성자가 정의되어 있어도 대입 연산자는 얕은 복사만을 수행하므로 주의해야 한다. 즉, 대입연산은 자동으로 사용자가 정의한 복사 생성자를 호출하지 않는다. 아래와 같이 깊은 복사를 수행하는 복사 생성자를 작성했다고 하자.


-------------------------------------------

class Led {

    public :

        int pin;

        char *namer;

        Led(const Led& src) {

            pin = src.pin;

            name = new char[strlen(src.name)+1];

            strcpy(name, src.name);

        }

};

-------------------------------------------


복사 생성자는 생성자이므로 인스턴스가 새로 생성될 때 수행된다. 따라서 name필드에 이전에 메모리를 할당한 적이 없을 것이니 해제할 필요도 없다.


  이렇게 작성한 뒤에서 대입연산은 여전히 얕은 복사를 수행하게 된다. 즉, 복사생성자와 대입연산자는 별개이다.  대입 시에도 깊은 복사를 수행하려면 대입연산자를 오버로딩하여 사용자가 작성해주어야 한다. 한 가지 주의할 점은 대입연산자는 이미 생성된 인스턴스에다 복사해 넣는 것이므로 기존의 문자열을 해제하는 코드가 추가로 필요하다는 것이다. 이것이 대입연산자와 복사생성자의 차이이다.


-------------------------------------------

Led& Led::operator= (const Led& src) {

    if (this == &src) return *this; // 자기 대입 방지


    pin = src.pin;

    i(name != NULL) delete[] name; // (주의)

        name = new char[strlen(src.name)+1];

        strcpy(str, src.name);


    return *this;

}

-------------------------------------------


이제는 대입연사자를 사용하면 깊은 복사가 일어나게 된다. 만약 복사 생성자와 코드가 많이 중복된다면 중복되는 부분은 private 멤버 함수로 따로 작성하는 것이 더 효율적일 것이다.

[#00063]


Posted by 살레시오
,

2.3 기본 자료형    [DOC]    [SMTS]

 자료형(data type)이란 정수, 실수, 문자 등과 같이 프로그램에서 사용되는 자료(data)의 종류를 의미한다. 사용하고자 하는 데이터의 종류가 정해지면 그것을 저장할 변수는 그것에 맞추어서 만들어져야 한다.  C 언어는 기본 자료형을 제공하고 사용자들이 필요에 따라 새로운 자료형을 정의할 수 있는 방법을 제공하고 있다.


 표준 C언어에서 제공하는 기본적인 자료형을 다음 표에 정리하였다.


[표 2.1.1] C언어의 기본 자료형

분류

데이터형

byte

범위

비고

정수형

(signed) char

unsigned char

1

-128~ 127

0~255


(signed) short

unsigned short

2

-32,768 ~ 32,767

0 ~ 65,535


(signed) int


unsigned int

4/2

-2,147,483,648 ~ +2,147,483,647

0~4,294,967,295


(signed) long

unsigned long

4

-2,147,483,648 ~  +2,147,483,647

0~4,294,967,295


(signed) long long

unsigned long long

8

-2^63 ~ 2^63-1

0 ~ 2^64-1

C99

C99

실수형

float

4



double

8



long double

12


C99

논리형

bool

boolean

1

1

true, false

true, false

C99(1)

C++

  1. stdbool.h 를 인클루드 한 후에 사용가능하다.


 자료형은 크게 정수형과 실수형, 논리형으로 나뉜다. 정수형은 부호가 있는 signed 형과 부호가 없는 unsigned 형이 별개로 존재하지만 실수형은 그렇지 않다. 또한 각각의 자료형은 정해진 크기가 있으나 PC환경에 따라 그 크기가 변화하는 데이터 형이 있음에 주의해야 한다. 대표적인 것이 int형과 long double형이다.


 논리형은 true, false 두 가지 값만을 가지는 자료형이다. C 언어에서는 C99이후에 stdbool.h 라는 표준 헤더 파일을 인클루드하면 bool형을 사용할 수 있다. (C++은 boolean 자료형이 기본형으로 제공된다.)


 변수(variable)는 자료를 담는 그릇이다. 변수를 사용하려면 반드시 먼저 선언을 해야 하며 문법은 다음과 같다.


자료형 변수명;

예를 들어서 int 형 변수 ia를 사용하려면 다음과 같이 선언을 해야 한다.


int ia;

이렇게 선언을 한 이후에는 이 변수에 값을 대입한다든지 계산을 하는데 사용할 수 있다.


int ia; // 선언
ia = 100; //사용(초기화) 정수값을 대입
ia = 12 * 34; //사용 :곱셈 계산

변수의 '초기화'는 선언된 이후에 맨 처음으로 어떤 값을 대입하는 것을 의미한다. 위와 같이 변수를 선언한 후 초기화를 별도로 할 수도 있고 선언과 동시에 초기화를 수행할 수 도 있다.


long la = 0; // 선언과 동시에 초기화
double da = 1.0; // 선언과 동시에 초기화

이렇게 한 이후에는 자유롭게 변수를 사용할 수 있다.


ex02-01.c

#include <stdio.h>

int main() {
short sa = 11;
int ib = sa + 12; // sa값과 12를 더한다.
int ic = sa * ib; // sa값과 ib값을 곱한다.

printf("%d, %d, %d", sa, ib, ic);
}

실행 결과

11, 23, 253


이 예는 변수 sa, ib, ic를 생성하여 그 값을 printf()함수를 이용하여 화면에 출력하는 것이다. 컴파일한 후 실행해서 결과를 직접 확인해 보자.



Posted by 살레시오
,

일단계 C/C++ 프로그래밍


  • C 언어만을 학습하고자 한다면 [C++] 표시된 장은 넘어가도록 한다.

1장 C언어 개요 및 실습 도구


   1.1  프로그래밍 개요

   1.2  C 언어 소개

   1.3  [C++] C++ 언어 소개

   1.4  C 프로그램 개발 과정

   1.5  C 언어의 표준안들 개요

   1.6  [C++] C++ 의 표준안들

   1.7  윈도우즈에 mingw 설치하기

   1.8  Atom 에디터 설치하고 첫 프로그램 실행하기

   1.9  2진수와 16진수

   1장 연습문제


   부록: 무료 C/C++ IDE CodeLite 소개

            무료 C IDE PellesC 소개

2장 자료형과 변수


   2.1  식별자와 예약어

   2.2  구분기호와 주석

   2.3  자료형과 변수

   2.4  정수 자료형과 정수 상수

   2.5  실수 자료형과 실수 상수

   2.6  문자 상수

   2.7  논리형 (bool 형)

   2.8  #define 으로 숫자 상수 정의하기

   2.9  printf() 함수

   2.10  scanf() 함수

   2.11  typedef 명령어

   2장 연습문제

3장 연산자


   3.1  연산자의 종류

   3.2  산술 연산자와 부호 연산자

   3.3  암시적 형변환과 명시적 형변환

   3.4  관계 연산자(==,!=,<,>,<=,>=)와 if 문

   3.5  논리 연산자 (&&, ||, !)

   3.6  조건 연산자 (?:)

   3.7  증감 연산자 (++, --)

   3.8  대입 연산자

   3.9  비트연산자 (생략 가능)

       3.9.1 비트 연산자 종류

       3.9.2 비트 연산자 : bitwise-and

       3.9.3 비트 연산자 : bitwise-or

       3.9.4 비트 연산자 : bitwise-xor

       3.9.5 비트 연산자 : bitwise-not

       3.9.6 비트 이동 연산자 : <<, >>

       3.9.7 비트 마스킹 정리와 응용

   3.10  sizeof 연산자

   3.11  콤마(,) 연산자

   3.12  연산자 우선 순위와 결합 방향

   3장 연습 문제    ( 문제 풀이 동영상 )

4장 제어문


   4.1  if~else 조건문

       4.1.1  if~else 문의 예제 및 풀이 1

       4.1.2  조건 분기문의 예제 및 풀이 2

   4.2  switch ~ case 조건문

   4.3  for 반복문

   4.4  while 반복문

   4.5  do ~ while 반복문

   4.6  break 명령

   4.7  continue 명령

   4.8  goto 명령

   4장 연습 문제    ( 문제 풀이 동영상 )

5장 배열(array)과 문자열(string)


   5.1  배열의 선언과 초기화

   5.2  배열 예제 및 풀이 #1

   5.3  배열 예제 및 풀이 #2

   5.4  배열의 초기와 2/2

   5.5  C 언어의 문자열

   5장  연습 문제   ( 문제 풀이 동영상 )

6장 포인터 (pointer)

   6.1 포인터 개요

   6.2 포인터 선언과 초기화

   6.3 포인터 연산

   6.4 배열과 포인터

   6.5 문자열과 포인터

   6.6 포인터 사용시 주의할 점

   6.7 동적 메모리 할당  

   6.8 배열의 동적 생성 및 반환

   6장 연습 문제  ( 문제 풀이 동영상 )


7장 함수(function)


   7.  1  함수 개요

   7.  2  사용자 함수의 정의

   7.  3  사용자 함수의 선언

   7.  4  return 명령어

   7.  5  함수의 인자 전달

   7.  6  포인터를 함수의 인자로 넘기기

   7.  7  포인터를 반환하는 함수

   7.  8  배열을 함수의 인자로 넘기는 방법

   7.  9  전역 변수와 지역 변수

   7.10  지역 배열과 전역 배열

   7.11  정적(static) 변수

   7.12  #define 전처리문을 이용한 매크로(macro) 사용

   7.13  표준 함수

       7.13.1  수학 함수의 모음 math.h

       7.13.2  문자열 관련 함수의 모음 string.h

       7.13.3  stdlib.h


   7.14  [C++] 함수 중복(overloading)

   7.15  [C++] 함수의 기본값 인자(default parameter)


   7장 연습 문제    ( 문제 풀이 동영상 )


8장 구조체(struct)

   8.1  구조체 정의

   8.2  구조체 필드의 초기화

   8.3  구조체를 함수의 인자로 넘기기

   8.4  구조체를 필드로 가지는 구조체

   8.5  구조체 배열

   8.6  구조체 포인터 변수

   8장 연습문제

9장 클래스 (class)


   9.1  클래스 선언

   9.2  클래스로부터 객체 생성

   9.3  클래스 멤버의 접근 지정자

   9.4  클래스의 생성자(consturctor)

   9.5  기본 생성자 (default constuctor)

   9.6  소멸자(destructor)

   9.7  생성자와 소멸자의 실행 순서

   9.8  정적(staic) 멤버

   9.9  클래스 예제(아두이노) : Led 클래스

   9,10  클래스 예제(아두이노): Button 클래스

   9.11  인라인(inline) 멤버 함수

   9.12  구조체(struct)와 클래스의 차이점

   9.13  객체의 동적 생성 및 반환

   9.14  객체 배열의 동적 생성 및 반환



'주제별 글목록' 카테고리의 다른 글

심파이(sympy) 강좌 목록  (0) 2015.06.03
파이썬(python) 기초 강좌 목록  (1) 2015.05.23
아두이노 강좌 목차  (3) 2015.05.17
ATmega8(A) 강좌 목록  (1) 2015.05.16
리눅스(Linux) 강좌 목차  (2) 2015.05.16
Posted by 살레시오
,