lecture1_2.0

Download Report

Transcript lecture1_2.0

Network Socket
Programming
Contents



수업 개요
OOP Concept
C++ 개요
수업 개요


Visual C++을 기준으로 강의
참고 교재
 C++ 기초플러스- 성안당
 Visual C++ 완벽가이드- 영진
출판사, 김용성 저
 Visual C++ Programming Bible- 영진 출판사

강의 계획(4주)-일정에 따라 변경될 수 있음





1주:
2주:
3주:
4주:
OOP Concept, C++ 개요
SOCKET API, TCP/IP, MFC Programming Overview
Network 접속, MFC 소켓 클래스, 범용 소켓 소개
예제 서버, 클라이언트 채팅 소스 분석 및 관련 API
Overview
Project: socket을 이용한 응용 프로그램 만들기

chatting program, web-browser, ftp-client, etc.
실습 평가 계획




날짜: 2010년 12월 초/중
시간: 오후 6시 ~ 8시
장소: 공업센터 본관 611호(PC2실) (미정 향후 공고)
평가방법:


프로그램 시연 및 소스코드 설명, 레포트 (분석)
평가기준:

소켓 프로그램의 이해





프로그램의 난이도
프로그램의 기능성
프로그램의 활용성
레포트
제출물:
프로젝트 요약 레포트
 소스 파일

OOP(Object Oriented Programming)

OOP란?
기존의 절차적 프로그래밍 방식에서 벗어나 프로그램을 구성하는 데이터를 다루
기 위해 추상화된 구조인 객체(Class)들을 중심으로 프로그램을 만들고 완성하
는 방식
 OOP의 주요한 특징인 추상화(Abstruct), 캡슐화 (Encapsulation), 데이터 은닉
(Data hiding), 다형성(Polymophism), 연산자 재정의(Overloading), 상속성
(Inheritance)를 통해 코드의 재사용성(reusable code)과 확장성을 크게 높일 수
있음.


절차식 프로그래밍


절차(Procedure)에 중점을 두게 되며, 그 후에 데이터 표현 방법을 찾음
객체 지향 프로그래밍





데이터(객체) 관점에서 데이터의 표현과 사용에 중점
데이터 처리를 위한 사용자 인터페이스 고려
인터페이스 개발 후에 인터페이스와 데이터의 저장 형태 구현
최종적으로 데이터 표현, 인터페이스, 데이터 저장 형태들을 하나로 모음
보다 현실에 가까움
Object Oriented Concept
Key Elements of OO Concept
Object
ENCAPSULATION
Method
Message
Attribute
INHERITANCE
Class
Instance
POLYMORPHISM
Class Hierarchy
Object Oriented Concept





Object
 클래스의 인스턴스로써 속성과 메소드로 구성됨
 실제로 메인 메모리 상에 활당된 상태
class
 사용자 정의 데이터 형으로써 같은 종류의 집단에 속하는 속성과 메소드
로 구성
Attribute
 객체의 내부 상태를 표현하기 위한 것
 유일성을 보장하기 위한 식별자(여러 개 속성 포함)
Message
 객체의 메소드를 사용하는 방법으로써, 객체에 명령을 내리는 수단
 객체간 서로 노출, 받은 메시지를 무시할 수 있음
Method
 메시지를 처리하기 위해 객체에서 내부적으로 정의한 행위
 수행되는 작업은 외부에서 볼 수 없음
OOP(Object Oriented Programming)

What is Object ?
눈에 보이는 사물, 객체, 실체…
 Class가 메인 메모리 상에서 실행중일때 Object라고 함
 속성과 메소드로 구성된다.


예) 고양이 객체



(속성 -> 고양이의 눈 색깔, 털 색깔)
(메소드 -> 달린다, 걷는다)
C와 C++의 프로그래밍 비교
비 고
기본단위
C
절차적(구조적)
함수
기능 (함수) 단위
C++
객체지향
객체 (데이터)
인터페이스(오브젝트)
C와 OOP의 비교(계산기 프로그램)
C
C++
기능(함수)별 구분
-입력 기능
-계산 기능
-출력 기능
각 기능을 함수로 구현
오브젝트별 구분
-Keyboard
-LCD
-CPU
각 오브젝트를 클래스로 구현
Main()
{
Input();
Compute();
Output();
}
Input() {
}
Compute() {
}
Output() {
}
Class Keyboard {
//키보드가 할 일
};
class LCD{
//LCD 가 할 일
};
class CPU{
//CPU 가 할 일 구현
};
C와 OOP의 비교(계속)
메소드
함수
메
소
함수
함수
데이터
메시지
드
객체
메소드
메소드
메
메시지
소
공유 데이터
데이터
드
메시지
메소드
메소드
객체
메
소
데이터
드
메시지
함수
절차지향
메소드
객체지향
객체
Object
[attribute, method]
수강생1
수강생2
객체지향
프로그램
message
강사1
수강생5
수강생3
수강생4
Class = concept?
유사한 특성(행위/구조)을
가지는 일련의 객체들에 대해
그들의 공통적인 구조와 행위를
표현한 개념(Concept)
수강생1
B
A
수강생2
수강생 개념
B
강사1
A
수강생5
강사 개념
수강생3
수강생4
Class

