저녁식사도 했으니 이제 추상화에 대해서 알아봐야 겠군요. 추상적이라는 것은 미술에서와 같이 그 핵심요지만 살리고 나머지는 생략하거나 변형하는 방법으로 그린 그림을 뜻하는 것이라는 점 입니다.

지식인에서는 이런식으로 추상화를 표현하였네요.
추상화란?
클래스를 구현함에 있어 모든 속성과 기능을 구현할 필요는 없다. 회사원 관리를 위한 사람 클래스에서는 성별이라는 속성이 반드시 필요하지만 남자목욕탕 회원 관리를 위한 사람 클래스에서는 굳이 성별이라는 속성을 표시할 필요가 없습니다. 어자피 모든 구성원이 남자 일테니까요.
이처럼 굳이 구현할 필요없는 부분을 과감히 생각하여 필요한 부분을 나타내는 것을 추상화라 한다.

라고 인터넷 지식인에서는 나왔군요

또다른 정의를 보면
객체를 모델링할 때 필요로 하는 만큼의 속성과 오퍼레이션을 추출해내는것
모델에 무엇을 포함하고, 무엇을 뺄 것인지 아는 것은 가장 중요한 기술이다.

이런식으로 정의를 내렸네요.
네 둘다 같은 뜻이네요 어찌 보면 위에서 서술식으로 표현한 방법이 더 쉽고 이해하기가 편했고 아래는 핵심적인 용어로 내려서 조금 어렵게 느껴지는군요

추상화를 어떻게 이해를 해야 할지...
이건 표현으로 예를 들기 모하지만 우리가 프로젝트를 시작하여 유스케이스를 통해서 프로그램 전체 흐름을 이해하고 해야 할것과 하지 말아야 할 오퍼레이션과 속성을 정하듯이 추상화는 이미 우리가 머리속에서 행동으로 옴길 방법을 알았음에도 불구하고 우리는 누군가가 정의를 내려보라 하면 쉽게 애기를 못하는 이야기 중에 하나 인것 같습니다.

여기서 잠깐
오퍼레이션 ?
아 다 알고 계셨는데 너무 쉽게 보았다구요 죄송합니다. 전 또 모르는 분들도 볼까봐 설명을 할려고 합니다. 잘 아시는분들은 위에만 읽어보시고 나가셔도 괜찮습니다.
오퍼레이션은 기능을 뜻하는것 같습니다. 언어에서는 오퍼레이션을 아래와 같이 표현들을 해서 사용하지요

int add(int number_1, int number_2)
{
    return number_1 + number_2;
}

이런식으로 표현해 놓으면 메인이나 기타 클래스에서 불러서 사용을 할수 있게 만들어 놓은 행위를 말하는것 같습니다. 우리는 이런것을 넓게 봐서는 함수라 하고 더 광범위하게 생각하면 메소드라고 표현을 하기도 하지요. 이런식에 함수를 만들어서 사용하는것은 매우 고민해야 하고 생각을 많이 해서 만들어야 합니다. 헤드퍼스트라는 책을 읽어 보면 세월이 절대 변하는 않는것은 "변화"라는 문구가 있습니다. 굉장히 중요 합니다. 함수로 표현을 하는것은 자주 변화하고 자주 불러다 쓸수 있는 것을 선별해서 만들어야 하는데 이것은 굉장히 어려운 고충이죠. 여러분은 이런부분을 생각해서 코딩을 하시나요? 아니며 그냥 복사, 붙여넣기 아니면 남들이 그렇게 했으니 나도 그렇게 해야지 하고 만드시나요? 한번 돌이켜 생각해 보면서 코딩을 해보면 좀더 이해가 쉽지 않을까 합니다.

두번째는 속성인데요. 속성은 구지 설명을 하기 좀 그런데 우리가 클래스 같은곳에서 맴버 변수를 선언하거나 테이블을 설계할때 필드를 잡는것 등등 이런것은 모두 속성이라고 전 생각하고 쉽니다.
예를들어 아래를 보시죠.

class addr
{
    string name;
    string phone;
    string  address;
}

