본문 바로가기
코스웨어/15년 스마트컨트롤러

20150602 - 22번 윤재희 C #:객체 지향 프로그래밍과 클래스 C++ 타입변환, 캡슐화

by 알 수 없는 사용자 2015. 6. 2.
728x90
반응형

C #:객체 지향 프로그래밍과 클래스

================================ Outline ====================================

전날 복습

객체 지향 프로그래밍과 클래스

코딩을 통한 클래스의 이해 

학점 관리 프로그램 코딩 - 객체지향적

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

 

** 전날 복습

 

- 메소드의 정의

- 매게 변수의 정의

- Swap 메소드를 사용할 때 ‘ref’를 사용하여 참조 값을 전달한다.

- 다수의 반환 값이 발생하는 경우 'out'을 사용하여 처리 한다.

- 메소드 오버로딩의 정의함수의 이름은 동일하나 매개 변수의 숫자나 타입이 다른 경우 이를 다형성을 사용하여 이를 지원하는 기능

- 가변길이의 매개 변수는 'params'라는 코드를 사용하여 호출

- 명명된 매개변수는 인자의 이름을 직접 기입후 값을 넣어주는 것

- 선택적 매개변수는 인자의 기본 값을 초기화를 통해 선언해 준 후 값이 다른 경우만 매개 변수를 직접 넣어주는 것

 

<객체 지향 프로그래밍과 클래스>

 

객체란 무엇일까?

 

- 각 각의 기능을 가진 조각들을 객체라고 할 수 있다프로그래밍적으로 객체란 프로그램에 사용되는 모든 코드를 지칭한다.

 

코드를 사용할 때 일반적인 특성을 추출하여 보편적으로 적용되는 형식으로 만드는 것을 객체화라고 할 수 있다.

 

- 추상화를 통해 실제 객체의 주요 특징만 뽑아 일반화 시키는 능력이 필요하다.

 

- 레고 블록을 예로 들어 블록으로로 집을 만든다고 할 때 이것을 세부화하여 간단히 네모세모동그라미로 나눈 후 이것들을 조합하여 집을 짓는 것이다이처럼 전체 작업을 세부화하여 정형화하고 차후에 정형화된 조각들을 끌어 모아 재사용하는 것이 객체 지향이 추구하는 방법이다.


- 붕어빵을 예로 들면 붕어빵들은 클래쓰붕어빵은 객체

 

- 만들어진 객체(메모리상에 자리를 차지하는 상태)는 instance라고 부르며, 이는 실체라는 뜻이다객체가 실현되어 메모리 상에 올라와 있는 것이 객체가 실현된 상태이다.

 

모든 클래스는 복합 데이터 형식이다기본 데이터 형식을 조합해서 만드는 사용자 정의 데이터 형식.

 

 

<코딩을 통한 클래스의 이해>

 

자동차를 만든다고 가정하고 클래스를 활용한 코딩을 해보자.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20150602_class_concept
{
    class Program
    {
        static void Main(string[] args)
        {
            car sonata = new car();     
            // 'car()'를 객체를 생성해주는 역할을 하는 '생성자라고 부른다.
            sonata.color = "red";
            // C에서의 함수는 실체의 이름없이 그냥 함수의 이름만 넣어주면 가능했지만
            // 메소드는 인스턴스의 값을 넣어주어야 한다.
            sonata.wheel = "4";
            sonata.model = "2015 Limited";
            sonata.drive(k: "100km");


            car tico = new car();
            tico.color = "white";
            tico.wheel = "2";
            tico.model = "rectangle sugar";
            tico.drive(k: "50km");
            tico.brake();

            QM3 n1 = new QM3();     
            //car를 상속받은 'QM3' 상속자는 메소드를 재정의 할 수 있는데 
            //이것을 overriding이라고 한다.
                                    
            
            
        }
    }

    class car               //자동차를 만드는 객체
    {
        // public을 사용하여 외부 접근 허용
        public string color;    
        public string wheel;
        public string model;
        public void drive(string k) 
        {
            this.wheel = k; //만들어질 객체를 지칭할 때 'this'를 사용
        }
        public void brake() { }

    }

    class QM3:car        //class car로부터 상속 받겠다는 표시
    {
        ;
    }
}

** 과정 끝 무렵에 mySQL을 활용한 데이터 베이스에 사용에 대해 배워보도록 하겠다.


생성자와 소멸자 

프로그래머가 명시적으로 생성자를 만들어주지 않을 때 컴파일러가 기본 생성자(default constructor)를 만들어준다생성자는 다형성을 지원하기 때문에 매게 변수의 숫자와 타입에 따라 사용자가 생성자를 만들어 사용할 수 있다.


<객체지향적 코딩 - 학점 관리 프로그램>



 

    class STUDENT           //데이터 저장소의 역할
    {
        
        //이름 국어 영어 수학 필드
        string Name;
        int sKor;
        int sEng;
        int sMath;
        int sum;
        float average;
        char grade;

        /*** 생성자 ***/        
        public STUDENT(/* input */ string sName, int Kor, int Eng, int Math, /* output */ out string Name, out int sKor, out int sEng, out int sMath)
        {
            Name = sName;
            sKor = Kor;
            sEng = Eng;
            sMath = Math;
        }
                
        //총점 메소드

        public void Sum(out int sum)
        {
            sum = sKor+sEng+sMath;
        
        }
      
        //평균 메소드
        public void Average(int sum, out float average)
        {
            average = sum / 3;
            
        }
        //학점 메소드
        public void Grade(float average, out char grade)
        {
            if (average >= 90)
            {
                grade = 'A';
            }
            else if (average >= 80)
            {
                grade = 'B';

            }
            else if (average >= 70)
            {
                grade = 'C';

            }
            else
            {
                grade = 'F';
            }
        }

    }
