VisualBasic.NET(비쥬얼베이직닷넷)/1. VB.NET강좌

[VB.NET강좌] 01. 객체지향이란?

롤파마 2017. 1. 18. 10:48



01. 객체지향(OOP)이란?


   공부하면서 쓰는거라 오류가 있으면 댓글 달아주세요.


   객체지향(Object-Oriented Programming, OOP)이라는게 무엇인지 알아보기로 하자.

   검색사이트에서 객체지향을 찾게되면 어렵게 나와있지만 다음처럼 4가지로 정리하고 있다.

   프로그램을 처음 공부하는 사람은 읽어도 무슨이야기인지 설명이 너무나 어렵게 써있어서

   초보인 제가 이해한만큼만 정리해보았다.

 


   객체지향을 설명하기전에 객체, 클래스, 인스턴스, 메소드, 메시지의 용어부터 알고가자.

객체(Object) : "그냥 사물을 의미한다."

세상에 모든것 책상, 의자, 컴퓨터, 토끼, 호랑이, 사자, 기쁨, 감정 등등 모든것들이 다 객체가 된다.


클래스(Class) : "객체를 생성하기위한 일종의 틀이다." 

프로그램에서는 클래스가 먼저 정의 되야 객체를 정의할수 있다.


예를 들어보자.

(토끼, 호랑이, 사자) 우리는 객체라고 했다.

(토끼, 호랑이, 사자)의 공통점은 무엇일까?

바로 포유류이다.

포유류(클래스)가 정의 되고 난다음 (토끼, 호랑이, 사자)라는 객체가 정해진다는 말이다.

몇개 더 해보자.

자동차(클래스)-트럭(객체), 연체동물(클래스)-오징어(객체), 가구(클래스)-식탁(객체)

이처럼 객체의 공통점을 묶어서 정의 한 것을 클래스(Class)라 한다.


인스턴스(Instance,실례) : "실례는 다른 사람에게 어떤 내용을 설명할 때는 구체적인 예를 들때 하는 표현"

객체와 클래스의 관계에서 객체는 클래스의 인스턴스(Instance,실례)라고 한다.


토끼는 포유류의 인스턴스

트럭은 자동차의 인스턴스

오징어는 연체동물의 인스턴스

식탁은 가구의 인스턴스가 되는것이다.

객체와 인스턴스(객체=인스턴스)


메소드(Method) : 객체가 동작하려면 클래스안에 동작하는 함수가 정의 되야하는데 그때의 함수를 메소드라고

한다.


메시지(Message) : 객체와 객체간의 의사소통을 메세지라 한다.


객체에서 메소드(함수)를 불러올때는 "."을 사용하여 "객체.메소드" 이렇게 표현한다.

메세지는 객체.매소드() , 객체.매소드(인자) 게 표현하여 사용한다.




   1. 추상화(Abstraction)


추상화라는 단어의 사전적의미는 "사물을 사실적으로 표현하지 않고 순수한 점ㆍ선ㆍ면ㆍ색채로 표현하는

그림" 이라고 적혀있다. 실제 복잡한사물을 간단하게 표현한 그림을 추상화라고 하는 것이다.

객체지향에서 추상화라는 뜻은 "방대하고 복잡한 정보는 숨기고 필요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다." 




   2. 캡슐화, 은닉화(Encapsulation, Information Hiding)


약국에 가서 약을 사면 약중에 먹기쉽게 캡슐이라는 용기에 담겨져 있는 약이 있다.

'난 가루약이 넘좋아' 하면서 캡슐을 분해해서 약을 먹는 분은 없을것이다.

우린 그냥 캡슐화된 약을 편하게 먹고 약효만 있으면 되는것이다.

객체지향에서 캡슐화,은닉화란 "방대하고 복잡한 정보는 접근하지 못하게 클래스에 숨기고 필요한 정보만 얻을수 있게한다." 




   3. 상속(Inheritance)


상속이라는 단어의 사전적의미는 "물려받다." 라는 뜻이다.

클래스들 사이에서 공통으로 가지는 특성을 따로 다시 정의하지않고 그대로 물려받아서 쓴다는 것이다.


예를 들어보자.

호랑이라는 동물은

동물 → 척추동물 → 포유강 → 식육목 → 고양이과 → 호랑이 나뉘어지는데,

호랑이를 동물, 척추동물, 포유강, 식육목, 고양이과까지 끌어다가 호랑이를 표현한다면 너무 많고 복잡하게 될것이다. 


그래서

척추동물클래스는   동물클래스에서 공통적특징은 상속받고 다른특징은 다시 적고,

포유강클래스는     척추동물클래스에서 공통적특징은 상속받고 다른특징은 다시 적고,

식육목클래스는     포유강클래스에서에서 공통적특징은 상속받고 다른특징은 다시 적고,

고양이과클래스는   식육목클래스에서 공통적특징은 상속받고 다른특징은 다시 적고,

