반응형

1. 클래스의 기초(클래스 = 하나의 꾸러미), 클래스의 전신은 구조체

변수 -> 배열 -> 구조체 -> 클래스
결국 여러개의 데이타를 하나로 묶는 자료구조

구조체는 변수들을 하나로 묶는 자료구조였다.
그러나, 클래스는 변수뿐만이아니라 함수또한 같이 묶을수 있는 자료구조다.
구조체는 저장하기위한 목적이였지만
클래스는 저장과 처리 이 두가지를 할 수 있다. 즉, 하나의 작은 프로그램이 된다.
구조체는 보안성이 없지만
클래스는 보안성이 있다.(딱 막아놓고 필요한애들만 접근 가능)

클래스 -> 객체..
객체들이 모이면 프로그램이 된다.

즉, 클래스는 하나의 프로그램의 단위명세서라 할 수 있다.

-------------------------------
구조체 :

struct 태그명 {
     :
   변수들
     :
};
-------------------------------
class :

class 태그명 {
      :
  변수들       - 속성
  함수들       - method
      :
};     (객체)
class 태그명 변수;
-------------------------------

public : 접근가능
private : 접근불가

class는 public이나 private를 빼고 선언하게 되면 기본으로 private로 선언이 되며
외부에서는 사용이 금지된다. 그러한 보안성을 갖고 있다.

클래스로 하나로 묶기때문에 캡슐화가 가능해지며
private로 접근을 통제하기 때문에 보안성이 생긴다.

private로 접근을 할 수 있게 해주는 역할을 가진것이
바로 method다.

class CMEM
{
   private: // 이러한 명시를 해주지 않으면 기본적으로 private로 명시된다.
            // private로 명시가 되면 외부에서 접근이 불가능해진다.
       char name[30]; // 멤버변수 : 클래스 안에 있는 변수
       int age;
  
   public:  // public으로 명시해줘야만 외부에서 접근이 가능해진다.
       void setVar(char *n, int a) { // 멤버함수 : 클래스 안에 있는 함수
       strcpy(name, n);
       age = a;
 }
 void prn() {
  cout << "이름 : " << name << ", 나이 : " << age << endl;
 }

   
※ c++ 의 구조체는 클래스와 동일하다.
   단, 차이점이 있다면 구조체는 기본값이 public인 반면 클래스는 private다.
       예제에서는 이해를 돕기위해 c언어에서의 구조체를 얘기한다.

※ 예제에서는 private에는 변수를 넣고 public에는 함수만 넣는다 이렇게
   오해할 수 있지만 사실은 누구나 접근 가능한것에는 public으로 해줘도 무관하다.


2. 상수멤버함수

c++에서 상수라는 말이 나오면 무조건 const다.

이 멤버함수에서는 어떤한 변경을 할 수 없고 그저 읽거나 출력만 할 수 있다.
이렇게 하는 이유는
이 멤버함수가 가진 기능만을 제대로 동작할 수 있도록 하는 일종의
안정장치라고 할 수 있다.

class .... {
   void func() const {
             :
}

이렇게 상수멤버함수로 만들게되면 변경할 수가 없다. 특별한 기능이
있다기보다 이렇게 변경을 하지 못하게 함으로써 프로그래밍을 더
안전하게 할 수 있는 안전장치 역할을 하게 된다.

void write() const {
  year = 2009;// 상수멤버함수로 선언해줌으로써 변수를 바꿀수 없게됐다.
  set(); // 값을 변경할 수 있는 즉 일반멤버함수 조차도 호출할 수 없다.
 // 상수멤버함수는 상수멤버함수만 호출할 수 있다.
  cout << "Title : " << title << endl;
  cout << "Year  : " << year << endl;
 }

3. 클래스의 간결화 : 클래스를 간결하게 만드는것

클래스
 선언  ->  정의  -> 실행

클래스를 선언만 하고 정의에 실제 기능들을 포함시킨뒤 그 기능을 쓸때는 정의에서 불러오는식으로
해서 클래스를 간결하게 할 수 있다.

코드형식 : void Master::set(char *t = "디폴트", int y=2000) {

Master의 함수라는것을 알수있게
반드시 Master::set() 이렇게 명시를 해줘야만 한다.(Master는 class에게 부여한 임시명칭)

클래스 안에 있는 멤버함수는 기본적으로 inline 함수가 된다.
그래서 웬만하면 길게 소스를 작성하면 안된다.
그러나 클래스의 간결화로 함수를 밖으로 빼내었을 경우
자동적으로 inline 함수가 되지 않음으로
함수 앞에 inline 이라고 명시를 해줘야만 한다.

반응형
반응형

1. 출력
    (1) cout : 기본적인 출력 객체
         1) cout << 3.12345678 << end;
            이런 소스를 작성하였을때, 기본정밀도는 소수점을 포함하여 6자리이기
            때문에 결과는 3.12346(마지막자리 반올림) 가 된다.
         2) setiosflags(ios::fixed)  : 소수점을 6자리로 고정
             cout << setiosflags(ios::fixed) << 3.12345678 << endl;
             출력은 3.123457
         3) setprecision(개수) : 원하는 소수점 개수를 출력할 수 있다.
             cout << setprecision(10) << 3.123456789 << endl;
         4) setiosflags(ios::showpoint); : 소수점 셋째자리까지 표현, 빈칸은 0으로
             cout << setiosflags(ios::showpoint);
         5) resetiosflags(ios::showpos | ios::right); : 만약 showpos, right를 설정해
             주었다면 그것을 모두 해제 시킨다.

    (2) cin : 기본적인 입력 객체
         1) cin >> name;  : 출력과 화살표의 방향이 반대 방향이다.
         2) cin은 문자열을 입력받을 경우 공백 입력시 끝으로 입력하는 약점이 있다.
             입력 : Han Dong Sun      출력 : Han
         3) cin.get() : 문자열 전문 입력 메소드. cin의 약점인 공백까지 잘 입력받는다.
             But, 고질문제가 있었으니 그것은 엔터키에 의한 버퍼문제다.
         4) cin.ignore() : cin.get()에서 문제가 생겼을때 그 자리에 추가시켜주면 문제를 해결해준다.
         5) cin.getline() : 이것역시 문자열 입력 전문 메소드로써 cin.ignore를 사용하지 않아도 된다.