소개
데이터 추상화를 사용자 정의 데이터형으로 바꿀 수 있는 C++
의 도구
 데이터 표현과 처리를 하나의 패키지로 가짐


구성요소

구조체




클래스




연관된 데이터를 일괄적으로 처리하기 위해 사용
변수만을 묶어 정의
자체 멤버 함수가 존재하지 않으므로, 외부함수에 의해 제어
구조체의 확장된 개념
데이터 형식과 그것이 사용되는 방법(함수)을 나타내는 추상적 개념
연관된 변수들과 함수들을 묶어서 캡슐화
캡슐화(Encapsulation)

관련된 변수와 함수를 하나의 틀(Name space)안에 묶는 것
Class

클래스 선언부


Header 파일에 저장(Date.h)
그 클래스에 포함될 멤버 변수와 멤버 함수를 선언
ex) class Date {
int year, month, day;
BOOL valid;
BOOL IsValidDate(int y, int m, int d);
BOOL SetDate(Int y, int m, int d);
void PrintDate();
};

클래스 정의부


보통 cpp 파일에 저장(Date.cpp)
클래스의 속성으로 생성될 객체가 수행할 수 있는 모든 동작
(멤버 함수)들을 정의
ex) BOOL Date::IsValidDate(int y, int m, int d) {
}
Class

인스턴스
 메모리상에
생성된 클래스의 ‘실체’
 만들어 놓은 클래스는 인스턴스를 생성하여 사용
 클래스와 인스턴스의 관계는 데이터형과 변수의 관계
와 같다

ex) int y, z;
Date MyDate, YourDate;
 클래스의 멤버 변수, 멤버 함수 참조
 ex) MyDate.month = 9;
MyDate.SetDate(2007,10,1);
방법
Instance = object?
클래스에 표현된 특성에 임의의 값을
가지고 새롭게 만들어진 객체
수강생2
수강생1
B
A
수강생 개념
B
A
수강생3
강사1
수강생4
수강생5
신규 수강생
C++ 클래스의 캡슐화 -1

클래스의 선언


클래스에 포함될 멤버 함수와 멤버 변수를 선언
확장자가 .h인 헤더 파일에 따로 저장 (point.h)
class Point {
Public:
//멤버 변수
int m_nX;
int m_nY;
//멤버 함수
void Set Position(int nX, int nY);
void Move(int nX, int nY);
void Show();
};
C++ 클래스의 캡슐화 -2

클래스의 구현



클래스의 멤버 함수를 기술
클래스 이름 다음에 ‘::’을 찍고 기술
구 현 한 부 분 은 보 통 확 장 자 가 cpp 인 소 스 파 일 에 저 장
(point.cpp)
Void Point::SetPosition(int nX, int nY)
{ m_nX = nX;
m_nY = nY; }
Void Point::Move(int nX, int nY)
{ m_nX += nX;
m_nY += nY; }
Void Point::Show()
{ cout << “X=“ << m_nX << “Y=“ << m_nY << “\n” }
C++ 클래스의 캡슐화 -3

클래스의 사용
 클래스는
인스턴스를
생성하여 사용
#include "Point.h"
void main()
{
// 인스턴스 생성
Point myPosition, yourPosition;
 인스턴스란
메모리에
생성된 클래스의 실체
// 변수 값 초기화
myPosition.SetPosition(10, 30);
yourPosition.SetPosition(50, 30);
// 좌표 변경 (점의 위치 이동)
myPosition.Move(20, 50);
yourPosition.Move(30, 40);
 int형
변수를 생성하는
것과 같은 방법 사용
// 현재 좌표 출력
myPosition.Show( );
yourPosition.Show( );
}
Data Hiding

지역변수 (자동변수)




전역변수




함수 외부에서 선언
프로그램의 시작시점에서 종료시점까지 메모리상에 존재
어떤 함수에서도 참조 가능
전역변수의 문제점




어떤 함수 내부에서 선언된 변수
그 함수의 실행시간 동안에만 메모리상에 존재
그 함수 내에서만 사용할 수 있음
각기 다른 이름의 변수가 너무 많아진다(변수 추가시 확인 필요)
여러 함수에 의해 접근되므로 어디서 변경될 지 예측 불허
기존 전역변수 값이나 형태 변경 시 결과 예측 불허
정적변수(static)

