'프로그래밍/c++'에 해당되는 글 19건

  1. 2013.06.23 c++ 상속(Inheritance)
  2. 2013.06.21 c++ static
  3. 2013.06.20 c++ const
  4. 2013.06.19 c++ 복사생성자
  5. 2013.06.19 c++ 클래스(class) 3
  6. 2013.06.17 c++ 클래스(class) 2
  7. 2013.06.16 c++ 클래스(class) 1
  8. 2013.06.13 c++ 레퍼런스(Reference)
  9. 2013.06.12 c++ 네임스페이스(namespace)
  10. 2013.06.12 c++ 매크로 함수, 인라인(inline) 함수



●상속

- 다른 클래스의 멤버를 해당 클래스의 멤버로 포함시키는 것이다.


- 상속되는 클래스를 부모클래스,super클래스,base클래스라고 하고 상속받는 클래스를 자식클래스,sub클래스,derived클래스라고 한다.


- sub클래스 객체를 생성하면 super클래스의 생성자도 같이 생성된다.


ex)






- super클래스의 멤버초기화는 멤버변수가 public이면 직접 접근 가능하지만 private로 선언되었으면 아래처럼 멤버 이니셜라이저로 초기화 한다.











●protected 멤버

- protected 멤버는 private멤버와 같다. 다만 상속관계에서는 public와 같다.


ex)









●상속을 사용하는 이유

- 각각의 클래스에 중복되는 부분이 많을 경우, 공통되는 부분을 super클래스로 추상화하고, 이를 상속하면 클래스를 정의하는데 수월해진다.











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

c++ 상속(Inheritance)  (0) 2013.06.23
c++ static  (0) 2013.06.21
c++ const  (0) 2013.06.20
c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
Posted by -현's-

댓글을 달아 주세요

c++ static

프로그래밍/c++ 2013. 6. 21. 20:12



●static 멤버

- main함수가 호출되기 전에 메모리 공간에 올라가서 초기화된다. public으로 선언되면 객체 생성전에도 접근 가능하다.


- static 멤버는 객체의 멤버로 존재하지 않는다.


- static 멤버함수,변수는 클래스 함수, 클래스 변수라고도 표현한다.


ex)











●static 사용 이유

- static 함수,변수는 전역변수,함수와 비슷하다.


- 예를 들어 어떤 전역 변수를 특정 클래스에서만 사용해야 하는데 전역 변수이기 때문에 다른 곳에서 접근될 위험이 있다. 이 전역 변수를 특정 클래스내에서만 접근 하도록 하면 프로그램이 좀더 안정적으로 될것이다.


- 전역 변수,전역 함수는 기본적으로 절차지향 프로그래밍에서 사용되고 객체지향에서는 사용되지 않는다. 전역 변수,전역 함수 대신 static변수, 함수를 선언해서 사용한다.








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

c++ 상속(Inheritance)  (0) 2013.06.23
c++ static  (0) 2013.06.21
c++ const  (0) 2013.06.20
c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
Posted by -현's-

댓글을 달아 주세요

c++ const

프로그래밍/c++ 2013. 6. 20. 21:43



●const 쓰임

- 변수 선언 앞에 붙어서 변수를 상수화 한다.

ex)

const int a=10;

a=5;   //컴파일 오류


- 포인터가 가리키는 데이터를 상수화 한다.

ex)

int n=10;

const int* pN=&n;

*pN=20;   //컴파일 어류


- 포인터 선언할때 이름 앞에 붙어서 포인터 자체를 상수화 한다.(포인터가 가리키는 대상이 고정됨

ex)

int a=10;

int b=20;

int *const pA=&a;

pA=&b;  //컴파일 오류









●상수화된 멤버변수의 초기화

- 객체를 생성하면 멤버 변수가 초기화된다. 상수화된 멤버변수도 처음에 쓰레기값으로 초기화된다. const로 선언되었기 때문에 일반적인 방법으로는 이 값을 사용자가 원하는 값으로 변경할 수 없다. 이때 '멤버 이니셜라이저'라는 문법을 이용하면 const 멤버변수를 초기화 할 수 있다.


