객체지향이란? 왜 객체지향을 사용 하는가?
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나
절차지향(C)언어에서는 각 명령어의 실행 순서를 기반으로 바라 보는 시선이었다.
하지만 OOP는 데이터와 이를 처리하는 루틴들을 하나의 "독립된 객체"로 바라 보는 시선이다.
이를 통해서 큰 프로젝트에 많이 사용된다. 그 이유는 재사용성의 증가이다.
기존에 만들었던 내용을 쉽게 상속, 다형성 등을 이용해서 재사용 가능하다.
또한 개발자의 실수로 인한 취약점을 줄여준다. 해당 내용이 왜 재사용과 관련이 있을까?
그 이유는 개발자가 급하게 만들면서 코드에 오류가 발생 할수 있다. 이럴 경우 새로운 패치를 해야하고
손실을 가져온다. 하지만 생성자, 소멸자, 접근제어[Public, Private, Protected] 와 같은 내용은 이러한 오류를 잡아준다.
이 외에도 코드를 직관적으로 파악하는데 도움이 되는 등 많은 이유가 있을 것이다.
1. 추상화(Abstraction)
프로그램을 만듬에 있어서 간단한 예를 생각하려 한다.
스타크래프트에서 유닛을 만든다고 생각을 한다.
그러면 기본적으로 들어갈 정보들을 생각 할 수있을 것이다. 그리고 구체화 시켜 나가는 것이다.
예를 들어 HP, MP, NAME 과 같은 데이터들과 이동, 공격 과 같은 함수들이 존재 할 것이다.
이러한 추상화를 통해서 Class를 만들어 놓고 저글링이나 질럿 마린과 같은 상세한 부분들을 채워 나가는 것이다.
//가상 클래스 //기본적인 몬스터들의 틀[Class] //추상 클래스 class Unit{ //태어나는 위치 private : int x; int y; //기본 속성 protected: unsigned char HP; unsigned char MP; char name[20]; //생성자 //태어남 //소리남 응애응애 public: Unit(); virtual void born() = 0; virtual void sound() = 0; };
2. 캡슐화(Encapsulation)
객체의 내용 중 숨기고 싶은 부분은 외부에서 접근 할 수 없다.
단지 해당 객체내의 함수에 의해서만 접근 가능 하도록 하는 것이다. 이를 통해서 정보 은닉이 가능해진다.
앞서 말한 접근제어[public, private, protected]와 같은 내용에 의해서 구현 되어진다.
접근 권한을 통해 제공되며 원하지 않는[실수] 외부의 접근에 대해 내부의 데이터, 함수를 보호하는 작용
이렇게 함으로써 이들 부분이 프로그램의 다른 부분들에 영향을 제한.
예를 들어 설명하면, 각 Unit마다 고유한 값이 존재한다.
하지만 같은 변수명을 사용함에 있어서 실수로 고유한 값을 수정 해버리면 문제가 발생 한다.
이러한 문제를 해결 해준다.
//유닛에서 저글링 만들기 class zergling : public Unit{ //speed 추가 private: unsigned char speed; public: zergling(); virtual void move(); virtual void sound(); void up_speed(); void up_speed(int var); };
//priveate 영역 접근 가능한 클래스 내 함수 void zergling::up_speed(){ speed += 10; }
3. 상속(Inheritance)
Class의 멤버[데이터]와 함수를 다른 Class에 물려주거나, 물려 받는 것을 말한다.
이를 통해서
1.코드의 재사용을 증대 시킬 수있다. 같은 기능을 또 구현 할 필요가 없다.
2. 좀 더 폭넓게 사용 가능하다. 상속 받은 함수를 추가적으로 데이터와 함수 내용을 변경 가능.
같은 기능을 가진 함수는 그대로 사용 할수있고, 같은 기능의 함수를 다른 이름으로 만들 필요도 없어진다.
내 생각이지만 이를 통해서 다형성도 확보되는것 같다.
//유닛에서 저글링 만들기 class zergling : public Unit{ //speed 추가 private: unsigned char speed; public: zergling(); virtual void move(); virtual void sound(); void up_speed(); void up_speed(int var); }; //Unit을 상속 받아서 zergling 생성
4. 다형성(Polymorphism)
다양한 형태로 표현이 가능하다는 의미이다.
예를 들어 설명하면 사람의 말투와 같은 느낌인것 같다.
사람의 말투에 따라서 야. 야!, 야~ 와 같이 다른 의미를 전달한다.
야. 는 정색하는 말투.
야!는 호통 하는 말투
야~ 는 애교를 부리는 말투
등으로 같은 [야] 이지만 다른 의미를 전달하는 느낌이다.
여기서는 Overloading과 Overriding으로 표현이 가능하다.
두개의 의미는 알지만 항상 햇갈렸는데 단어 뜻을 알아보고 간다.
Overload는 초과 적재라는 의미, Overriding 무효화 하다 라는 의미이다.
Overload는 하나의 함수에 여러개의 기능을 부여하는것.
Override는 기존의 기능을 고려 하지 않고 새로운 기능을 부여하는 것.
Dynamic Binding이라는 개념도 해당 다형성에서 나온다.
함수가 호출 되기 전까지는 up_speed()함수 중 어떠한 것과 연결 되는지 모른다.
하지만 up_speed()가 호출 되면 속도가 +10이 되고, up_speed(30)하면 +30으로 연결 될 것이다.
이러한 내용을 동적 바인딩이라고 한다.
1. 오버로딩[Overloading]
같은 기능의 함수에 같은 이름을 사용 할수있어서 가독성 증가
하나의 함수에 여러 메개변수 가능
조건:
함수명은 동일 해야함.
넘겨주는 인자[메개변수]는 달라야 함.
리턴 타입은 상관 없음.
2. 오버라이딩[Overriding]
상속으로 받은 함수를 그대로 사용하지 않고 새로 만들어서 사용.
코드의 재사용성을 역시 증가 시킨다.
조건:
함수명은 동일 해야함.
넘겨주는 인자 같아야 함.
리턴 타입 같아야함.
void zergling::up_speed(){ speed += 10; } void zergling::up_speed(int var){ speed += var; } //오버로딩[Overloading] void zergling::sound(){ printf("북적 북적\n"); } void Unit::sound(){ printf("꿈틀 꿈틀.. 아무런 소리가 나지 않는다.\n"); } //오버라이딩[Overriding]
[참고]
https://ko.wikipedia.org/wiki/%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
http://tenlie10.tistory.com/1
'학부_대학원' 카테고리의 다른 글
Head First Design Patterns(스토리가 있는 패턴 학습법) 1장 (0) | 2016.11.27 |
---|---|
C++ 사용에 대한 이해 (0) | 2016.07.27 |
Overriding vs Overloading (0) | 2016.07.26 |
중앙값 정리 (0) | 2016.07.24 |
운영체제 (0) | 2016.07.22 |