프로그램 시작시 인스턴스가 생성되어 프로그램 종료시 소멸되나 선언된 함
수 내에서만 참조가 가능
Data Hiding

캡슐화


서로 연관된 데이터를 묶어 분류
캡슐화할 때 외부에서 접근할 필요가 없는 데이터는 감춤
class Date
{
public:
// 모든 사용자가 접근 가능
BOOL SetDate(Int y, int m, int d);
void PrintDate();
protected:
// 이놈을 상속받아 생성한 class, friend로 정의된 class에서 접근 가능
int year, month, day;
BOOL valid;
BOOL IsValidDate(int y, int m, int d);
private:
// 이 클래스의 맴버변수에서 호출될수있고, friend class에는 접근을 허용한다.
CString m_strName;
} //end of "class CTemp“
Class의 멤버 선언시 label이 없으면 default는 private 이다. struct는 label을 정의하지
않으며, 모든 멤버변수, 함수가 public인 class라고 생각해도 무방하다.
Data Hiding

캡슐화


서로 연관된 데이터를 묶어 분류
캡슐화할 때 외부에서 접근할 필요가 없는 데이터는 감춤
class Point
{
Public:
//멤버 함수
void Set Position(int nX, int nY);
void Move(int nX, int nY);
void Show();
Protected:
//멤버 변수
int m_nX;
int m_nY;
};
외부에서 사용
외부에서 안보임
생성자/소멸자

모든 클래스는 생성자 함수와 소멸자 함수를 갖는다


생성자 함수







만일 클래스에 이 두 함수를 명시적으로 만들지 않으면
컴파일러가 자동으로 아무 동작도 하지 않는 함수를 만들어 줌
객체를 생성함과 동시에 객체의 데이터 멤버들을 초기화할 수 있도
록 하는 멤버 함수
클래스 이름과 같은 이름
인스턴스 생성시 자동으로 호출됨
클래스를 위한 메모리 할당과 같은 초기화 루틴을 넣어줌
인자를 넘겨 받을 수 있음
리턴 값은 없음(그러나 void로 선언하지 않음), 가상함수로 정의될
수 없음
소멸자 함수




클래스 이름 앞에 ~가 붙는다
인스턴스 소멸 시 자동으로 호출됨
할당 받았던 메모리를 해제하는 등의 자원 회수 루틴을 넣어준다
인자를 넘겨 받을 수 없음, 리턴 값은 없음
연산자 overloading

연산자를 함수처럼 사용하도록 재정의 하는 것
연산자의 기능을 사용하는 것을 함수를 호출하는 것으로 보고, ++a라는
명령을 a.operator++()이라는 함수의 호출로 받아들임
 여기서 operator는 C++의 키워드로 연산자의 겹지정에 이용

class Counter {
public:
void operator++();
}
void Counter::operator++() {
++count;
}

위와 같이 정의되어 있다면…우리가 ++a라는 code를 사용하면
내 부 적 으 로 는 a.operator++() 이 라 고 호 출 그 러 나 , 직 접
a.operator++()이라는 code를 사용하지는 않음
함수의 overriding

이처럼 기반 클래스에 존재하는 함수를 파생 클
래스에서 같은 원형으로 선언하고, 새로 정의하
여 사용하는 것을 overriding이라 함

1.원형만 같고 동작은 완전히 바꾸는 경우
 이 경우 파생 클래스에서는 기반함수는 완전히 무시되고
새로 overriding된 함수가 동작한다

2.기반 클래스의 함수에 추가적인 기능을 포함시킬 수도 있다
 void NewCounter::Increase() {
<added operations> //추가 동작을 구현
Counter::Increase(); //기반 클래스의 원래함수를 호출
}
함수의 overriding
void Point3D::SetPosition(int nX, int nY, int nZ)
{
m_nX = nX;
m_nY = nY;
m_nZ = nZ;
}
void Point3D::Show()
{
cout << "X=" << m_nX << ", Y=" << m_nY << ", Z=" << m_nZ << "\n";
}
Inheritance

이미 만들어져 있는 클래스의 모든 특성(멤버함수,변수)
을 그대로 계승 받아 새로운 클래스를 만드는 기능

계층 구조(Hierarchy)

Object
동물,식물의
기반 클래스
계층구조 사용의 장점


비슷한 속성을 중복하여 구현하는 일 예방
새로운 클래스를 추가하기 손쉬움
생물의
파생 클래스
어류
삼치

기반 클래스와 파생 클래스