- 함수 뒤에 ' :상수명(인자명), 상수명(인자명) ' 을 써주면 된다. (멤버 변수 '상수명'을 '인자명'으로 초기화 하라)


ex)









●const 맴베 함수

- 멤버 함수에 const를 선언하면 멤버 함수를 상수화하겠다는 뜻이다.


- 멤버 변수가 상수화되면, 이 함수를 통해서 멤버 변수의 값이 변경되지 않는다.


- 상수화된 멤버 함수는 상수화되지 않은 함수의 호출을 허용하지 않는다.


- 상수화된 멤버 함수는 멤버 변수의 포인터를 리턴하는 것을 허용하지 않는다.



ex)












●const 객체

- 객체를 const로 선언하면 객체 생성과 동시에 상수화한다.


- 객체가 상수화 되면 멤버 변수의 조작은 불가능하고, 상수화된 멤베 함수만 호출 가능하다.


- 일반 멤버 함수는 멤버 변수를 조작하지 않더라도 호출 불가능하다.


ex)

const Abc abc;    //const 클래스명 객체명;










●const로 선언한 멤버 함수의 오버로딩

- const로 선언한 멤버 함수도 오버로딩 가능하다.


- 예를 들어 'void function(){}' 와 void function() const {}'는 다른 함수로 본다.


ex)












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

c++ 상속(Inheritance)  (0) 2013.06.23
c++ static  (0) 2013.06.21
c++ const  (0) 2013.06.20
c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
Posted by -현's-

댓글을 달아 주세요



●복사생성자

 - 자기 자신과 같은 형태(자료형)의 객체(자신의 클래스로 생성된 클래스)를 인자로 받는 생성자이다.


- 형태는 아래와 같이 '클래스(const 클래스& 객체명){~~}' 이다. 반드시 '&'를 사용해서 레퍼런스로 인자를 받아야 한다. const는 전달된 인자의 내용을 변경하지 못하도록 한다.


ex)











●디폴트 복사 생성자

- 디폴트 생성자를 별도로 생성하지 않았을 경우 디폴트 복사생성자가 자동으로 생긴다.


- 디폴트 복사 생성자는 멤버 변수 대 멤버 변수의 복사를 수행한다.


ex)








●깊은 복사

- 예를 들어 문자열을 복사할 경우, 실제로 문자열 변수에 저장되는 값은 문자열의 주소이다. 따라서 복사생성자에서 문자열의 값이 아니라, 주소값을 복사하게 된다.이를 막기 위해 직접 복사생성자를 정의해야한다. 이를 깊은 복사라고 한다.


- 생성자 내에서 메모리 공간을 동적 할당한다면, 깊은 복사를 하는 복사생성자를 정의해야 한다.


ex)









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

c++ static  (0) 2013.06.21
c++ const  (0) 2013.06.20
c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
c++ 클래스(class) 1  (0) 2013.06.16
Posted by -현's-

댓글을 달아 주세요



●객체 배열

- 말 그대로 객체를 배열의 형태로 선언한 것이다. 

ex)







●객체 포인터 배열

- 객체를 가리키는 포인터로 구성되있는 배열이다. 저자이 대상이 객체이면 객체배열, 객체의 주소이면 객체포인터배열을 사용한다.

ex)








●this 포인터

- 자기 자신 객체를 가리킨다.

ex)







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

c++ const  (0) 2013.06.20
c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
c++ 클래스(class) 1  (0) 2013.06.16
c++ 레퍼런스(Reference)  (0) 2013.06.13
Posted by -현's-

댓글을 달아 주세요



●정보은닉

- 객체 외부에서 객체 내의 멤버변수에 직접 접근하는 것을 허용하지 않고 객체 내의 변수는 private로 선언하고 여기에 접근하는 멤버함수를 public로 선언하는 기법을 정보은닉이라고 한다.


- 아래 코드에서처럼 멤버변수는 private로 선언하고 private로 선언한 변수에 접근하는 멤버함수를 선언한다.


- 일반적으로 멤버변수에 데이터를 입력하는 함수는 setter함수, 데이터를 가져오는 함수를 getter함수라고 한다.

ex)









