본문 바로가기
공부

C++ OOP 조사

by MY블로그 2022. 11. 15.
C++ ) OOP / Object Oriented Programming / 객체지향 / 

C++을 공부하면서 객체지향의 진도까지 진행이 되었다.

현재까지의 수업과정은 대부분 C스타일의 절차지향(흐름의순서대로진행)의 느낌이었다면

각종 함수들이 복합적으로 상호작용할수 있는것이 객체지향 이다.

객체지향을 OOP라고 부르며 Object Oriented Programming 의 약자이다.

오늘의 고제는 이에대한 조사이다.

 

오늘은 기본적으로 알아두어야할 객체지향 언어의 5가지 특성에 대하여 조사 한다.

우선 각특성들을 알아보기전 OOP의 장단점을 알아보자.

 

장점

- 코드의 사용과 변경이 유용하기때문에 공동작업이나 대규모 개발 작업에 유용하다.

- 클래스(class)단위가 있기 때문에 상속, 확장, 모듈화를 통하여 타인의 코드를 쉽게 사용하거나 변경이가능하여

  효율적인 업무 분담이 가능하다.

- 복잡한 코드를 단순화 하므로 코드의 가독성이 높아진다.

- 코드를 하나하나 찾아서 수정하지않더라도 클래스(class)의 특정 부분만을 수정하여 작업이 쉽다.

 

단점

- 절차지향과 달리 처리속도가 상대적으로 느려질 수 있다.

- 객체가 많아지면 저장 공간을 많이 차지하게 된다.

자동차를 예시로한 이해를 돕기위한 이미지. 출처 : https://velog.io/@nayeon/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOPObject-Oriented-Programming

 

객체지향 언어의 5가지 특성
캡슐화 / 정보은닉 / 추상화 / 상속성 / 다형성
캡슐화 (Encapsulation)

- 캡슐화란 데이터와 데이터를 처리하는 함수를 마치 캡슐처럼 하나의 묶음으로 구성시킨것을 의미한다.

 

- 캡슐화된 객체의 세부 내용이 외부에 노출되지않을수있으며(은폐), 변경이 발생할 때 오류의 파급 효과가 적다고 한다.

  (ex.공동작업이나 유사한코드가 있을경우 잘못해서 수정되지않도록 보호할수있다.)

 

- 캡슐화된 객체들은 재사용이 편리하다.

 

- 객체들 간의 메시지를 주고 받을 때 각 객체의 세부 내용을 따로 복잡하게 구성할 필요가없으므로

  코드자체가 간결해지며 객체간의 결합도가 낮아진다.

 

Methods(=함수)  Variables(=변수) 로 이해하자.

이해하기 쉽도록 이미지를 참조하였다. https://velog.io/@nayeon/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOPObject-Oriented-Programming

 

정보은닉(Information Hiding)

- 캡슐화에서 가장 중요한 개념이다. 다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통하여 접근이 허용된다.

  (ex.정보은닉을통하여 함수내에서만 수정이가능하고 이외의 곳에서는 노출되지않게된다)

 

- 각 객체의 수정이 다른 객체에게 주는 영향을 최소화 하는 기술이다.

  (ex. 함수내에서만 수정가능하며 외부에서 수정이불가능하기떄문에 유사한코드나 공동작업시 오류를방지한다)

 

- 외부 객체가 특정 객체의 데이터와 함수를 직접 접근하여 사용하거나 변경하지 못하므로 유지보수와 소프트웨어의 확장    작업시 오류를 최소화 시킬수 있다.

 

아래의 코드는 당일 수업내용의 일부이다. 일반 구조체 struct는 기본적으로 public 이며

이와 반대로 class는 기본적으로 private 로 접근이 제한 된다.

struct Card //기본 접근 제한자 : public
{
public: //public 선언시 아래구역은 전부 공개 구역이다.
    int num;
   
