• 검색 결과가 없습니다.

객체의 개념, 표현, 사용, 구현

N/A
N/A
Protected

Academic year: 2022

Share "객체의 개념, 표현, 사용, 구현"

Copied!
75
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

객체의 개념, 표현, 사용, 구현

[제 2 주]

강 지 훈

jhkang@cnu.ac.kr

(2)

주요 내용

객체란?

객체의 인식

객체의 표현과 사용

(3)

“객체” 란?

(4)

 객체 (Objects)

컴퓨터로 문제를 풀려면?

 문제에 등장하는 여러 대상들이 있다.

 이차 방정식에서는 3 개의 계수들이.

 Factorial 계산에서는 입력 정수 값 N이.

 바로 이러한 대상들을 객체(Object)라고 한다.

 이러한 객체들을 컴퓨터 안에 적절히 표현해야 한다.

 계수들은 3 개의 정수로.

 Factorial 계산에서의 입력값 N은 한 개의 정수로.

성 이름

성명

2차항계수 1차항계수 상수항계수 이차방정식 입력값

Factorial

(5)

 객체 (Objects)

간단한 객체 유형들과 그 속성들

년 월 일 일자 성

이름 성명

성명 주소 전화번호

개인

학번 성적 학생

(6)

 객체 (Objects)

문제가 복잡해지면,

 보다 많은 객체들이 존재하게 되며,

 객체 하나 하나가 많은 속성(attribute)을 갖게 된다.

바퀴 엔진 변속기 트렁크

...

자동차

기통수 배기량 사용연료

...

엔진

(7)

 객체 (Objects)

객체의 속성도 또한 객체일 수도.

 작은 객체가 모여서 더 큰 객체로...

문 바퀴

변속기 트렁크

...

자동차

기통수 배기량 사용연료

...

엔진

(8)

 객체 (Objects)

그러므로, 문제를 풀기 위해서는,

 우리가 파악해야 할 객체가 무엇인지?

 파악된 객체는 컴퓨터 안에 어떻게 효과적으로 표현 (저장) 해야 하는지?

 또한, 그 객체를 가지고 어떤 일(계산)을 해야 하는지?

(9)

 객체 (Objects)

예제: 이차방정식 풀이

이차방정식 풀이

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

x1 = (-b + sqrt(b*b-4.0*a*c)) / (2.0*a) ; x2 = (-b + sqrt(b*b-4.0*a*c)) / (2.0*a) ;

(10)

 객체(object)와 속성(attribute)

이차방정식 문제:

 3 개의 계수는 3 개의 객체?

 3 개의 독립된 객체로 취급될 수도...

 하나의 객체?

 “이차식” 이라는 객체(object)가 있고,

 3 개의 계수는 이 객체의 속성(attribute)들이다.

“2차항 계수”

“1차항 계수”

“상수항 계수”

 이차식: (2차항계수, 1차항계수, 상수항계수)

문제로부터,

“다루어야 할 객체를 인식”하고,

“그 속성을 파악”하는 것이 중요하다.

(11)

 객체와 객체와 직결된 기능

모든 객체는,

 어떤 대상을 표현한다.

 그 표현된 대상과 직결된 할 일이 존재하게 된다.

 예: 이차방정식의 해 구하기

2차항의 계수가 0 인지를 판단한다.

판별식의 값이 0 보다 작은지를 판단한다.

이차방정식의 실근을 근의 공식을 사용하여 계산한다.

그러므로,

“직결된 할 일이 무엇인지”를

파악하는 것이 또한 중요하다.

(12)

 요약

문제를 풀기 위해서는,

 필요한 객체들은?

 각 객체의 속성은?

 각 객체와 직결된 할 일은?

우리는 앞으로 모든 문제를 이와 같은 관점에서 해

결하려고 노력할 것이다!!!

(13)

객체의 인식

(14)

“큰 것으로부터 작은 것을 !”

(15)

 필요한 객체를 인식한다 [1]

 문제 해결에 필요한 객체가 무엇인지?

성명 일자

개인 학생

이차방정식 풀이 자동차

(16)

 필요한 객체를 인식한다 [2]

 문제 해결에 필요한 객체가 무엇인지?

 그 다음, 각 객체에 요구되는 속성은 무엇인지?