모 이런식으로 표현을 해 두었다고 칩시다. 이런석은 주소에 해당되는 속성들이 클래스로 잡혀 있는 것입니다. 이것을 또 테이블 즉 DB로 관리를 한다면 마찬가지로 이것도 속성이 되는것이죠 제가 아직 배운게 없어서 이런식으로 밖에 설명을 해 드리지 못하겠군요 좀더 공부를 해야겠죠 저도... 제가 잘못 알고 있을수도 있으니 말입니다.

끝으로 추상화는 정말 우리가 정의를 내리지 못해도 우린 이미 하고 있다는 사실을 항상 생각해 주시고 이번기회에 다시 잡고 넘어가세요. 인터넷이나 도서관에 책자를 보면 보다 정확하고 근본적인 답들이 많이 있습니다.
이상 추상화에 대한 설명을 맞치도록 하겠습니다. 궁금한점 있으면 댓글이나 보충설명도 댓글로, 질책도 댓글로 달아주시면 감사하겠습니다.


'기타 > 객체지향언어특징' 카테고리의 다른 글

캡슐화  (0) 2009.08.28
상속  (0) 2009.08.28
다형성  (0) 2009.08.28
C++ 과 C#의 차이점  (0) 2009.08.19
드뎌 객체지향에서 빠질수 없는 캡슐화네요. 휴 벌써 여기까지 달려오다니 책한권 읽다가 이렇게 삼천포로 빠져서 인터넷 디지고 공부를 하다니 제가 생각해도 좀 엉뚱한거 같아요 ㅋㅋ

캡슐화 정의?
객체는 자신의 동작 원리를 클래스라는 껍데기로 캡슐화 한다.
그 객체만이 자신의 오퍼레이션이 어떻게 작동하는지를 알고 있으며, 외부에서는 알 수 없다.

이런 정의를 인터넷에서 찾아볼수 있었습니다. 뭐 틀린말은 아닌거 같아요 그런데 캡슐화를 이렇게 글로 표현하니 정말 전 이해가 안되네요 ㅠㅠ 그럼 예를 들어서 한번 만들어 보겠습니다.

class CTest{
    string  name;
    string  phone;
    date    date;
}

이런게 바로 캡슐화 인가 보네요 위에서 설명한데로 예를 들어 보니 말이죠 ㅎㅎ
우리는 이미 이런 내용들을 읽어보지 않고 정의를 알지 못하여도 열심히 코딩을 하여 경험에서 많이 습득을 하고 있었던것 입니다. ㅎㅎ

두번째로

class CTest{
    public string name;
    private string jumin;
}

자 보세요 이런식으로 만들어 놓으면 타 클래스에서는 name에는 접근이 가능하나 jumin이라는 변수에는 접근을 못하게 되어 캡슐화가 되었다는 사실을 또 알수 있습니다. 정말 신기하죵 우리가 전혀 이뜻도 모르고 정의도 알지 못하지만 이렇게 자기도 모르게 사용을 하고 있었던 입니다.

'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
상속  (0) 2009.08.28
다형성  (0) 2009.08.28
C++ 과 C#의 차이점  (0) 2009.08.19
상속이란 단어를 네이버에서 쳐보면 전혀 엉뚱한 답변이 나와서 정확한 키워드를 입력해 보기로 결심하고 객체지향 상속 이라는 문장으로 검색을 해 보았습니다.
블러그나 지식인에는 많은 답변이 있더군요 모두 비슷비슷해서 하나 찾아서 적어 둡니다. 또 잃어 버릴지도 모르니까 말이죠.

상속이란?
예를들어 가전제품 클래스를 물려받은 세탁기, 냉장고, 블렌더 등은 가전제품(슈퍼클래스)의 모든 특성을 물려받게 된다. 이때 세탁기, 냉장고, , 블렌더 등을 서브클래스라 한다.
특성을 물려받은 각각의 서브클래스는 자신만의 속성과 행동을 추가할 수 있다.

이렇게 정의를 해 두었군요.
우리는 흔히 슈퍼클래스, 부모클래스 그리고 서브클래스, 자식클래스라는 말들을 프로그램을 좀 다를줄 아는 사람들끼리 객체지향을 공부한 애들끼리 쓰는 말로 첨에는 단순하게 아 부모가 자식에게 물려주는 거구나 하는 생각으로 쓰곤 하죠. 저 또한 그랬구요. 네 맞습니다. 지금 생각하고 공부한 내용이 맞아요. 아직도 다른 참고 문서를 읽어보면 또 이런식으로 내용이 나왔네요.

