8. 객체와 클래스 (기본)
차례 객체지향 프로그래밍 시작을 위해 객체지향 프로그래밍 객체지향의 특징
객체지향 프로그래밍 시작을 위해 순차적 프로그래밍 구조적 프로그래밍 객체지향 프로그래밍 문제를 하향식으로 여러 개의 기능으로 나누어 구현 함수 객체지향 프로그래밍 사람의 실 세계를 컴퓨터 프로그래밍으로 옮겨놓은 형태로 추상적 개념이 있고, 실체화된 객체가 프로그램 실행을 담당한다.
객체지향 프로그래밍 문제 분석의 포커스 문제를 “누가 무엇으로 어떻게 하는가”의 질문에 맞춰 대답할 수 있어야 함 누가 실제 문제를 풀어나가는 주체 : 객체 무엇 객체 연산에 필요한 자료 : 멤버 변수 어떻게 객체 연산 : 멤버 함수
객체와 클래스 객체와 클래스 클래스란 실체인 객체를 만들기 위한 틀!! 클래스 : 추상적 개념체 객체 : 프로그램의 동작 주체인 실체 클래스란 실체인 객체를 만들기 위한 틀!! 클래스 객체 사람 나, 내친구, 옆집아줌마 컵 내가 사용하는 컵, 갑돌이의 컵 자동차 건물 앞에 세워진 자동차, 내 자동차 운동화 내 친구의 하얀색 운동화
클래스 정의 1 프로그램 코드에서의 작성 순서 설계에서의 작성 순서 클래스 클래스 정의 객체 생성 문제 분석 객체 식별 클래스 정의 클래스 멤버변수 : 상태, 처리 대상 등의 정보 멤버함수 : 자료 처리 등의 동작을 수행
클래스 정의 2 클래스 선언 class 클래스이름 { 클래스 멤버; //멤버 변수와 멤버 함수 }; 문제 : “하나의 정수를 변수에 저장하고 해당 변수를 화면에 출력하는 프로그램”을 객체지향 프로그래밍으로 작성하기 누가 값을 저장하고 출력하는 객체 무엇을 정수 값 어떻게 화면에 출력하기 class IntSample //클래스 이름 { void ShowScore(); //출력 함수 int Score; //정수 저장할 변수 };
클래스 정의 3 클래스 멤버 함수 정의 멤버 함수 정의에서 동일 클래스의 멤버 변수는 직접 접근하여 참조 가능함 자료형 클래스이름::멤버함수(매개변수) { 함수 내용; } void IntSample :: ShowScore( ) { cout << “점수 : “ << Score << endl; //Score는 IntSample 멤버변수이므로 별도의 선언 없이 사용 가능함 }
클래스 정의 4 선언된 클래스를 통해 객체 생성 생성된 객체는 클래스에 정의된 멤버 변수와 멤버 함수를 참조 변수는 “선언한다” 값을 저장하는 공간 객체는 “생성한다” 동작하는 실체
코딩으로 살펴본 클래스와 객체 일반 자료형 구조체 클래스 정의 형태 이미 정의되어 있음 사용자가 구조체형을 정의 사용자가 클래스를 정의 내용 int, float, double, char 등 여러 자료형 멤버를 포함할 수 있음 여러 자료형 멤버 + 여러 기능을 갖는 함수 사용 형태 자료형의 변수를 선언 자료형 변수이름; 예) int a; 정의한 구조체형 변수 선언 구조체형 변수이름; 예) typedef struct { char name[30]; int age; } PERSON; PERSON b; 정의한 클래스의 객체 생성 클래스이름 객체이름; class SamClass …………. }; SamClass obj; 비고 변수 하나에 하나의 자료 저장 하나의 변수에 각 멤버 별로 자료 저장 자료를 저장할 수 있는 변수와 기능을 수행하는 함수가 포함됨
멤버 접근 속성 클래스 멤버의 접근 속성 클래스 멤버 참조 연산자 private : 기본 접근 속성, 같은 클래스 멤버 내에서만 접근 허용 protected : 클래스 상속에서 사용됨 public : 모든 위치에서 접근 허용 클래스 멤버 참조 연산자 점(.)
#include <iostream> using namespace std; class IntSample { void ShowScore(); int Score; }; void IntSample::ShowScore() { cout << "점수: " << Score << endl; } int main() IntSample Obj; //객체 생성 Obj.Score=100; //객체 Obj의 멤버 변수 Score에 값 할당하기 에러 Obj.ShowScore(); //객체 Obj의 멤버 함수 ShowScore() 호출하기 에러 return 0; 멤버 접근속성을 명시하지 않으면 private로 간주됨!!!! 클래스 선언 클래스 멤버 함수 정의 ShowScore( ) 멤버 함수는 Score와 동일한 IntSample 클래스의 멤버이므로 멤버 변수를 직접 참조 가능함!! main( ) 함수는 IntSample 클래스 내가 아닌 클래스 밖이므로 해당 멤버에 직접 참조할 수 없음!!! 에러 메시지 : error C2248: 'IntSample::Score': private 멤버('IntSample' 클래스에서 선언)에 액세스할 수 없습니다. error C2248: 'IntSample::ShowScore': private 멤버('IntSample' 클래스에서 선언)에 액세스할 수 없습니다.
일반적으로 정의되는 형태:멤버 접근 속성 기본 멤버 접근 속성이 private인 이유 생성된 객체 정보는 접근 권한이 있는 경우에만 참조케 함을 목적으로 함 보안성 고려 private 멤버는 public 멤버 함수를 통해 접근토록 클래스를 설계함 직접적 접근 허용 방지 일반적으로 멤버 변수는 private, 멤버 함수는 public으로 하며, 클래스 선언에서 멤버 접근 속성이 public protected private 순으로 코딩
#include <iostream> using namespace std; class IntSample { public : void ShowScore(); void setScore(const int s); int getScore(); private : int Score; }; void IntSample::ShowScore() cout << "점수: " << Score << endl; } void IntSample::setScore(const int s) Score=s; int IntSample::getScore() { return Score; } int main() IntSample Obj; Obj.setScore(100); cout << "점수: " << Obj.getScore() << endl; return 0;
프로그램 코딩에서 클래스 선언은 헤더 파일, 정의는 소스 파일 객체 생성 및 테스트는 main( ) 함수에서 실행 //IntSample.h #ifndef _INTSAMPLE_H_ #define _INTSAMPLE_H_ #include <iostream> using namespace std; class IntSample { public : void ShowScore(); void setScore(const int s); int getScore(); private : int Score; }; #else #endif //IntSample.cpp #include "IntSample.h" void IntSample::ShowScore() { cout << "점수: " << Score << endl; } void IntSample::setScore(const int s) Score=s; int IntSample::getScore() return Score; //IntSample_main.cpp #include "IntSample.h" int main() { IntSample Obj; Obj.setScore(100); cout << "점수: " << Obj.getScore() << endl; return 0; }
실습 1 문제 : 키와 몸무게를 입력받아 표준 몸무게를 계산하여 “저체중”, “정상체중”, “과체중”인가를 표시하자. 문제를 “누가 무엇을 가지고 어떻게 동작하는가”의 시각으로 바라보자. 먼저 생성될 객체의 작업 대상인 “무엇”을 식별해 보자. 작업 대상이 되는 항목은 키와 몸무게 이다. 그리고 어떻게 동작하는가는 먼저 키와 몸무게를 외부에서 동작하는 객체에 전달받을 수 있어야 하고, 키를 이용해서 표준 몸무게를 계산할 수 있어야 한다. 또한 표준 몸무게와 전달받은 몸무게를 비교하여 체중의 상태를 판단해서 객체 밖으로 전달할 수 있어야 한다. 멤버 변수 키 : 소수점 이하 자리를 다룰 수 있도록 배정도형으로 하자. 몸무게 : 소수점 이하 자리를 다룰 수 있도록 배정도형으로 하자. 체중 상태 : 체중 상태는 표준 몸무게 계산 후 일정한 처리에 의해 산출되는 정보로써 표준 몸무게 자체를 멤버 변수로 해도 된다. 그러나 이번에는 체중 상태를 멤버 변수로 하겠다. -1은 저체중을, 0은 정상체중, 1은 과체중으로 표시하자. double height, weight; int WeightStatus;
멤버 변수 키 : 소수점 이하 자리를 다룰 수 있도록 배정도형으로 하자. 몸무게 : 소수점 이하 자리를 다룰 수 있도록 배정도형으로 하자. 체중 상태 : 체중 상태는 표준 몸무게 계산 후 일정한 처리에 의해 산출되는 정보로써 표준 몸무게 자체를 멤버 변수로 해도 된다. 그러나 이번에는 체중 상태를 멤버 변수로 하겠다. -1은 저체중을, 0은 정상체중, 1은 과체중으로 표시하자. 멤버 함수 키를 외부에서 객체로 전달하는 기능 : 매개변수로 키 값을 전달받음 몸무게를 외부에서 객체로 전달하는 기능 : 매개변수로 몸무게를 전달받음 키를 객체 외부로 전달하는 기능 : 함수의 반환값으로 외부에 전달함 몸무게를 객체 외부로 전달하는 기능 : 함수의 반환값으로 외부에 전달함 표준 몸무게 산출해서 체중 상태를 구하는 기능 체중 상태를 객체 외부로 전달하는 기능 : 함수의 반환값으로 외부에 전달함 void setHeight(const double h); void setWeight(const double w); double getHeight(); double getWeight(); int StdWeight(); int getWeightStatus();
실습 2 문제 : 다음은 수업에 등록한 학생을 관리하는 클래스이다. 주어진 상황에 맞게 클래스를 선언, 정의해서 테스트 해보자. 출력 형태 : 과정명 입력 : C++ 프로그램 수강학생 이름 입력 : 이름 : 박진영 계속입력하시겠습니까? (y/n) y 이름 : 김동현 이름 : 김소연 이름 : 김창민 이름 : 황청자 계속입력하시겠습니까? (y/n) n 수강학생 명단 : 박진영 김동현 김소연 김창민 황청자 총 수강학생 수 : 5명
누가 수업에 등록한 학생 관리 객체 무엇을 과정명, 수업에 등록한 학생 명단, 수업에 등록한 총 학생 수 어떻게 과정명을 외부에서 전달받아 저장, 수강생 이름을 외부에서 전달받아 수강생 목록에 저장, 수강생 목록에 총 수 계산, 수강생 목록을 외부에 전달하기, 총 수강생 수를 외부에 전달하기 클래스 이름 : Course 멤버 변수 과정명 수강학생 명단 총 수강학생 수 멤버 함수 과정명을 객체 내부로 전달하는 함수 한 명의 수강학생 이름을 객체 내부로 전달하는 함수 수강학생 이름 전체를 객체 외부로 전달하는 함수 총 수강학생 수를 객체 외부로 전달하는 함수 소스 8-4 (ch08_course.h) 소스 8-5 (ch08_course.cpp) 소스 8-6 (ch08_02.cpp)
객체지향의 특징 추상화 (Abstraction) 캡슐화 (Encapsulation) 상속 (Inheritance) 다형성 (Polymorphism)