객체 지향 프로그래밍의 4가지 특징
[실생활]
사물의 공통성, 본질을 모아 추출하여 파악하는 것
[프로그래밍]
객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 속성은 클래스 내에 필드(변수)로 정의 됨
- 기능은 클래스 내에서 메소드(함수)로 정의 됨
연관 있는 속성과 기능들을 하나의 캡슐로 만들어 내부의 데이터들을 외부로 부터 보호하는 것
부모 클래스에 정의된 속성(변수) 및 기능(메서드)들을 자식 클래스에서 상속받아 사용하는 것
같은 대상이라도 문맥이나 상황에 따라 다르게 사용될 수 있다는 원리
[ex.1]
같은 글자인데도 문맥에 따라 서로 다르게 해석됨
상위(부모) 클래스로 하위(자식)클래스의 인스턴스를 생성할 수 있다.
[ex.2]
스케치북에 도형을 그렸다.
클래스 상속
class Person{
}
calss Student: publoc Person{
// 여기서 Person 클래스를 Student 클래스가 상속 받음
}
Person 클래스에 있는 멤버 (변수, 메도스)를 student클래스에서 사용할 수 있게된다.
class Person{
protected:
string name;
int age;
}
class Student: public Person{
public:
void test(){
name="홍길동";
}
}
Protected를 사용해 자식클래스에선 접근 가능하게 해줌
실습
(1) Shape라는 클래스를 만들어주세요. 이 클래스는 아래 조건을 만족해야 합니다.
조건 1. 변의 개수, 밑변의 길이를 저장하는 변수를 가지고 있어야 합니다
조건 2. 변의 개수와 밑변의 길이를 출력하는 printInfo() 함수를 가지고 있어야 합니다.
(2) Shape 클래스를 상속 받는 Rectangle, Triangle 클래스를 만들어주세요. 이클래스들은 아래 조건을 만족해야 합니다.
조건1. Rectangle 클래스에는 세로 길이를 의미하는 변수를 가지고 있어야 합니다.
조건2. Triangle 클래스에는 높이 길이를 의미하는 변수를 가지고 있어야 합니다.
조건3. 두 클래스에는 각각 도형의 넓이를 구하고 출력하는 area() 함수를 가지고 있어야 합니다.
조건4. 두 클래스 모두 생성자에서 모든 변수에 값을 대입해주세요. (변, 밑변도 대입)
(3) 메인 함수에서 Triangle과 Rectangle 클래스를 통해 각각 인스턴스를 만들고area() 함수를 실행시키도록 만들어주세요.
#include <iostream>
using namespace std;
// a = 변의개수
// b = 밑변의 길이
// c = 세로 길이
// d = 높이
class Shape {
protected:
int a;
double b;
public:
void printlnfo() {
cout<<"변의 개수: " << a << "개 " << b << "cm \n";
}
};
//사각형 넓이
class Rectangle : public Shape{
double c;
public:
Rectangle(double b, double c) {
this->a = 4;
this->b = b;
this->c = c;
}
double area() {
return b * c;
}
};
//삼각형 넓이
class Triangle : public Shape {
double d;
public:
Triangle(double b, double d) {
this->a = 3;
this->b = b;
this->d = d;
}
double area() {
return double((b * d)/2);
}
};
int main() {
int a;
double b, c, d;
// 사용자로부터 width, height 입력 받음
cout << "변의 개수: ";
cin >> a;
if(a==4){
cout << "사각형의 밑변 길이: ";
cin >> b;
cout << "사각형의 세로 길이: ";
cin >> c;
// 객체 생성
Rectangle rect(b, c);
// 사각형의 넓이 출력
cout << "사각형의 넓이: " << rect.area() << endl;
rect.printlnfo();
}
else if(a==3){
cout << "삼각형의 밑변 길이: ";
cin >> b;
cout << "삼각형의 높이: ";
cin >> d;
Triangle tri(b, d);
// 삼각형의 넓이 출력
cout << "삼각형의 넓이: " << tri.area() << endl;
tri.printlnfo();
}
else {
cout << "변의 개수 잘 못 입력";
}
}
오버라이딩(overriding)
상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 다시 정의하는 것
매개변수의 "유형"과 "개수"가 완전히 같은 메소드를 재정의 하는 것!
class Person{
public:
void sleep() {cout << "잠자기" << endl;}
};
class Student: public Person{
public:
//오버라이딩
void sleep() {cout << "잠자기 오버라이딩" << endl;}
};
class Person {
protected:
string name;
public:
Person() {}
string get_name() {
return name;
}
void print() {
cout << "Person print \n";
}
};
class Student : public Person { // 기본값 private
string stu_id;
public:
Student() : Person() {}
void print() {
cout << "Student print \n";
}
//print를 오버라이딩시 부모클래스의 나머지 메소드는 그대로 사용
using Person::print;
};
int main() {
Student s2;
s2.print(); //자식클래스에 있는 메소드가 우선 실행
return 0;
}
실습
(1) Student 라는 클래스 제작
조건 1. 이름, 학교, 나이, 학번을 의미하는 변수를 가져야한다.
조건 2. 모든 변수의 값은 하위클래스에서 할당된다.
조건 3. lunch 이라는 메소드 만들고, “점심은 학식” 출력
(2) Student 클래스를 상속받는 Kim 클래스와 Baek 클래스 만들기
(3) Kim 클래스와 Baek 클래스 내의 변수 값 다양하게 넣기
(4) lunch 오버라이딩.
-> Kim 클래스에서는 “점심은 김가네 김밥” 출력
-> Baek 클래스에서는 “점심은 백종원 피자” 출력
class Student {
protected:
string name;
string school;
string stu_id;
int age;
public:
void lunch() {
cout << "점심은 학쉭~~ \n";
}
};
class Sin : public Student {
public:
Sin() {
this->school = "떡잎유치원";
this->stu_id = "190119";
this->age = 5;
}
void lunch(string name) {
cout << "이름: " << name << endl << "학교: " << school << endl
<< "학번: " << stu_id << endl << "나이: " << age << endl << "점심은 피자스쿨!! \n";
}
};
class Kim : public Student {
public:
Kim() {
this->school = "떡잎유치원";
this->stu_id = "191019";
this->age = 5;
}
void lunch(string name) {
cout << "이름: " << name << endl << "학교: " << school << endl << "학번: "<< stu_id << endl << "나이: " << age << endl << "점심은 도시락!! \n";
}
};
int main() {
string name;
Sin a;
Kim k;
cout << "이름 입력: ";
cin >> name;
if (name == "김철수") {
k.lunch(name);
}
else if (name == "신짱구") {
a.lunch(name);
}
}
오버로딩 (overroading)
오버라이딩:
매개변수의 개수, 타입, 함수명 등이 완전히 같은 메소드를 덮어쓰는 것.
오버로딩:
함수의 이름만 같고 원형이 완전히 같지 않은 것.
마무리!!
오버라이딩과 오버 로딩에 대한 차이를 대학을 졸업하고 이제서야 명확하게 알게 된 것 같아 그동안의 행실을 돌아보게 되었다..
한 번씩 부트 캠프 수업을 들으면서 내가 수료하였을 때 얻어 가는 게 있을까 하는 걱정에 휩싸이는 때가 요즘 많아지고 있는데, 이렇게 나의 부족한 점을 직관적으로 확인하게 될 때 마음에 안정감이 한 번씩 찾아온다.
새로운 지식을 얻게 되고 그로 인해 마음의 안정까지 찾아온다니!
앞으로도 나에게 부족한 점을 좀 더 사실적으로 깨달을 수 있는 상황이 계속해서 찾아오고 많이 찾아올 수 있도록 그리고 시간을 할애하는 만큼 얻어 가는 것이 최대한 많도록 부지런히 노력해야겠다고 생각하였다!
끝!!