관리 메뉴

Value Creator의 IT(프로그래밍 / 전자제품)

#1 C++ 기초(객체지향, 캡슐화, 상속성, 다형성) 본문

1. 프로그래밍/5) C++

#1 C++ 기초(객체지향, 캡슐화, 상속성, 다형성)

valuecreatort 2019. 7. 24. 19:03
반응형

1. 캡슐화

 

캡슐화(Encapsulation)

- 데이터를 캡슐로 싸서 외부의 접근으로부터 보호

-C++에서 클래스(class 키워드)로 캡슐 표현

 

클래스와 객체

 

- 클래스 : 객체를 만드는 틀

- 객체 : 클래스라는 틀에서 생겨난 실체

- 객체(object), 실체(instance)는 같은 뜻.

- 멤버 : 아래에서 radius, Circle, r, getArea() 모두 멤버

 

class Circle
{
private:
   int radius;//반지름
public:
   Circle(int r) { radius = r; }
   double getArea() { return 3.14*radius*radius }
};

 

※ 객체를 사용하는 이유를 예로 든다면, 사람이라는 객체를 만들어 놓았을때 학생, 회사원, 군인 각각 3개의 객체를 만드려 한다. 3개의 객체의 공통점은 모두 사람이라는 것이다. 이때 사람이라는 객체를 각각의 객체에 사용해 추가적인 코드 작업을 줄일 수 있다.

 

즉, 소스코드의 수정없는 재활용을 위해 만들어진 개념이라 보면 된다.

 

캡슐화의 목적은 앞서 말한 '소스코드의 수정없는 재활용'을 위해 있다. 프로그램 코드를 재활용하려고 하는데 이때 기능(함수,메소드)이나 특성(변수)이 분산되어 있는 프로그램 코드는 재활용할때 매우 힘들다. 이 때 관련 기능을 한곳에 모아 분류를 해야 난해하지가 않다.

 

그래서 분류한 기능과 특성의 모음을 클래스(class)라는 캡슐에 분류되어 정리한다. 이러한 클래스를 실체화(인스턴스)하면 객체를 만들 수 있다.

 

2. 상속성

 

객체 지향 상속(Inheritance)

- 자식이 부모의 유전자를 물려 받는 것과 유사

 

C++에서의 상속

- 객체가 자식 클래스의 멤버와 부모 클래스에 선언된 모양 그대로 멤버들을 가지고 탄생

class Phone{
	void call();
    void receive();
};

class MobilePhone : public Phone{ //Phone을 상속 받는다.
	//즉, class Phone의 call(), receive()를 사용할 수 있다.
	void connectWireless();
    void recharge();
};

class MusicPhone : public MobilePhone{ //MobilePhone을 상속 받는다.
	//즉, Phone과 MobilePhone의 함수를 모두 사용할 수 있다.
	void downloadMusic();
    void play();
};

 

※ C++ 이전의 프로그래밍 기법에서도 코드의 재활용이 불가능한 것은 아니었다. '라이브러리'와 같은 것들을 통해 남이 짜놓은 것이나 자신이 미리 만들어 놓은것을 그래도 사용할 수 있었다.

 

하지만 굳이 상속의 개념을 만든이유는 기존의 방식에 치명적인 단점 때문이다. 라이브러리와 같은 경우는 기능을 약간 바꿔야 할 경우 라이브러리의 소스를 변경해야 했으며, 그 후에는 기존 라이브러리라고 부르기에는 다른것이 되기때문이고, 이 때문에 라이브러리 버전에따라 프로그램의 동작 유무가 결정될 수 있으며, 불필요한 코드의 수정작업을 해야 한다는 것이었다.

 

그렇기 떄문에 객체 지향에서는 상속을 도입했으며 이전 라이브러리 보다는 더 편의성이 개선되었으며 상속을 이용해 부모 클래스의 특성과 기능을 그대로 받음과 동시에 수정하려 할때 자식클래스에서 그 기능만 다시 정의하여 수정이 용이하게 되었다. 그 작업을 덮어쓰기(override)라고 한다.

 

**참고자료**

다중 상속, 순환 상속