2. 함수
    (1) 함수의 인자전달 방식
         1) 값에 의한 전달(Call by value)
         2) 주소에 의한 전달(Call by address)
         3) 참조에 의한 전달(Call by reference)

인자전달방식에는 이 세가지가 있는데 C언어에는 값에의한전달과 주소에의한전달
이 두가지가 있다.  C++에서 추가된것이 참조에의한전달이다. 소스코드를 보며
이해를 돕겠다.


합 구하기 Call by address
#include <iostream.h>
void hap(int, int, int, int *);

int main(void)
{
 int i=2, j=3, k=4, sum=0;
 cout << "변수의 합..." << endl;
 hap(i,j,k, &sum);
 cout << "결과 : " << sum << endl;

 return 0;
}
void hap(int a, int b, int c, int *s) {
 *s = a + b + c;
}
주소에 의해 값을 전달하는 것을 보면
sum의 주소를 넘겨주고
hap함수에서 s(sum의 값)를 연산한다.

합 구하기 Call by reference
#include <iostream.h>
void hap(int, int, int, int &);

int main(void)
{
 int i=2, j=3, k=4, sum=0;
 cout << "변수의 합..." << endl;
 hap(i,j,k, sum);
 cout << "결과 : " << sum << endl;

 return 0;
}
void hap(int a, int b, int c, int &s) {
 s = a + b + c;
}
이 소스를 쉽게말하면 sum에 s라는 별칭을 하나 줘서
간단하게 연산을 끝낼 수 있다.

가장 큰 차이점을 말하자면
주소에 의한 전달은 주소를 받아 값을 넘기고 하는 복잡한
연산과정이 있지만 참조에 의한 전달방식은 그러한 과정을
생략하여 간단하기도 하며 속도도 빠를 수 있는 장점을 갖게된다.



3. Default Argument : 매개변수에 기본값을 설정하는것
    (1) 선언
         1) void proc(int i=0, char ch='a')            
         2) proc(5) 이렇게 함수의 매개변수를 넘겨주더라도 ch값이 a로 기본적으로 설정된다.
         3) 주의점 : 일부분만 매개변수를 채울시 선언시의 매개변수 설정을 끝부터 채워줘야한다.


4. 함수의 OverLoading(중복정의)
    (1) 개념
       
똑같은 이름의 함수를 여러개 만들수 있다. 똑같은 이름의 함수를 만들 수 있으나 매개변수의 갯수,
         형식, 위치라던지의 구분을 둬야한다.
         1) 예

               void a(int i) {
               }
               void a(int i, int j) {
               }
               void a(int i, double b) {
               }
               ※ 주의할점 : 비슷한 기능을 같은 이름으로 묶어야만 편리하게 쓸수있다.


5. C코드 호출
    (1) 개념
          예전 c언어에서 사용하던 함수들을 업그레이드 하거나 컨버팅 하기 위해 사용한다.
         1) 예
               extern "C" int comp(char *, char *); // 선언
               extern "C" { // 이렇게 정의해주고
                   int comp(char *a, char *b) { // 이렇게 안에 c언어에서 쓰던 명령어들을
                   return strcmp(a,b);  // 써줌으로써 이 명령어들을 사용할 수 있다.
                   }
               }


6.inline 함수 :  내부적으로 처리하는 함수
    (1) 목적
         1)
함수를 빠르게 호출하기 위해
         2) 함수를 안전하게 쓰기 위해서(매크로 함수의 부작용을 만회하기 위해)
    (2) 개념
         함수의 내용을 메인함수에 그대로 복사해와서 처리할때 내부적으로 처리하는 함수
         내용들을 미리 복사해 놓았기때문에 속도가 빠를수밖에 없다.

     인라인함수는 짧을수록 좋다.(일반적으로 10줄정도) 왜냐하면 그대로 모두 복사해서
     사용하는것이기 때문에 함수의 길이가 너무 길게되면 오히려 배보다 배꼽이 더 커지게
     되어 속도가 더 느려질 수 있다.

     "반복문"이나 "재귀함수"일 경우 인라인함수가 무효가 되버린다.
     (=#defin(매크로함수) 실행되기전에 미리 복사되어 사용, 인라인함수와 비슷하다)

     가정하면
     int main() {
         a() {
         }
     } 이런 형태라고 보면 된다.

    쓰는방법 :
     inline void a(){ // 보통 쓰는 함수에서 inline만 붙인 형태다.
              .
              .
     }

반응형

+ Recent posts