"클래스를 상속한다. 와 클래스를 사용한다. 라는 말은 객체 지향 프로그래밍의 기초가 되는 프로그래밍 스타일 입니다."

이제 적당히 하고를 예를들어 코딩으로 표현해 볼까요?
public class Animal{
}

class dog : public Animal{
}

이런식에 방법은 우리가 통신을 하거나 파일관리 클래스를 만들때 자주 사용하는 방법인데요 통신에는 그종류가 너무나 많습니다. 예를들어 우리가 tcp 통신을 위해서 프로그래밍을 만들었다고 했다고 칩시다. 그럼 여러분은 tcp에 관련된 통신 모듈만 만드시나요? 아님 통신이라는 큰 공통 모듈을 하나 만들어서 tcp 클래스로 만들어 상속을 받아서 사용을 하시나요? 제 생각에는 상속을 받아서 사용하면 나중에 공통부분을 다시 구현하지 않아도 되고 유지보수도 편할 것 같아서 두번째가 더 현명하게 제작하는것 이라고 생각하네요. 

결론을 내리자면 어느게 답이라고 말하기 보다는 상속을 자신의 스타일에 맞게 이해하고 응용 할수 있어야 한다 입니다.. 저또한 그러기 위해서 많은 서적도 읽고 프로젝트중 코딩을 할때 응용도 많이 해 보았습니다.
프로그래밍 언어를 배운다는 것은 책을 정독해서 읽고 외우는게 아니라 손에 익힐정도로 많이 짜보고 쳐서 자기것으로 만드는것이 가장 중요하다고 하네요.

'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
캡슐화  (0) 2009.08.28
다형성  (0) 2009.08.28
C++ 과 C#의 차이점  (0) 2009.08.19
간만에 날을 새는 바람에 늦잠을 자고 말았다. 학교에서는 오늘 일이 있다고 했는데 도와 주지도 못하고 그냥 늦게 등교해 버렸다 ㅠㅠ
등교도 늦게 하는 바람에 그냥 도서관에서 들려서 책이나 빌려서 가야 겠다는 생각으로 도서관을 나섰다. 도서관을 들어가는 순간 보고 싶고 배우고 싶은 욕심은 의욕보다 너무 앞서서 인지 정작 배우고 싶고 알고 싶은건 빌리지 않고 에세이 집을 하나 빌렸다. 임백천작가의 소산(소프트웨어 산책)을 말이다. 난 전에도 임백천작가의 누알을 읽은적이 있다. 하지만 이사람은 참 재밌다. 프로그램 시점보다 철학자라고 해야 하나 암튼 어려운 문법이나 개념을 쉽게 표현해서 더더욱 좋다.
서론이 너무 길었다. 암튼 책을 읽다 보니 다형성에 대한 개념이 나와서 잃어 버릴까봐 적어 두기로 했다.

"객체는 수정(modification)에 닫히고 확장(extension)에 열려 있어야 한다는 것 Open-Close의 원리인데 그것은 곧 소프트웨어의 유지보수 비용과 노력을 결정적으로 절약시키는 객체지향 원리의 정수이다. 다형성이 없다면 그러한 원리는 구현 되기 어렵다"

이 구문이다. 다형성에 대한 이해가 잘 되지 않아서 적지 않은 책을 읽었지만 이런 내용은 수수히 수없이 들어봤을 것이다. 하지만 이렇게 쉽고 명쾌하게 풀어서 적어놓은것 참으로 대단한 일이다.

이참에 위키사전에는 얼마나 어렵게 나왔는지 찾아 보겠다.
헉 이를 어째 이건 진짜다. 찾아보니 다형성이라는 설명이 없다.
그래서 이번엔 네이버에서 찾아 봐야 겠다는 생각으로 키보드를 두드려 보았다.
역시 블러그식이나 지식인에는 있으나 명확한 대답은 얻을 수 없다.