->다중 상속을 지원하지 않는 OOP 언어가 대부분이며, 다중 상속이 되는 C++ 같은 것도 다중 상속은 최대한 자제하라고 권장하고 있다. 다중 상속의 가장 큰 문제는 순환 상속(죽음의 다이아몬드, the Deadly Diamond of Death라고도 불린다)의 문제 때문이다. 2개의 부모를 가진 자식 클래스의 조상이 겹치는 경우가 발생할 수 있는데 이것을 C++같은 객체 지향 언어는 처리할 수 없다.자식이 부모의 조상이 되어 버릴 수가 있기 때문이다. 이 때문에 상속을 포기하고 필요한 부모의 기능을 다시 모두 구현해줘야 한다. 이렇게 되면 객체 지향 프로그램 방식으로 프로그램했다고 말하기가 민망해진다.

  • 클래스는 오로지 관련 데이터만을 정의하기 때문에, 한 클래스의 인스턴트가 수행될 때 다른 프로그램의 데이터를 절대로 건드릴 수 없게 된다. 덕분에 높은 시스템 보안을 제공하고, 자료 훼손을 방지하는 효과가 있다. isual Studio 6.0의 C++는 데이터베이스의 자료 처리는 변수를 모두 public으로 처리 했었다.이 이유는 데이터베이스의 필드가 50개이면 get과 set 메소드를 모두 구현해주면 100개의 메소드를 구현해줘야 한다. 변수 50개와 메소드 100개다 150개를 키보드로 쳐야 한다.생각만 해도 일할 기분이 안난다. 이건 Java도 마찬가지다. 변수의 get과 set메소드 구현은 어째던 굉장히 귀찮은 작업이다. 데이터의 은닉도 중요하지만 프로그래머의 손가락 건강도 생각해 봐야 한다. C#은 2.0부터 프로퍼티 하나만 선언해 주면 되기 때문에 상관 없다.
  • 클래스의 정의는 최초로 생성한 프로그램뿐 아니라 다른 OOP에서도 똑같이 사용될 수 있다. 그리고, 이런 이유로 네트워크에 쉽게 분산 사용이 가능하지만 프로그래머에게는 아주 힘든 노력을 강요한다. 네트웍 통신이라는 것은 호환성을 위해 7bit ASCII코드로 전송한다. 1960년대 만들어진 통신기기를 사용하는 곳도 아직 있기 때문이다. 이 때문에 Quarter-Print, Base64나 UTF-8같은 것이 만들어진 것이다. 결국 객체도 7bit ASCII코드로 전송을 해야 한다. 메모리상의 객체 정보를 ASCII 코드 화 하는 것을 직렬화(Serialization)라고 하고 ASCII코드를 다시 객체화 하는 것을 역직렬화(Deserialization)라고 한다. 하지만 마법처럼 그냥 되는 게 아니고 "직렬화 인터페이스"를 프로그래머가 고생해서 구현해 줘서 "직렬화 인터페이스"가 있는 객체만 가능 하다. 현실 세계에서는 마법은 없다. 마법처럼 보이는 것이 있을 뿐이다.
  • 데이터 클래스 개념은 언어에 정의되지 않은 새로운 데이터 형식을 프로그래머가 임의로 정할수 있도록 해준다.

 

 

3. 다형성

 

다형성(Polymorphism)

- 하나의 기능이 경우에 따라 다르게 보이거나 다르게 작동하는 현상

- 연산자 중복, 함수 중복, 함수 재정의(overriding)

void add(int a, int b){...}
void add(int a, int b, int c){...}
void add(int a, double d){...}
//add 함수 중복
class Animal{
	sound();
};

class dog : public Animal{
	walwal();
};

class cat : public Animal{
	yaong();
};

class chicken : public Animal{
	kokodag();
};

//함수 재정의(Overriding)

 

 

 

# C++과 제네릭 프로그래밍

 

제네릭 함수와 제네릭 클래스

- 제네릭 함수(generic function)

 

동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 함수

 

-제네릭 클래스(generic class)

 

동일 한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 클래스

 

-template 키워드로 선언

 

템플릿 함수 혹은 템플릿 클래스라고도 부름

 

-Java, C# 등 다른 언어에도 동일한 개념 있음

 

# 제네릭 프로그래밍(generic programming)

 

- 제네릭 함수와 제네릭 클래스를 활용하여 프로그램을 작성하는 새로운 프로그래밍 패러다임

- 점점 중요성이 높아지고 있음

 

 

 

#include <iostream>

//'std::'를 없에고 싶으면 using namespace std;를 사용하면된다.

int main() {

std::cout<<"Hello\n"; //화면에 Hello를 출력하고 다음줄로 넘어감. \n은 <<후 end;로 대체 가능

std::cout<<"첫번째 예제."; // 문자 출력

return 0; //main() 함수가 종료하면 프로그램이 종료됨

}

반응형
Comments