●캡슐화

- 연관있는 데이터와 함수를 하나의 클래스로 만드는 것이다.


- 사용,수정,삭제 등 유지보수의 편의를 위해 하나의 클래스로 만든다.


- 개념은 간단하지만 캡슐화를 잘 하려면 많은 경험과 객체지향에 대한 이해,공부가 필요하다.







●생성자

- 객체 생성과 동시에 초기화하게 해준다.


- c++의 경우 아래와 같이 멤버를 초기화 할 수 없다.(java,c#은 가능)




- 생성자는 함수이고, 클래스와 같은 이름을 가지고, 리턴 타입을 선언하지 않는다.

ex)








- 매개변수가 있는 생성자

ex)





- 생성자를 정의 하지 않았을 경우 디폴트 생성자가 자동으로 생성된다.


- 생성자도 함수이므로 오버로딩이 가능하고 디폴트 매개 변수 설정도 가능하다.


- 프로그래머가 정의해 놓은 생성자가 하나라도 있으면 디폴트 생성자는 자동으로 삽입되지 않는다.










●소멸자

- 소멸자는 함수이다.


- 클래스의 이름과 동일하고 앞에 '~'가 붙는다.


- 리턴하지 않고 리턴타입을 선언하지 않는다.


- 매개변수를 받을 수 없다.


- 오버로딩 불가능하고 디폴트 매개변수 선언도 불가능하다.


- 생성자에서 메모리 동적 할당을 할 경우, 이를 해제하기 위해 반드시 소멸자를 정의해야한다.


- 메모리 동적 할당되지 않으면 반드시 사용할 필요는 없다.


- 소멸자를 정의하지 않으면 디폴트 소멸자가 생성된다.







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

c++ 복사생성자  (0) 2013.06.19
c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
c++ 클래스(class) 1  (0) 2013.06.16
c++ 레퍼런스(Reference)  (0) 2013.06.13
c++ 네임스페이스(namespace)  (0) 2013.06.12
Posted by -현's-

댓글을 달아 주세요


●클래스=멤버 변수 + 멤벼함수





●클래스를 이용해서 만든 변수를 객체(Object)라고 한다. 객체를 만드는 것을 객체화 또는 인스턴스화라고 표현한다.






●접근 제어

- public - 클래스 외부에서도 접근 가능하다. 

- private - 클래스 내부에서만 접근 가능하다. 클래스 내부에서 따로 접근 제어를 선언하지 않으면 default로 private으로 인식한다.

ex)

calss Abc{

private:

    int a;

public:

    setter(int k){

            a = k;

      }

};






●일반적으로 클래스를 만들때 클래스, 변수, 함수 선언은 헤더파일에 하고 멤버 함수 정의는 cpp파일에 구현한다.

ex)

Abc.h

#include<iostream>

class Abc{

void a();

void b();

};


Abc.cpp

#include "Abc.h"

void Abc::a(){
~~
}

void Abc::b(){

~~

}







●클래스는 마지막 '}'뒤에 반드시 ';'를 붙여줘야한다

ex)

class Abc{


~~~~~


};


















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

c++ 클래스(class) 3  (0) 2013.06.19
c++ 클래스(class) 2  (0) 2013.06.17
c++ 클래스(class) 1  (0) 2013.06.16
c++ 레퍼런스(Reference)  (0) 2013.06.13
c++ 네임스페이스(namespace)  (0) 2013.06.12
c++ 매크로 함수, 인라인(inline) 함수  (0) 2013.06.12
Posted by -현's-

댓글을 달아 주세요


●레퍼런스(Reference)

- 'int &a' 처럼 &를 사용해서 변수를 생성는 것이 레퍼런스이다.('&'는 사용되는 위치에 따라 주소값을 반환 할수도 있고 레퍼런스를 선언할때 사용할 수도 있다.)


- 변수는 메모리 공간에 할당된 이름을 의미한다. 레퍼런스는 이름 있는 메모리 공간에 하나의 이름을 더 붙여주는 것이다.


- 레퍼런스와 변수는 생성되는 방법만 다르고 일단 생성되고 나면 동일한 것이다.


