객체 지향 프로그래밍의 4가지 특징

  • 추상화
  • 캡슐화
  • 상속
  • 다형성

추상화

[실생활]
사물의 공통성, 본질을 모아 추출하여 파악하는 것

[프로그래밍]
객체의 공통적인 속성과 기능을 추출하여 정의하는 것
- 속성은 클래스 내에 필드(변수)로 정의 됨
- 기능은 클래스 내에서 메소드(함수)로 정의 됨


캡슐화

연관 있는 속성과 기능들을 하나의 캡슐로 만들어 내부의 데이터들을 외부로 부터 보호하는 것

  • 데이터 보호
    - 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉
    - 내부의 동작을 감추고 외부에는 필요한 부분만 노출

상속

부모 클래스에 정의된 속성(변수) 및 기능(메서드)들을 자식 클래스에서 상속받아 사용하는 것


다형성

같은 대상이라도 문맥이나 상황에 따라 다르게 사용될 수 있다는 원리

[ex.1]

같은 글자인데도 문맥에 따라 서로 다르게 해석됨

  • 내일 배를 타고 제주도에 갈 것이다.
  • 진평이는 배가 아파서 학교에 못 갔다.
  • 어머니께서 맛있는 배를 깎아 주셨다.

다형성 2

상위(부모) 클래스로 하위(자식)클래스의 인스턴스를 생성할 수 있다.

[ex.2]

스케치북에 도형을 그렸다.

  • 여기서 도형은 삼각형이 될 수도, 사각형이 될 수도, 원이 될 수도 있다.
  • 도형과 같이 넓은 범위의 개게는 작음 범위의 것들로 대체 될 수 있다.


클래스 상속

상속 문법

class Person{

}

calss Student: publoc Person{
// 여기서 Person 클래스를 Student 클래스가 상속 받음
}

Person 클래스에 있는 멤버 (변수, 메도스)를 student클래스에서 사용할 수 있게된다.

접근제어자 - protected

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)

오버로딩이란?

  • 같은 이름의 메소드를 중복하여 정의하는 것을 의미
  • 매개변수의 유형과 개수가 달라도 된다.

오버라이딩과 오버로딩의 차이

오버라이딩:
매개변수의 개수, 타입, 함수명 등이 완전히 같은 메소드를 덮어쓰는 것.

오버로딩:
함수의 이름만 같고 원형이 완전히 같지 않은 것.



마무리!!

오버라이딩과 오버 로딩에 대한 차이를 대학을 졸업하고 이제서야 명확하게 알게 된 것 같아 그동안의 행실을 돌아보게 되었다..

한 번씩 부트 캠프 수업을 들으면서 내가 수료하였을 때 얻어 가는 게 있을까 하는 걱정에 휩싸이는 때가 요즘 많아지고 있는데, 이렇게 나의 부족한 점을 직관적으로 확인하게 될 때 마음에 안정감이 한 번씩 찾아온다.

새로운 지식을 얻게 되고 그로 인해 마음의 안정까지 찾아온다니!

앞으로도 나에게 부족한 점을 좀 더 사실적으로 깨달을 수 있는 상황이 계속해서 찾아오고 많이 찾아올 수 있도록 그리고 시간을 할애하는 만큼 얻어 가는 것이 최대한 많도록 부지런히 노력해야겠다고 생각하였다!

끝!!

profile
스마트팩토리 개발자가 되기 위한 □□ !!

0개의 댓글