시리즈:수학인듯 과학아닌 공학같은 컴퓨터과학/객체지향

문서의 내용이 너무 쉬워서 오늘부터 객체지향으로 프로그래밍을 할 수 있을 것 같습니다.

이 문서에는 독자적으로 연구한 내용이 들어갑니다. 다른 사람의 의견을 존중하면서 무례하지 않도록 작성해 주시고, 의견 충돌 시 토론 문서에서 토론해 주세요.

객체지향이란?[편집 | 원본 편집]

객체지향프로그래밍(Object-Oriented Programming)이란 우리가 일상생활에서 생각하는 대로 프로그램 내부의 '객체'를 다루기 위한 기법입니다.

올바르지 않은 표현이지만 자동차를 예로 들면,

자동차는 크게 나누어 바퀴와 차체로 나누어 집니다.

기능적으로 설명하면 바퀴는 굴러가고 차체는 안에 사람이나 짐을 싣고 동력을 바퀴에 전달하죠.

또 차체는 문과 창문, 프레임, 파워트레인, 엔진 등으로 나눌 수 있고요.

또 그것을 기능적으로 설명하고, 그 물건을 또 나누고....

더 단순한 예를 들자면 여전히 객체의 개념이 어려우시다면 객체=레고블록 정도로 생각하시면 될 듯합니다.

물론 이것도 올바른 표현은 아니지만 그런 비스무리한 것으로 이해하시면 되겠습니다.

이렇게 해서 모든 부품과 부품의 역할을 설명할 수 있게 하는 것이 객체지향 프로그래밍의 첫번째 목적입니다.

3대 개념[편집 | 원본 편집]

캡슐화(Encapsulation)[편집 | 원본 편집]

캡슐화는 추상화에 관련된 개념입니다.

일반적으로 전기를 사용할 때 이 전기가 어느 발전소에서, 어떠한 방식으로 생산되는지는 신경을 쓰지 않죠. 사용자는 220V 60Hz[1]의 전기만 잘 들어오면 어느발전소에서 만든 전기인지는 신경 쓸 필요가 없습니다.

이런식으로 내부의 객체(변수, 메소드)를 가리고 필요한 것만 제공하는 것이 캡슐화를 할 때 기본 원칙이고, 내부의 객체에 접근할 수 있는 방법을 제공하는 메소드를 API(Application Programming Interface)라고 합니다.

상속(Inheritance)[편집 | 원본 편집]

상속을 설명하는 가장 쉬운 방법은 유전입니다.

자식은 아버지와 어머니를 닮죠. 아버지나 어버니는 또 그 부모를 닮습니다.

이러한 현상을 프로그래밍에 접목한 것이 바로 상속입니다.

그래서 용어도 비슷하게 사용하는데요, 기초가 되는 클래스를 부모클래스, 상속을 받은 클래스를 자식클래스라고 부릅니다.

자식 클래스 = 부모클래스 + α 라고 보시면 됩니다.

간단한 예를 들자면, 부모클래스가 {'바퀴', '핸들'}의 특성을 가졌다고 생각합시다.

여기서 파생되는 자식클래스는 무엇이 될 수 있을까요.

자동차 = {'바퀴', '핸들', '엔진'}
자전거 = {'바퀴', '핸들', '체인'}

'자동차'와 '자전거'의 두 클래스는 동일한 부모 클래스의 특성을 이어받고 있는데요. 이것이 바로 상속의 개념이 되겠습니다.

그리고 자동차와 자전거는 같은 부모의 특징을 상속하지만 분명히 서로 다른 객체이죠. 이것은 아래의 항목에 설명이 됩니다.

다형성(Polymorphism)[편집 | 원본 편집]

다형성 또한 유전으로 설명할 수 있습니다.

자식이 부모를 닮았다 해서 부모랑 완정히 같은 특징을 가지지는 않습니다.

그러한 점에 착안하여 고안된 것이 바로 다형성입니다.

쉽게 예를 들자면 개라는 종에 셰퍼드와 치와와라는 종류가 있지요.

셰퍼드와 치와와는 개라는 종족만 같을 뿐 대단히 많은 차이점을 가지고 있습니다.