일자

이름

성명

성명 주소 전화번호

개인

학번 성적

학생

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

자동차

기통수 배기량 사용연료

...

엔진

(17)

관점을 바꾸어 보자!

“작은 것으로부터 큰 것을 !”

(18)

 서로 밀접한 관련이 있는 것은 모은다 [1]

문제에 필요한 정보들은?

이름

성명 주소 전화번호

학번 성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크

...

기통수 배기량 사용연료

...

엔진

(19)

 서로 밀접한 관련이 있는 것은 모은다 [2]

그들 사이의 관련성은?

이름

성명 주소 전화번호

학번 성적

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

기통수 배기량 사용연료

...

엔진

(20)

 서로 밀접한 관련이 있는 것은 모은다 [3]

모아서 하나의 객체로.

그리고, 모인 것들은 그 객체의 속성으로.

일자

이름

성명

성명 주소 전화번호

개인

학번 성적

학생

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

바퀴

변속기 트렁크 ...

자동차

기통수 배기량 사용연료

...

엔진

(21)

객체와 직결된 할 일은?

(22)

 "이차방정식 문제" 와 직결된 일은?

이차 방정식의 계수 값을 입력 받는다.

이차 방정식의 해를 얻는다.

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

(23)

 요약

문제를 풀기 위해서 필요한 중요한 3 가지:

 필요한 객체들을 인식하자!

 각 객체의 속성들을 인식하자!

 각 객체와 직접 관련되는 일들을 인식하자!

모든 문제를 이와 같은 관점에서!!!

 객체 지향적 (Object-Oriented)으로 해결하려고 노력할 것

이다.

(24)

객체의 표현과 사용

(25)

 문제

학생들의 학번과 성적을 키보드로부터 읽어들인다.

 학번은 크기 10 인 문자열이다.

 학번을 구성하는 문자의 개수가 9개이다.

 성적은 100점 만점의 정수형 점수이다.

 0점부터 100점까지 사이의 정수이다.

학생의 성적이 60점 이상이면 “통과”, 60점 미만이 면 “실패”로 판정한다.

학생 개인마다 학번과 성적과 판정을 출력한다.

(26)

학생정보

 학번 (studentNo): 9개 문자를 저장할 수 있는 문자열

 성적 (score): 정수형

 학점 (grade): 문자

 성적이 60점 이상이면 학점은 ‘P’의 값을, 60점 미만이면 ‘F’의 값을 갖는다.

 필요한 객체는?

studentNo:

score:

grade:

STUDENT: Kim

(27)

 필요한 객체는?

직결된 해야 할 일

 성적 평가

 성적을 판단하여, 통과/실패의 결과를 얻는다.

if (Kim.score >= 60) Kim.grade = ‘P’;

else

Kim.grade = ‘F’ ;

studentNo: “20119999”

score: 87 grade:

STUDENT: Kim

(28)

 필요한 객체는?

직결된 해야 할 일

 성적 평가

 성적을 판단하여, 통과/실패의 결과를 얻는다.

studentNo: “20119999”

score: 87 grade: ‘P’

STUDENT: kim

if (Kim.score >= 60) Kim.grade = ‘P’;

else

Kim.grade = ‘F’ ;

(29)

 객체는 C에서 어떻게 나타낼 수 있을까?

일반 변수를 다시 생각해보자.

 float D;

 변수 D 역시 하나의 객체로 생각할 수 있다.

 그 자료형이 float 이다.

 직결된 연산:

 +, -, *, / 과 같은 사칙연산

 >, <, ==, != 과 같은 비교연산

 이런 연산이 항상 모두 필요한 것은 아니다.

 이러한 연산이 결합된 복잡한 계산일 수도 있다.

판별식의 계산

판별식의 값을 판별

(30)

 일반적인 객체의 표현은?

Kim이라는 학생을 위한 학생정보는?

우리는 이렇게 하고 표현하고 싶다!

STUDENT kim ;

 (cf.) float D ;

kim은 하나의 객체이다. (객체 변수)

 모든 객체는 C에서 변수로 표현하게 된다.

 그 자료형이 STUDENT이다.

studentNo: “20119999”

score: 87 grade: ‘P’