호랑이클래스는      고양이과클래스에서 공통적특징을 상속받고 다른특징은 다시 적으면


호랑이클래스로 정의된 객체는 간단하게 호랑이를 표현할수 있게된다.


A(Class) - B(Class)이처럼  B가 A에게 상속을 받았다면

B부클래스, 파생클래스, 하위클래스, 자식클래스 라 하고,

A기반클래스, 상위클래스, 부모클래스라 한다.


기존 클래스를 상속받은 하위클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정 할 수 있고,

클래스 간의 종속를 형성함으로써 객체를 조직화 시킬 수있다.

상속은 공통된 특성을 중복하여 정의하는걸 줄일수 있으므로 매우 편리하다.




   4. 다형성(Polymorphism)


형성의 사전적의미는 "동종 생물의 개체가 어떤 형태 및 형질 등에 관해 다양성을 나타내는 상태" 이다.


프로그램을 만들때 

비슷한 작업을 하는 메소드를 각각 다르게 지정한다면 메소드명을 작명 하는데 머리가 아파올 수 있고

코딩도 복잡하게 된다. 그래서 같은 메소드명에 인수만 달리해서 만들면 메소드를 사용하는 입장에서는

좀 더 편하게 사용 할수 있게된다.

또, 클래스 상속을 할 때 부모클래스에서 정해진 메소드명을 자식클래스에서 다르게 실행시 킬 필요가 있을수도 있다.

이처럼 "하나의 매소드를 사용하여 결과를 다양하게 나타내는 걸 다형성이라한다."


다형성에는 오버로딩오버라이딩 두 가지를 알고 가야한다.


오버로딩(Overloading) : "다중정의라하며 서로 다른 것이나 처리에 같은 이름을 쓰는 것"

오버라이딩(Overriding) : "클래스간 상속관계 에서 같은이름의 메소드를 자식클래스에서 메소드를 다시

 제 정의해서 사용하는 것"


오버로딩 예를 들면

수를 더하는 메소드를 만든다고 하자.

suTwo(수1,수2)

suThree(수1,수2,수3)

suFour(수1,수2,수3,수4) 수를 계산하는 메소드의 이름을 달리하여 만드는게 아니라.


suPlus(수1,수2)

suPlus(수1,수2,수3)

suPlus(수1,수2,수3,수4) 

이렇게 같은 메소드명에 인자만 달리해서 만들면 좀 더 효율적으로 프로그램을 만들수 있다.


오버라이딩 예를 들면

부모클래스.자식() - 메소드 결과가 내가 원하는 작업아니면

자식클래스.자식() - 메소드명을 같이해서 내가 원하는 작업으로 바꾸면 된다.


예제라고 쓰긴했지만 이해가 안될 것 같지만 지금은 이정도만 이해하고 넘어가자.



우리가 만든 프로그램이 컴퓨터에서 실행되기위해서는 컴파일(Compile)이라는 단계가 있어야 된다.

컴파일이란 우리가 만든 소스코드를 컴퓨터가 이해할수있는 기계어로 바꾸는 작업을 말한다.

소스코드를 사용하기 위해서는 소스코드에 포함된 라이브러리나 함수, 객체들을 사용할수 있도로 연결

(바인딩(Binding))이라는 작업을 한다.

이때 소스코드 전체를 바인딩 하는걸 정적바인딩(Static Binding)이라 하고, 프로그램 실행시 라이브러리나 함수, 객체들을 필요 할 때마다 연결 하게 하는 것을 동적바인딩(Dynamic Binding)이라 한다.

전체연결을 하면 메모리 사용량이 많아지게 된다. 다형성을 지원하기 위해서는 동적바인딩이 필수다.

인자들이 조금씩 다른 메소드전체를 연결시키면 메모리 사용량이 많아지기 때문에 프로그램 실행시 그때그때 필요한 메소드만 연결시켜 다형성을 지원해야 된다.

DLL(Dynamic Linkage Library)에 대해서 많이 들어 봤을거다.

DLL은 함수나 객체들을 모아놓은 라이브러리이다. 영어처럼 동적으로 라이브러리를 연결시킨다는 뜻으로 프로그램에서 필요시 동적바인딩하는 파일인 것이다.




객체지향의 장점을 정리하면

1. 정보은닉(캡슐화)

2. 상속을 이용한 코드의 재사용

3. 코드관리가 쉬워 확장과 유지보수비용 감소





VisualBasic.net을 공부하면서 만든 프로그램을 몇년동안 잘 쓰고 있다가 요즘 필요한걸 적용해서 만드려고 프로그램을 다시 열었더니 나이가 먹어서(ㅜㅜ) 그런지 기억을 잃어버려서(ㅜㅜ) 처음한다는 마음으로 다시시작하려고 적어봤습니다. 저도 초보자라 초보자분들도 이해할수 있도록 다시 블로그에 적으려고 합니다. 객체지향에 대한건 여기서 마치겠습니다.