C++ 타입변환, 캡슐화

 ================================ Outline ====================================

타입 변환

캡슐화

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

C++ p/94 타입 변환

 

C++의 타입 변환은 다양한 모양을 가지고 있다.

 

float A = 3; //묵시적 형 변환, 3이 실수 형태로 저장된다.

float A = (float)3; //명시적 형 변환.

 

 

p/95 예제: Convert1

#include <iostream>
#include <stdio.h>

class Time
{
    private:
        int hour, min, sec;
    public:
        Time()
        {
            ;
        }
        /*explicit*/ Time(int abcsec)   //묵시적 형변환 방지
        {
            hour = abcsec/3600;
            min = (abcsec/60)%60;
            sec = abcsec%60;

        }

        void OutTime()
        {
            printf("현재 시간은 %d:%d:%d 입니다.\n", hour, min, sec);
        }
        void func(Time When)
        {
            When.OutTime();
        }

};


int  main()
{
    //Time now(hi);
    Time now(1234);
    now.func(1321);

    return 0;
}

 



 

변환 생성자는 편의성을 제공하지만 클래스와 일반 타입간의 구분을 모호하게 만들어 버리는 맹점이 있다이에 ‘explicit' 키워드를 사용하면 묵시적 형 변환을 막을 수 있다.

 

변환 환수와 캐스팅에 대해서는 다음에 한다!

 

 

p/107 캡슐화

 

 

정보의 은닉을 목적으로 데이터를 외부에 공개하지 않는 것을 캡슐화라고 한다.

사용법만 알면 작동 원리를 굳이 알 필요가 없다::몰라도 된다또한 사용자가 건들면 프로그램에 손상을 입힐 수 있는 경우도 있다::몰라야 한다.

 

공개해야 할 것 몇몇을 제외하고는 숨기는 것이 일반적이다.

 

특히 변수는 사용자가 임의적으로 접근할 수 없도록 캡슐화한다.

 

** 메모리 주소 값을 이용한 함수가 사용되면 사용자가 메모리로 접근하여 값을 조작할 수 있다.

 

 

p/118 CarObject 예제

#include <iostream>
#include <stdio.h>
#include <algorithm>
//#include <conio_mingw.h>

#define min(A,B) ((A) < (B) ? (A) : (B))    //3항 연산자, if문과 동일
#define max(A,B) ((A) > (B) ? (A) : (B))


class car
{
    int Gear;
    int Angle;
    int Rpm;

    public:
    car()
    {
        Gear =0; Angle=0; Rpm=0;
    }
    void ChangeGear(int aGear)
    {
        if(aGear >= 0 && aGear <= 6)
        {
            Gear = aGear;
        }
    }

    void RotateWheel(int Delta)
    {

        int tAngle = Angle +Delta;
        if(tAngle >= -45 && tAngle <= 45)
            Angle = tAngle;
    }


    void Accel()
    {
        Rpm = min(Rpm + 1003000);
    }
    void Break()
    {
        Rpm = max(Rpm - 5000);
    }

    void Run()
    {
        int Speed;
        char Mes[128];
        //gotoxy(10,12);
        if(Gear == 0)
        {
            puts("먼저 1~6키를 눌러 기어를 넣으시오     ");
            return;
        }
        if(Gear == 6)
        {
            Speed =Rpm/100;
        }
        else
        {
            Speed = Gear * Rpm/100;
        }
        sprintf(Mes, "%d의 속도로 %s쪽 %d도 방향으로 %s진행 중  ",abs(Speed),(Angle >= 0 ?"오른":"왼"), abs(Angle), (Gear == 6 ? "후":"전"));
        puts(Mes);

    }
};

int main(void)
{
    car C;
    int ch;

    while(1)
    {
        //gotoxy(10.10);
        printf("1~5:기어 변속, 6:후진 기어, 0:기어 중립");
        //gotoxy(10,11);
        printf("위:액셀, 아래:브레이크, 좌우:핸들, Q:종료");
        if (kbhit()) ch=getch();
        if(ch == 0xE0 || ch == 0)
        {
            ch = getch();
            switch(ch)
            {
                case 75:
                    C.RotateWheel(-5);
                    break;
                case 77:
                    C.RotateWheel(5);
                    break;
                case 72:
                    C.Accel();
                    break;
                case 80:
                    C.Break();
                    break;
            }
        }
        else
        {
            if (ch >= '0' && ch <= '6')
            {
                C.ChangeGear(ch-'0');
            }
           else if(ch == 'Q' || ch == 'q')
            {
                exit(0);
            }
        }
    C.Run();
    delay(10);
    }

return 0;
}




헤더파일이 없어 안된다!!!!!!!!!!!!!!! 

a.cpp: In function ‘int main()’:

a.cpp:82:19: error: ‘kbhit’ was not declared in this scope

a.cpp:82:31: error: ‘getch’ was not declared in this scope

a.cpp:85:24: error: ‘getch’ was not declared in this scope

a.cpp:114:13: error: ‘delay’ was not declared in this scope

728x90