STUDENT: kim

(31)

 객체의 자료형

그렇다면, 자료형 STUDENT는 C에서 어떻게 표현?

 다양한 객체의 형태가 미리 정의되어 존재할 수는 없다.

 int, float, char와 같이 가장 기본적인 것만 미리 존재한다.

 우리가 자료형을 만들어 (정의하여) 사용한다.

 typedef ….. /* 이곳에 객체의 자료형을 표현 */ STUDENT ;

typedef struct {

char studentNo[10] ; int score ;

char grade ;

} STUDENT ;

(32)

 객체의 형태는 구조체로

구조체 (structure) 로 표현

 구조체는 하나의 자료형

 객체의 자료형을 정의한다는 것은 결국

“그 객체의 속성을 나열하는 것”이다.

typedef struct {

char studentNo[10] ; int score ;

char grade ;

} STUDENT ;

(33)

 객체의 자료형은 구조체 자료형으로

구조체에 자료형 이름을 부여하자.

 STUDENT 객체들을 위한 STUDENT 자료형

typedef struct {

char studentNo[10] ; int score ;

char grade ;

} STUDENT ;

(34)

 일반적인 객체는?

그러므로, 다음과 같이 선언된다.

 이제 우리는, STUDENT를 객체의 자료형으로 사용할 수 있다.

typedef struct {

char studentNo[10] ; int score ;

char grade ;

} STUDENT ;

(35)

 Class

객체의 자료형을 “class”라고 한다.

 STUDENT는 “class” 이다.

typedef struct {

char studentNo[10] ; int score ;

char grade ;

} STUDENT ;

(36)

 객체 변수 (Object Variable)

 이제 우리는, 객체 변수를 만들어 사용할 수 있다.

객체 변수 “kim” 은 class가 “STUDENT”이다.

typedef struct {

char studentNo[10] ; int score ;

char grade ; } STUDENT ;

STUDENT Kim ;

studentNo:

score:

grade:

STUDENT: kim

kim

studentNo

score

grade

(37)

 객체의 사용

typedef struct {

char studentNo[10] ; int score ;

char grade ; } STUDENT ;

STUDENT Kim ;

Kim

studentNo

score

grade

(38)

 객체의 사용

typedef struct {

char studentNo[10] ; int score ;

char grade ; } STUDENT ;

STUDENT kim ;

kim

87

studentNo score grade

kim.score = 87 ;

(39)

 객체의 사용

scanf(“%s”,Kim.studentNo) ; typedef struct {

char studentNo[10] ; int score ;

char grade ; } STUDENT ;

STUDENT Kim ; Kim.score = 87 ;

Kim

“20119999”

87

studentNo

score

grade

(40)

 객체의 사용

typedef struct {

char studentNo[10] ; int score ;

char grade ; } STUDENT ;

STUDENT kim ;

kim

“20119999”

87

‘P’

studentNo score grade

if ( kim.score >= 60) kim.grade = ‘P’ ; else

kim.grade = ‘F’ ;

(41)

 요약

객체의 표현: “class”

 C 언어에서는 구조체(struct)를 이용

 구조체는 하나의 자료형

 구조체 안에 객체의 속성들을 표현

 그러므로, 구조체 자료형으로 객체의 자료형 즉 객체의 형 태를 정의

객체의 선언과 사용

 객체도 일반 변수처럼 선언

 객체의 각각의 속성은 일반 변수와 마찬가지로 사용

(42)

실 습

이차방정식 풀기

(43)

[프로그램]

이차방정식 풀기

(Solving Quadratic Equations)

(44)

 입력

이차방정식을 풀 것인지를 묻는다.

 ‘y’ (yes) 또는 ‘n’ (no)를 입력 받는다.

 ‘y’를 입력 받으면, 이차방정식을 푼다

 ‘n’를 입력 받으면, 프로그램을 종료한다.

이차방정식의 3 개의 계수를 차례로 입력 받는다.

 2차항의 계수, 1차항의 계수, 상수항의 계수

 모두 실수로 입력 받는다.

(45)

 출력

 이차방정식

입력 받은 계수들을 다음과 같은 형태로 출력한다.

(2차항의 계수) x*x + (1차항의 계수) x + (상수항의 계수) = 0.0