ex) class 삼치 : public 어류 {
//추가적인 속성 구현
};
상어
생물
동물
조류
닭
무생물
식물
포유류
사자
멍멍이
Inheritance

기반 클래스, 파생 클래스
기반 클래스
멤버 함수 A
멤버 함수 B
멤버 변수 1
멤버 변수 2
파생 클래스의 실제 모습
멤버 함수 A
멤버 함수 B
멤버 함수 C
상속
파생 클래스
멤버 변수 1
멤버 함수 C
멤버 변수 2
멤버 변수 3
멤버 변수 3
Inheritance
 기반클래스로부터

상속을 받는 경우
public / private으로 선언
기반클래스
public 으로상속받은
파생클래스
private
private
private 으로 상속받은
private
protected
파생클래스
protected
public
protected
public
기반클래스
private
public
protected
public
외부접근
외부접근
Inheritance
상위 클래스의 특성이 하위 클래스로
전달되는 행위
온전한 하위 클래스의 표현을 보장하기
위한 메커니즘이다
클래스 계층 구조의 형태에 따라
상속 형태가 달라질 수 있다.
수강생
직장인
수강생
학생
수강생
Inheritance
단일 상속
- 하위 클래스는 한 개의 상위 클래스로부터 개념을 상속 받는다
- 계층 구조가 깊어질수록 개념이 중복되는 경우가 발생한다
탈것
- 식별자
- 생산자
- 매체
- 마력
- 연료 용량
- 연료 종류
모터가 있는
탈것
모터가 없는
탈것
- 원동력
- 이륙 거리
- 최대 고도
모터가 있는
비행기
모터가 없는
비행기
- 이륙 거리
- 최대 고도
Inheritance
다중 상속
- 하위 클래스는 여러 상위 클래스로부터 개념을 상속 받는다
- 계층 구조가 깊어져도 개념의 중복은 적으나, 상속된 개념 간의 충돌이 발생할
수 있다.
탈것
- 마력
- 연료 용량
- 연료 종류
- 식별자
- 생산자
- 매체
모터가 있는
탈것
모터가 없는
탈것
모터가 있는
비행기
모터가 없는
비행기
비행기
- 이륙 거리
- 최대 고도
- 원동력
Class의 멤버선언

private/public/protected
 public:
선언된 변수와 함수는 클래스의 내부와 외부
에서 접근하여 사용하도록 열려있음
 private과 protected: 클래스의 내부에서만 사용할 수
있고 외부에는 보이지 않음(즉, 파생클래스가 아닌 경우 외부에
선 차이가 없다)
 Difference


between private & protected
protected로 선언된 기반클래스의 멤버는 파생클래스가 접근
가능
private으로 선언된 기반클래스의 멤버는 파생클래스도 접근
불가
Binding

Binding
 함수를
호출하는 부분에 그 함수가 위치한 메모리 번
지를 연결시키는 일
 정적 binding

컴파일 시 호출될 함수로 점프할 번지가 결정
 동적


binding
컴파일 시 점프할 번지는 남겨 두었다가, 프로그램 실행 시간
에 번지를 결정하여 함수를 실행
단점 : 속도 저하, binding에 필요한 포인터가 함수마다
4Byte씩 낭비
가상 함수(virtual function)

가상함수(virtual)
 동적
바인딩을 사용하는 함수
 Overriding을 가능하게 한다
 기반 클래스의 함수를 파생클래스에서 오버라이딩
하여 사용할 때, 이 오버라이딩 된 함수가 제대로
호출되려면 기반 클래스의 원래 함수는 반드시 가
상함수로 선언되어야 함

기반 클래스의 가상 함수는 상속 받은 파생 클래스에서 재정
의 가능한 함수
 필요에 따라 재정의
inline 함수

inline 함수



번지로 점프해서 실행되지 않음
함수를 호출하는 위치마다 코드가 통째로 복사되어 들어감
장점

프로그램 수행 속도가 빨리짐


단점


함수를 호출하기 위해 메모리 번지를 점프하는 오버헤드 줄임
프로그램의 실행 파일 크기가 커짐
사용 방법


빈번히 호출되는 함수는 inline 함수로 만들어 사용
함수의 크기가 매우 작은 경우에 사용
Note & Q/A

강의 일정





프로젝트 제안서 제출


1주: OOP Concept, C++ 개요
2주: SOCKET API, TCP/IP, MFC Programming Overview
3주: Network 접속, MFC 소켓 클래스, 범용 소켓 소개
4주: 예제 서버, 클라이언트 채팅 소스 분석 및 관련 API
Overview
중간고사기간 이후 공고
프로젝트 최종 보고서 제출 및 최종 결과물 시연 평가

날짜: 2010년 12월 초/중

오후 6시경 컴퓨터실(예정, 차후공고)