그래서 정리 한다.
이내용은 "탱이의 생활" 블러그에서 퍼왔습니다.
다형성은 이란?
다형성이란 하나의 여러가지의 일을 하는 것을 말한다.

이것이 정의라고 한다. 좀더 자료를 찾아서 올리고 싶지만 급 피곤해서 오늘은 여기까지 적도록 한다. 담에 기회가 된다면 객체지향에 대해서 한번 정리해서 올려야 겠다.
이만 줄인다. 모두 지겨운 글을 읽어주셔서 감사드립니다. 꾸벅

'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
캡슐화  (0) 2009.08.28
상속  (0) 2009.08.28
C++ 과 C#의 차이점  (0) 2009.08.19

- C++ 과 C# 의 차이점 정리

1) C# 정의 및 장점

마이크로소프트에서 C++ 는 Naive Language 라 하고, C# 을 Managed Language 라고 표현한 것을 읽은 적이 있다. 분명 C# 은 개발자 입장에서 더 강력한 기능을 손쉽게 제공하고, 또 버그가 날 가능성을 줄여주는 파워풀한 현대적인 개발언어임에는 분명하다.

2) C# 단점

하지만 글에서 언급한 것과 같이 컴파일 한 바이너리가 커지는 문제, C++ 에 비해 느린 실행속도 등을 고려해 볼때 임베디드 시스템 개발용 언어로는 부적합 하다고 생각된다. 아무리 임베디드 시스템의 하드웨어 성능이 점점 좋아지고 있다고 해도... 리소스를 1byte 라도 절약하고 속도를 1milli sec 라도 줄여야 하는 상황에서 소프트웨어 개발 레벨에서 부터 이런 방식으로 리소스를 갉아먹는 건 매우 좋지 않다고 본다.

3) 개발자 생각

내가 아는 어느 팀에서는 임베디드 시스템의 OS 로 Windows CE 를 쓰고, 개발 언어로 C# 을 쓰는데, 여러가지 고민 끝에 선택한 결과겠지만, 내가 볼때 이 결정은 개발자가 편할수는 있지만 소비자나 회사의 입장에서는 불리하다고 판단된다.

4) Windows CE 장점

Windows CE 라는 플랫폼 자체가 제품 당 OS 라이센스를 지불해야 하는 금전적 부담이 있으며, Windows CE 가Linux 에 비해 갖는 장점은 개발자에게 친화적이고 소프트웨어 호환성이 좋다는 점 등인데, 진지하게 원가를 고려해 보고, 또 소프트웨어 변화가 적은 임베디드 환경을 생각해 본다면 좀 힘들더라도 Linux 에서 사용자가 편리한 UI 를 개발해서 서비스 하는 것이 맞다고 생각된다.

5) C++, C# 비교

개발언어 역시 마찬가지로, C# 으로 개발을 하게 되면 개발자 입장에서 최신 언어를 사용한다는 만족감과 개발의 편리성은 증대되겠지만 제품 입장에서 보면 리소스와 퍼포먼스 측면에서 손해를 보게 된다. 추가로, 디바이스 드라이버나 연동부분의 legacy code 는 대개 C/C++ 로 되어 있어 호환성에도 문제가 생기게 된다.

6) 결론

결론은... 상용화 과제에 있어서는 개발자가 유리한 방향으로 개발을 해서는 안되고 사용자가 유리한 방향으로 개발이 진행되어야 하는데... 그것이 사실 쉽지 않다. 사실, 만약 Windows 개발에 익숙한 나에게 Linux 환경에서 개발해야 하는 과제가 주어지면 나 역시 불평 불만이 많을 것이다... ㅋㅋ

사실, 개발 난이도의 증가에 따른 개발비용과 리스크의 증가등도 분명 중요한 고려사항이 될 수 있다. 하지만 기술적인 어려움을 논외로 하고, 비지니스 측면을 진지하게 고려한다면 힘들더라도 항상 사용자 위주로 생각하면서 개발을 해야 할 것이다.


'기타 > 객체지향언어특징' 카테고리의 다른 글

추상화  (0) 2009.08.28
캡슐화  (0) 2009.08.28
상속  (0) 2009.08.28
다형성  (0) 2009.08.28

+ Recent posts