    void Print()
    {
    }

private: //private 선언시 이지점부터 아래쪽은 비공개 구역이다.
    string shape;
};

class Card2 //기본 접근 제한자 : private
{
private:    
    string shape;

    void Print()
    {
    }

public:
    int num;
};

int main()
{
    Card    card1;
    Card2   card2;
    card1.num;
    //card1.shape;
    card2.num;
    //card2.shape;
	return 0;
}

 

추상화(Abstraction)

- 추상화는 불필요한 부분을 생략하며 객체의 속성 중 가장 중요한 것에 중점을 두어 개략화를 하는것이다.

 

- 시스템을 구축하기전 그와 유사한 모델을 만들어 여러가지 요인들을 미리 테스트 할 수 있다.

 (어떻게 해야할지 가아닌 무엇을 하면 되는지에 초점을 맞춘 과정을 추출(abstraction) 이라고 한다.)

 

- 최소의 비용으로 실제 상황에 대처할 수 있고, 시스템의 구조 및 구성을 가시적 으로 볼 수 있다.

 

 

추상화의 이해를 돕기위한 이미지. 출처 : https://velog.io/@nayeon/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-OOPObject-Oriented-Programming

 

 

상속성(Inheritance)

- 상속성이란 이미 정의된 상위 클래스(ex.부모 클래스)의 모든 속성과 연산을 하위 클래스가 고스란히 받는것.

  (ex. 유산 상속처럼 물려받는 느낌)

 

- 상속성을 이용할경우 하위 클래스는 상위 클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의 하지 않고서

  즉시 자신의 속성으로 사용할 수 있다. (따로 코드구성을 하지않고 그대로 재사용한다)

 

- 하위 클래스는 상위 클래스로부터 상속받은 속성과 연산 외에 새로운 속성과 연산을 첨가 할 수 있다.

  (ex. 상위호환 시키는 느낌?)

 

- 상위 클래스의 속성과 연산을 하위 클래스가 공유할 수 있기 때문에 객체와 클래스의 재사용

  즉, 소프트웨어 재사용을 증대시키는 중요한 개념이 된다.

  (ex. 재탕)

 

- 다중상속

  한 개의 클래스가 두개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것을 말한다.

 

다형성(Polymorphism)

- 다형성은 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때 하나의 메시지에 대하여 각 객체(클래스)가

  가지고 있는 고유한 방법(특성)으로 응답할수 있는 능력을 말한다.

- 객체(클래스)들은 동일한 메소드(함수)명을 사용하며 같은 의미의 응답을 한다.

- 응용 프로그램 상에서 하나의 함수나 연산자가 두개 이상의 서로 다른 클래스의 인스턴트(객체)들을 같은

  클래스에 속한 인스턴트 처럼 수행할 수 있도록 하는것을 말한다.

더보기

코드예시

하나의 변수명, 함수명이 상황에 따라 다른 의미로 변형할 수 있다는 의미이다.

아래는 가장 대표적인 다형성의 특징인 overriding을 나타낸 코드이다.

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

//Person의 메소드를 추가하고
Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

//Person에 subclass를 생성한다.
function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

//getInfo를 재정의한다(overriding) 
Employee.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo " +
    "and earns " + this.salary + " dollar.";  
  
//
var person = new Person(50,90);
var employee = new Employee(43,80,50000);

console.log(person.getInfo());
console.log(employee.getInfo());
};

 

 

 

Ps. 메소드 - 함수 / 파라미터 - 매개변수 / 인스턴트 - 객체 / 클래스 - 구조체 로 이해하면 편하다.

'공부' 카테고리의 다른 글

C++ 이전과제 클래스구조로 변환시키기  (0) 2022.11.16
C++ 블랙잭 게임 복습  (1) 2022.11.16
블랙잭 과제 (진행중)  (0) 2022.11.15
C++ 블랙잭(1:1) 코드 복습  (0) 2022.11.14
시험 오답 노트(복습용/비공개)  (0) 2022.11.13

댓글