단, 계수의 값이 0.0 인 항은 출력하지 않는다.

모든 계수가 0 인 경우에는 “0 = 0”을 출력한다.

 판별식의 값

b*b – 4*a*c

 결과

2차항의 계수가 0.0 인 경우의 메시지:

“>이차항의 계수가 0 이어서, 이차방정식이 아닙니다.”

판별식의 값이 음수인 경우의 메시지:

“>판별식의 값이 음수이어서 해가 존재하지 않습니다.”

판별식의 값이 양수인 경우

두 근을 출력한다

(46)

© 2011, J.-H.Kang, CNU

 출력의 예

[실습] 이차방정식 풀기 46

<<<이차방정식 풀이>>>

방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: y 2차항의 계수를 입력하시오: 1.0

1차항의 계수를 입력하시오: 0.0 상수항의 계수를 입력하시오: -1.0

>주어진 방정식: (1.0) x*x + (-1.0) = 0

>판별식의 값: 4.0

>방정식의 해는 다음과 같습니다:

x1 = 1.0 x2 = -1.0

방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: y 2차항의 계수를 입력하시오: 1.0

1차항의 계수를 입력하시오: 1.0 상수항의 계수를 입력하시오: 1.0

>주어진 방정식: (1.0) x*x + (1.0) x + (1.0) = 0

>판별식의 값: -4.0

>판별식의 값이 음수이어서 해가 존재하지 않습니다.

방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: y 2차항의 계수를 입력하시오: 0.0

1차항의 계수를 입력하시오: 1.0 상수항의 계수를 입력하시오: 1.0

>주어진 방정식: (1.0) x + (1.0) = 0

>이차항의 계수가 0 이어서, 이차방정식이 아닙니다.

방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: y 2차항의 계수를 입력하시오: -4.0

1차항의 계수를 입력하시오: 1.0 상수항의 계수를 입력하시오: 0.0

>주어진 방정식: (-4.0) x*x + (1.0) x = 0

>판별식의 값: 1.0

>방정식의 해는 다음과 같습니다:

x1 = 0.0 x2 = 0.25

방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: n

<이차방정식 풀이를 종료합니다>

(47)

 객체의 "사용자적 관점"

궁극적으로는 “구현자적 관점”에서 사용할 모든 객 체는 구현되어야 한다.

 객체의 상세한 형태를 표현해야 한다.

main() 은 객체를 사용하는 곳:

 main()은 “이차방정식 문제” 객체의 사용자

 사용자인 main()의 관점에서, main()은 “이차방정식 문제”

객체의 내용을 속속들이 알아야 할까?

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

판별식의 값

(48)

 객체를 사용하는 관점은?

객체의 내부적인 사항을 속속들이 알고 싶지 않다.

단지 객체가 필요한 정보를 적절히 소유하고 있다 고만 생각하고 싶다.

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

판별식의 값

(49)

 "이차방정식 문제" 객체를 위한 자료형

typedef struct {

QuadEquation equation ; Roots r ;

float determinant ;

} QuadEqProblem ;

이차방정식 문제: QuadEqProblem

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

판별식의 값

“main() 에서는 이 이름만 알고 싶다 !”

객체의 사용자적 관점에서는

객체의 구체적인 속성은 알고 싶지 않다.

(50)

 main()의 개괄적인 구성은?

void main()