- 아래 두 함수는 동일한 의미를 지닌다

ex)

int function()

{

     int a;

     int &b=a;

     return a;

}


int function()

{

     int a;

     int &b=a;

     return b;

}







●레퍼런스 선언

- 변수는 새로운 메모리 공간에 이름을 부여하지만 레퍼런스는 반드시 이미 이름을 지니고 있는 메모리 공간에 레퍼런스 이름을 부여해야한다.


- 따라서 레퍼런스값에는 상수가 올 수 없고 변수 이름이 와야한다.


- 레퍼런스는 선언과 동시에 반드시 초기화되어야 한다.


ex)

int a=10; 


int &b=10  (x)   //레퍼런스는 상수값으로 초기화 할 수 없다.


int &c=a   (o)


int &d;      (x)   //레퍼런스는 선언과 동시에 초기화 해야한다.








●레퍼런스 call by reference

- 함수 내에서 외부에 존재하는 변수에 직접 접근을 하기 위해 reference를 사용한다.

ex)








- 함수의 인자를 레퍼런스로 받고 있다. val1, val2 메모리 공간에 레퍼런스로 선언한 a,b가 메모리 이름으로 붙게 된다. 













●간혹 실수로 레퍼런스의 값을 변경해서 원본 값 변경될 때가 있다. 이것을 방지하기 위해 레퍼런스 선언 앞에 'const'를 붙여줘서 레퍼런스를 상수화 해준다. 그러면 레퍼런스 값 변경을 통해서 데이터가 조작되지 않는다. 만약 실수로 조작하는 코드가 삽압되면 에러 메시지가 발생한다. 











●지역변수는 레퍼런스로 리턴해선 안된다. 함수가 끝나면 지역변수도 사라져 버리기 때문이다.


ex) reference를 잘못 사용한 예제


#include <iostream>


int& function()

{

int a=16;

return a;

}


int main(void)

{

int &ref=function();

std::cout<<ref<<std::endl;

getchar();

return 0;

}







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

c++ 클래스(class) 2  (0) 2013.06.17
c++ 클래스(class) 1  (0) 2013.06.16
c++ 레퍼런스(Reference)  (0) 2013.06.13
c++ 네임스페이스(namespace)  (0) 2013.06.12
c++ 매크로 함수, 인라인(inline) 함수  (0) 2013.06.12
c++ 디폴트 매개 변수  (0) 2013.06.12
Posted by -현's-

댓글을 달아 주세요


●namespace

- 특정영역를 지정하고 이름을 붙여준 것이다.

- 서로 다른 부분에서 똑같은 함수 이름이 선언되어서 에러가 나는 것을 막아준다.










●using

- namespace안의 함수를 사용할때마다 namespace::function 을 쓰면 불편하다.

- using을 사용해서 namespace를 선언하면 일일히 namespace:: 를 쓰지않아도 된다.
















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

c++ 클래스(class) 1  (0) 2013.06.16
c++ 레퍼런스(Reference)  (0) 2013.06.13
c++ 네임스페이스(namespace)  (0) 2013.06.12
c++ 매크로 함수, 인라인(inline) 함수  (0) 2013.06.12
c++ 디폴트 매개 변수  (0) 2013.06.12
c++ 함수 오버로딩  (0) 2013.06.11
Posted by -현's-

댓글을 달아 주세요


●매크로 함수

- 함수 호출 문장이 함수 몸체 부분으로 치환된다.

- 전처리기에서 처리하기 때문에 속도가 빠르다.

- 복잡한 연산보다는 간단한 연산을 사용할 때 좋다.

ex)

#define AAA(x, y)  ((x)*(y))











●inline 함수

- 일반적인 함수를 정의하는 과정에서 앞에 'inline'를 붙여주면 된다.

- inline함수는 컴파일러에 의해 처리된다.

- 호출 스택을 생략해서 속도가 빨라지지만, 코드가 길어질 경우 속도가 느려질 수도 있다.

- 컴파일러에 따라 inline이 성능 향상에 해가 된다고 판단하면 inline을 무시하고 일반적인 처리를 할 수도 있다.










Posted by -현's-

댓글을 달아 주세요