이러한 것을 프로그램에서는 다형성으로 통하여 표현할 수 있습니다.

클래스[편집 | 원본 편집]

접근 제한자[편집 | 원본 편집]

객체에 대해 접근을 할 수 있는 권한을 제한하기 위해 있습니다. 자바의 예를 들면 private < (default) < protected < public 순으로 사용할 수 있는 장소의 제한이 해제됩니다.

접근자 패키지외부 패키지내부 클래스내부
private 불가 불가 가능
(default) 불가 가능 가능
protected 제한적[2] 가능 가능
public 가능 가능 가능

이러한 것이 필요한 이유는 예제를 통해서 설명하겠습니다.

private : 자동차의 키는 아무나 만져서는 안됩니다. 주인만 만질 수 있어야 하죠. 며느리도 만질 수 없습니다.

(default) : 자동차의 엔진은 아무나 건드리면 안됩니다. 위험하니까요. 제조사 또는 정비사만 건드릴 수 있습니다.

protected : 자동차 안에는 주인 또는 가족만 탈 수 있죠. 허락을 받으면 다른 사람도 탈 수 있습니다.

public : 공용 주차장은 아무나 사용할 수 있어야 합니다.

이와 같이 접근을 제어해야 하는 상황에서 데이터를 보호하기 위해서 사용하고 이와 관련된 개념이 Encapsulation입니다.

멤버 변수(프로퍼티)[편집 | 원본 편집]

멤버 함수(메소드)[편집 | 원본 편집]

객체[편집 | 원본 편집]

Person이라는 클래스가 있을 때

C++ 객체 생성법[편집 | 원본 편집]

Person lee; //정적할당 
Person* kim = new Person();

C# 객체 생성법[편집 | 원본 편집]

Person kim = new Person();

JAVA 객체 생성법[편집 | 원본 편집]

Person kim = new Person();

Python 객체 생성법[편집 | 원본 편집]

kim = Person()

생성자[편집 | 원본 편집]

생성자는 이름 그대로 클래스를 생성하는 데 사용됩니다.

끝이냐고요?

어떤 경우, 클래스를 만들 때 정보가 필요할 수도 있습니다. 예를 들어 새 아이가 태어났을 때, 생년월일은 아이가 태어나는 그 순간에 그 자리에서 정해집니다. 즉 변하지 않는 값, 상수를 정해 줄 필요가 있는 클래스의 경우[3], 클래스를 생성할 때 이 생성자에게 값을 넘겨줍니다. 물론 굳이 생성할 때 필요하지 않은 변수 등도 생성자를 통해 넘겨줄 수 있습니다.

소멸자[편집 | 원본 편집]

태어남이 있으면 죽음도 있는 법입니다.

더 이상 사용할 필요가 없다고 생각되는 클래스를 죽.여.주.마 메모리에서 삭제합니다.[4]

간단한 프로그램인 경우에는 큰 문제가 되지 않지만 프로그램이 덩치가 클 수록 메모리의 사용량도 커집니다.

그런데 메모리는 한정되어 있죠. 그러므로 메모리의 효율적인 이용을 위해 사용이 끝난 클래스를 지우는 것입니다.

멤버 함수 재정의(오버라이드)[편집 | 원본 편집]

클래스를 상속받은 경우, 기존에 정의되어 있던 함수임에도 불구하고 자식 클래스가 똑같은 이름으로 새로 쓸 수가 있습니다. 이를 "오버라이딩"이라고 합니다.

예를 들면 사람에게 있는 "말하기 함수"를 홍진호라는 새로운 클래스가 상속받았습니다. 뭘 할까요? 다 알면서 "말하기 함수"를 새로 써서 2를 강조한다던지 하는 게 바로 오버라이딩입니다.

각주

  1. 한국의 경우. 주택용 저압
  2. 상속받을 수는 있음
  3. 상수라고 해서 무조건 생성자로만 받는 것은 아니며 변수처럼 클래스 내부에서 미리 정의를 할 수 있습니다.
  4. 실제로 삭제한다기 보다는 해당 클래스를 가리키는 포인터 값을 없애는 것이지만...