{ QuadEqProblem qeProblem ; // 객체 qeProblem 생성 BOOLEAN solvingRequested ;

OutputMsg_startSolvingQuadEquation() ; // 시작 메시지 출력

solvingRequested = isSolvingRequested() ; // 문제 풀이 여부를 묻고 응답을 얻는다.

while ( solvingRequested ) {

이차방정식의 계수를 입력 받는다 ; 이차방정식을 보여준다 ;

if ( 이차항의 계수가 0 이면 ) {

이차항의 계수가 0 이라는 메시지를 출력한다 ; }

else {

판별식의 값을 계산한다 ; if ( 판별식의 값이 음수이면 ) {

판별식의 값이 음수라는 메시지를 출력한다 ; }

else {

이차방정식을 푼다 ;

이차방정식의 해를 출력한다 ; } }

solvingRequested = isSolvingRequested() ; // 문제 풀이 여부를 묻고 응답을 얻는다.

}

OutputMsg_endSolvingQuadEquation() ; // 종료 메시지 출력 }

(51)

 main()에서의 반복 구조

void main()

{ QuadEqProblem qeProblem ; // 객체 생성 BOOLEAN solvingRequested ;

OutputMsg_startSolvingQuadEquation() ;

solvingRequested = isSolvingRequested() ; // 문제 풀이 여부를 묻고 응답을 얻는다.

while ( solvingRequested ) {

이차방정식의 계수를 입력 받는다 ; 이차방정식을 보여준다 ;

if ( 이차항의 계수가 0 이면 ) {

이차항의 계수가 0 이라는 메시지를 출력한다 ; }

else {

판별식의 값을 계산한다 ; if ( 판별식의 값이 음수이면 ) {

판별식의 값이 음수라는 메시지를 출력한다 ; }

else {

이차방정식을 푼다 ;

이차방정식의 해를 출력한다 ; } }

solvingRequested = isSolvingRequested() ; }

OutputMsg_endSolvingQuadEquation() ; }

(52)

 한 개의 방정식을 풀기 위한 과정만!

void main()

{ QuadEqProblem qeProblem ; // 객체 생성 BOOLEAN solvingRequested;

OutputMsg_startSolvingQuadEquation() ; solvingRequested = isSolvingRequested() ; while ( solvingRequested ) {

이차방정식의 계수를 입력 받는다 ; 이차방정식을 보여준다 ;

if ( 이차항의 계수가 0 이면 ) {

이차항의 계수가 0 이라는 메시지를 출력한다 ; }

else {

판별식의 값을 계산한다 ; if ( 판별식의 값이 음수이면 ) {

판별식의 값이 음수라는 메시지를 출력한다 ; }

else {

이차방정식을 푼다 ;

이차방정식의 해를 출력한다 ; } }

solvingRequested = isSolvingRequested() ; }

OutputMsg_endSolvingQuadEquation() ; }

(53)

 이렇게 할 수는 없을까?

void main()

{ QuadEqProblem qeProblem ; // 객체 생성: 문제 풀이 과정에서 필요한 모든 정보를 소유 BOOLEAN solvingRequested ;

QuadEquation eq ;

OutputMsg_startSolvingQuadEquation() ; solvingRequested = isSolvingRequested() ; while ( solvingRequested ) {

eq = inputQuadEquation() ;

QEP_setEquation(qeProblem,eq ) ; // 객체와 부가정보를 제공 QEP_showEquation(qeProblem) ; // 객체만 제공

if ( QEP_secondCoeffcientZero(qeProblem) ) { // 객체만 제공

QEP_outputMsg_secondCoefficientZero(qeProblem) ; // 객체만 제공 } else {

QEP_calcDeterminant(qeProblem) ; // 객체만 제공

if ( QEP_determinantNegative(qeProblem) ) { // 객체만 제공

QEP_outputMsg_DeterminantNegative(qeProblem) ; // 객체만 제공 } else {

QEP_solveEquation(qeProblem) ; // 객체만 제공 QEP_showRoots(qeProblem) ; // 객체만 제공 } }

solvingRequested = isSolvingRequested() ; } OutputMsg_endSolvingQuadEquation() ;

}

원하는 일을 하는 함수에 제공되는 정보는, 단순히 객체 자체,

(그리고 필요에 따라 객체의 속성이 아닌 부가정보)

(54)

 QuadEqProblem과 직결된 함수들은...

void main()

{ QuadEqProblem qeProblem ; // 객체 생성: 문제 풀이 과정에서 필요한 모든 정보를 소유 BOOLEAN solvingRequested ;

OutputMsg_startSolvingQuadEquation() ; solvingRequested = isSolvingRequested() ; while ( solvingRequested ) {

QEP_setEquation(qeProblem, inputQuadEquation()) ; QEP_showEquation(qeProblem) ;

if ( QEP_secondCoeffcientZero(qeProblem) ) {

QEP_outputMsg_secondCoefficientZero(qeProblem) ; }

else {

QEP_calcDeterminant(qeProblem) ;

if ( QEP_determinantNegative(qeProblem) ) {

QEP_outputMsg_determinantNegative(qeProblem) ; }

else {

QEP_solveEquation(qeProblem) ; QEP_showRoots(qeProblem) ; } }

solvingRequested = solvingRequested() ; }

OutputMsg_endSolvingQuadEquation() ; }

이름에 “QEP_”를 붙인 함수는 모두 QuadEqProblem 객체와

직결된 함수들이다.

(55)

 문제점은?

void main()

{ QuadEqProblem qeProblem ; // 객체 생성: 문제 풀이 과정에서 필요한 모든 정보를 소유 BOOLEAN solvingRequested ;

OutputMsg_startSolvingQuadEquation() ; solvingRequested = isSolvingRequested() ; while ( solvingRequested ) {

QEP_setEquation(qeProblem, inputQuadEquation()) ; // qeProblem만 제공해서 될까?

QEP_showEquation(qeProblem) ;

if ( QEP_secondCoeffcientZero(qeProblem) ) {

QEP_outputMsg_secondCoefficientZero(qeProblem) ; }

else {

QEP_calcDeterminant(qeProblem) ; // qeProblem만 제공해서 될까?

if ( QEP_determinantNegative(qeProblem) ) {

QEP_outputMsg_DeterminantNegative(qeProblem) ; }

else {

QEP_solveEquation(qeProblem) ; // qeProblem만 제공해서 될까?

QEP_showRoots(qeProblem) ; } }

solvingRequested = isSolvingRequested() ; }

OutputMsg_endSolvingQuadEquation() ; }

(56)

 이유는?

QEP_setEquation(qeProblem, InputQuadEquation() ) ; QEP_showEquation(qeProblem) ;

if ( QEP_secondCoeffcientZero(qeProblem) ) {

QEP_outputMsg_secondCoefficnetZero(qeProblem) ; } else {

QEP_calcDeterminant(qeProblem) ;

if ( QEP_determinantNegative(qeProblem) ) {

QEP_outputMsg_determinantNegative(qeProblem) ; } else {

QEP_solveEquation(qeProblem) ; QEP_showRoots(qeProblem) ; } }

문제는, 함수에 매개변수로 주어진 것은:

함수 안에서 사용은 당연히 가능

함수 안에서 그 값을 변경하는 것은 “현재로서는” 불가능

 그러나, (C 언어로) 함수 안에서 객체의 속성 값을 변경할 수 있는 방법이 있 다!!!

 우선은 (어쩔 수 없이 당분간, 정말 그러고 싶지는 않지만)

객체의 구체적인 형태를 main()에서 인식하자!

(57)

 "이차방정식" 객체를 위한 자료형

typedef struct { float a ; float b ; float c ;

} QuadEquation ;

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식: QuadEquation

(58)

 "이차방정식의 해" 객체를 위한 자료형

typedef struct { float x1 ; float x2 ;

} Roots ;

x1 (방정식의 해 1) x2 (방정식의 해 2) 방정식의 해: Roots

(59)

 "이차방정식 문제" 객체를 위한 자료형

typedef struct {

QuadEquation equation ; Roots roots ;

float determinant ; } QuadEqProblem ;

이차방정식 문제: QuadEqProblem

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해

판별식의 값

(60)

 main(): "현재로서는 우선" 이렇게

void main()

{ QuadEqProblem qeProblem ; // 객체 생성 BOLEAN solvingRequested ;

OutputMsg_StartSolvingQuadEquation() ; solvingRequested = isSolvingRequested() ; while ( solvingRequested ) {

qeProblem.equation = inputQuadEquation() ; // 어쩔 수 없이 main()에서 객체의 속성 값을 직접 변경 QEP_showEquation(qeProblem) ;

if ( QEP_secondCoeffcientZero(qeProblem) ) {

QEP_outputMsg_secondCoefficientZero(qeProblem) ; }

else {

qeProblem.Determinant = QEP_calcDeterminant(qeProblem) ; // 어쩔 수 없이 main()에서 ...

if ( QEP_determinantNegative(qeProblem) ) {

QEP_outputMsg_determinantNegative(qeProblem) ; }

else {

qeProblem.r = QEP_solveEquation(qeProblem) ; // 어쩔 수 없이 main()에서 ...

QEP_showRoots(qeProblem) ; } }

solvingRequested = solvingRequested() ; }

outputMsg_endSolvingQuadEquation() ; }

(61)

 이제 각 함수들을 구현해 보자

 프로그램의 시작과 종료를 알리는 메시지 출력 함수들

OutputMsg_StartSolvingQuadEquation()

OutputMsg_EndSolvingQuadEquation()

 입력과 관련된 함수들

solvingRequested()

inputQuadEquation()

 Class “QuadEqProblem” 과 직결된 함수들

QEP_showEquation()

QEP_secondCoeffcientZero()

QEP_determinantNegative()

QEP_showRoots()

QEP_calcDeterminant()

QEP_solveEquation()

QEP_outputMsg_SecondCoefficnetZero()

QEP_outputMsg_DeterminantNegative()

(62)

 isSolvingRequested()

 BOOLEAN isSolvingRequested()

이차방정식 풀이를 할 것인지를 묻는 메시지를 출력

getch()를 사용하여 ‘y’ 또는 ‘n’를 입력 받는다.

입력 받은 것이 ‘y’이면 TRUE, ‘y’가 아니면 FALSE를 return 한다.

간단하게 처리하기 위해, ‘y’가 아닌 것은 모두 ‘n’으로 입력된 것으로 간주 하기로 한다.

코드

BOOLEAN isSolvingRequested() { char answer ;

printf(“방정식을 풀려면 ‘y’, 풀이를 종료하려면 ‘n’을 치시오: “) ; answer = getch() ;

if ( answer == ‘y’) return TRUE ; else

return FALSE ;

}

// 간단하게 이렇게도

return ( answer == ‘y’ ) ;

(63)

 계수를 입력 받아서, 이차방정식 객체를 만든다

 QuadEuqation inputQuadEquation()

계수를 입력 받아서, 이차방정식 객체를 만들어 돌려준다.

예:

QuadEqProblem qeProblem ; // 객체 생성 ...

qeProblem.equation = inputQuadEquation() ; // inputQuadEquation() 가 계수를 입력 받아서 // 만들어 돌려준 QuadEquation 자료형의 객체를, // 객체 qeProblem 에 집어넣는다.

(64)

 InputQuadEquation()의 구현 코드

QuadEuqation inputQuadEquation()

{

QuadEquatiuon quadEq ;

printf(“2차항의 계수를 입력하시오: “) ; scanf(“%f”, &(quadEq.a)) ;

printf(“1차항의 계수를 입력하시오: “) ; scanf(“%f”, &(quadEq.b)) ;

printf(“상수항의 계수를 입력하시오: “) ; scanf(%f”, &(quadEq.c)) ;

return quadEq ; }

(65)

 QuadEqProblem 과 직결된 일을 함수로!

 객체의 상태를 보여주는 것들

QEP_showEquation()

QEP_secondCoeffcientZero()

QEP_determinantNegative()

QEP_showRoots()

 객체의 속성을 가지고 계산하는 것들

QEP_calcDeterminant()

QEP_solveEquation()

 메시지 출력

QEP_outputMsg_secondCoefficientZero()

QEP_outputMsg_determinantNegative

()

QuadEqProblem 과 직결된 함수들:

QuadEqProblem의

“member function” 이라고 한다.

이차방정식 문제

a (2차항의 계수) b (1차항의 계수) c (상수항의 계수)

이차방정식

x1 (방정식의 해 1) x2 (방정식의 해 2)

방정식의 해 판별식의 값

(66)

 이차방정식을 보여준다.

void QEP_showEquation(QuadEqProblem qeP)

 이차방정식을 다음과 같은 형태로 보여준다:

 “(2차항의 계수) x*x + (1차항의 계수) x + (상수항의 계수) = 0”

 단, 계수의 값이 0 인 항은 보이지 않게 한다.

모든 계수가 0 이면, “0 = 0”을 출력한다.

// 실수 x 가 0 인지 검사하려면?

float x ;

scanf (“%f”, &x) ;

if ( x == 0.0 ) // 이렇게? 절대로 안됨!!!

---

if ( abs(x) < 0.000001 ) // 반드시 이렇게!

(67)

 QEP_showEquation()의 코드

void QEP_showEquation(QuadEqProblem qeP) { BOOLEAN nonZeroTermExist = FALSE ;

if ( abs(qeP.equation.a ) > 0.000001 ) { nonZeroTermExist = TRUE ;

printf(“(%f) x*x”, qeP.equation.a) ; } if ( abs(qeP.equation.b ) > 0.000001 ) { if ( nonZeroTermExist )

printf(“ + “) ;

nonZeroTermExist = TRUE ; printf(“(%f) x”, qeP.equation.b) ; } if ( abs(qeP.equation.c ) > 0.000001 ) { if ( nonZeroTermExist )

printf(“ + “) ;

nonZeroTermExist = TRUE ; printf(“(%f)”, qeP.equation.c) ; } if ( ! nonZeroTermExist )

printf (“0”) printf(“ = 0”) ;

(68)

 판별식의 값을 보여준다.

void QEP_showDeterminant(QuadEqProblem qeP)

 판별식의 값을 다음과 같이 보여준다: (값이 4.0 인 경우)

 “>판별식의 값: 4.0”

(69)

 방정식의 해를 보여준다

void QEP_showRoots(QuadEqProblem qeP)

(70)

 판별식을 계산한다.

float QEP_calcDeterminant(QuadEqProblem qeP)

 주어진 이차방정식 문제에 대해, 이차방정식의 판별식 값 을 계산한다.

 사용 예:

QuadEqProblem qeProblem ; // 객체 생성 ...

qeProblem.determinant = QEP_calcDeterminant(qeProblem) ; // calcDeterminant() 가 계산해 준 판별식의 값을

// 객체 qeProblem에 집어넣는다.

(71)

 방정식의 해를 구한다

Roots QEP_solveEquation(QuadEqProblem qeP)

 주어진 문제 qeP에 대해, 이차방정식의 해를 구한다.

 결과는 해(Roots) 객체로 만들어 돌려준다.

 사용 예:

QuadEqProblem qeProblem ; // 객체 생성 ...

qeProblem.r = QEO_solveEquation(qeProblem) ;

(72)

 QEP_SolveEquation()의 구현 코드

Roots QEP_solveEquation(QuadEqProblem qeP) {

Roots roots ; float sqrtD ;

sqrtD = sqrt(qeP.determinant) ;

r.x1 = (-qeP.equation.b + sqrtD) / (2.0 * qeP.equation.a) ; r.x2 = (-qeP.equation.b - sqrtD) / (2.0 * qeP.equation.a) ; return roots ;

}

(73)

 요약

객체 (Object) 와 클래스 (class)

 클래스는 객체의 자료형으로,

 속성과 멤버함수로 구성된다.

(객체의 자료형인) Class의 구성 요소

 속성 (attribute)

 멤버 함수 (member function)

(74)

[제 2 주] 끝

객체는,

소프트웨어 개발에서의

핵심 개념 !!

(75)

참조

관련 문서

질의와 객체의 색인(특징)이 유사하면 유사한 객체.. 특징 feature: 작고, 매체 식별하고,

문자열 출력함수 • Status DrawStringconst WCHAR *string, INT length, cont Font *font, const PointF &origin, const Brush *brush • Status DrawStringconst WCHAR *string,

 시스템내의 객체, 객체사이의 관계, 그리고 객체의 각 클래스의 특 징을 나타내는 속성이나 조작을 표시함에 의하여 시스템의 정적구조 를

제3절 재무정보의 질적 특성과 회계기준.. 재무정보가 정보로서 유용하기 위해 지녀야 하는 일반적인 속성. 정보는 서술현상의 이해에 필요한 모든 정보를 포함하여

변속기가 있는 회전 모터, 스프링, 단일 충격의 조합으로부터 생성된 모터가 스프링을 감아서 에너지를 축적하고 이 축적된 에너지를 한번에 못에 전달한다...

 ms가 소유하고 있는 객체의 마방짂 차수가 유효하면 TRUE, 아니면 FALSE를 얻는다..

 Class는 스스로 객체 생성 방법을 가지고 있어야 한다... 더 이상

 평균 이상의 학생 수와 평균 이하의 학생수를 얻 어내어 출력한다..  학생들의