퇴근5분전

 회계파트를 시작한지 어언... 일주일이 지나 월요일인 오늘 머리가 뜨끈 뜨끈할정도로 스팀이 나기 시작했다.
VB.NET으로 된걸 그대로 C#으로 바꾸고 디자인만 WPF를 이용한 소스를 분석하는데...
 
 소스내용에 대해서는 안쓰지만... 내가 이렇게 못하나 싶을 정도로 미칠지경이되었다.
DB에 데이타 넣고 유효성 체크까지도 다 했는데... 아직 불확실한 요소가 많다.

샘플소스를 분석하다 분석하다 힘들어서 VB.NET 원본 소스를 그대로 쳐 넣어봤다. 올커니... 되는구나 하고
하나 하나 치다 보니.. C#에는 황당한게 있더랑.

적용도 안되는 변수가 여기저기서 값을 받는다.

이벤트에서 다른이벤트처리로 등록된 메서드를 호출을 한다. 또 샘플에 그리드 이벤트에 디버그 걸어서 보면
이벤트가 중첩되서 연속으로 걸린다. 이걸 어찌 이해 하여야 하는가?

  뭔가 흐름이란걸 파악이 되어야 속도를 내볼끈데 이건뭐... 쉽지 않네...
나오기전 마지막엔 그리드에 Insert동작에 맞춰 검색 조건에 사용한 Key값을 그대로 전달하는 코드에서
코드값이 전달된 후 이유없이 날라간다. 해당 Cell 에 대입하는 곳 모두를 봤지만... 대입하는 곳은 거기랑 조건코드값을 얻기위해 팝업시켜 선택된 값을 대입하는곳 뿐인데...  둘다 사라지는것도 아니고 왜???? 코드값만 ??? 우쒸...

 내일도 삽질만 기다리는뎅... 나름 이벤트와 노트북에 익숙해지긴 했는데...

삽질 삽질.. 삽질... 삽질은 안무서운데... 내가 모르고 지나치는게 무섭다! 


음 좋기능 하나 찾았음..

Ctrl + Shift + 7, 8   단축키...


이전 VB할때 이전가기... 라고 있던것... 괜찮았는데..

위 단축키는 정의로 가기 ( F12 )로 해당 정의로 이동했을때...

다시 이전위치로 돌아가고자 할때 Ctrl+Shift + 8을 누르면 이전위치로 이동하고 다시  Ctrl+Shift + 7 을 누르면 다시 정의 위치로 이동한다...

지금까지는 계속 정의 보고.. 다시 스크롤 -> 해서 해당위로.. 또는 Ctrl+G로 라인찍고 갔었는데...



추가 : 대문자로 만들기 Ctrl + Shift + U
         소문자로 만들기 Ctrl+ U

 개발 방법론에 대해 많은 종류가 있고 문서도 많이 있는 것을 확인했으나 일일이 따라 가기엔 너무 벅차다 싶어 회사에서는 회사에서 행하는 규칙대로 내가 움직여주면 되는 것이고 나만에 어플을 짤때는 나만에 방법을 이용해서 짜면 될듯 하여 나름 규칙을 정해본다.

 작년 초부터 가장 잘 써보고 싶은 것이 마인드맵!! 이란 툴인데. 이걸 어플 분석이나 설계에 사용하면 좋을듯 해서 방법을 고민중이다. 어떻게 하면 잘 사용할수 있을까?

 가끔 어플을 짤때면 만들고자 하는 놈을 정하고 나면 UI를 대충 그려놓고 거기에 필요한 객체들을 대충 체크하며 없는것들은 만들어낸다. 이때 가장 멍하게 만들때가 UI를 그리면서다.

 머리속에 UI를 그릴때 두가지 생각이 같이 드는데 정리가 안된다.
1. UI가 편할까?
2. UI컨트롤 배치하면서 머리속에서는 코딩이 이뤄진다.( 미친거쥐... )

이런 저런 고민하다보면 UI가 정말 어이없는 놈이 탄생하게 된다. 정말 불편하겠다 싶은...
또 label은 왜케 어렵게 써놨을까? 단축해서 쓸만한 단어도 생각이 안나고...
뭐 아직까지 혼자 쓰는 용도로 많은 어플들을 만들어서 괜찮지만.. 이 것 자체가 습관이 되면 고치기 어려운데...

뭐 우선 아래 간단한 어플 구현에 대해 나만에 방법들을 정리 해본다.
아래 나열한 방법으로 개발한 개인 어플은
 1. 개발 프레임웍( 가장 최근에 만든 놈 )
 2. 프레임웍에 딸린 디버거
 3. 코드생성기( 프레임웍에서 중복사용하는 코드들을 찍어낸다. )
 4. xmlHelper
 5. SocketHelper
 6. 브라우져( DB와 연동되어 DB데이타를 보는 놈인데 ... 버젼별로 3가지인가? 된다. )
 7. JsDokebiWindow ( 메인 프로그램이고 여기에 추가적으로 플러그인을 통해 사용프로그램을 더해서 사용하는 모듈이었음. 지금까지 만든 프로그램들을 하나로 통합해 관리 하려고 하였던... 허접한거 2개나 만들어져있다. )
 ... 기타...

요새 분석중인건 [일정관리]이다.  1차로 만들었던것도 나는 쓸만하지만... 대체로 써본사람들은 불편을 호소한다 .. 역시 UI가 문제다. 췌~~!




분석 -> 설계 -> 구현 <--> 테스트     지금까지 잡은 나름 정한 순서인데...

분석 : 만들고자 하는 어플에 대한 이해랄까?  일에 맞춰 어떤 UI면 좋을지 어떤기능을 포함하면 좋을지에 대해 간단한 스케치를 하고 DB를 xml로 할지 실제 DB를 이용할지 등등 고민하고 있다.

 툴은 마인드맵을 이용해서 간단한 기능들에 대해 적어둔다.

설계 : 분석이 마쳐질때 쯤 UI를 좀더 디테일하게 스케치 하고 파워포인트로 대충 그려본다(그리고 나면 뷁).
이 어플에 필요한 객체들이 어떤것이 있으며 객체들의 역할을 정리하며 네임스페이스를 붙여 구분하기 시작하게 됨. 조금 상세한 설명들을 주석으로 하며 객체간에 인터페이스 부분도 심각히고려하게되는 부분이 된다.
 
 툴은 마인드맵, 파워포인트.

구현 : 설계단계에서 나온 객체들을 기능별로 죄다 구현한다.  우선 메인모듈을 만들고 , 여기에 붙여지는 객체를 하나씩 하나씩 붙여가며 테스트를 겸한다.

 툴은 비쥬얼 스튜디오

테스트 : 구현하면서 간단한 모듈간 테스트를 하게 되며 객체 하나 하나가 붙어가면서 제모습을 들때쯤이면
본격적인 테스트를 시작하게 된다.


현재는 마인드맵 활용이 조금 잘못된 느낌이 자꾸 든다.
 
설계 하면서 메인에 나뭇가지로 객체들을 부착하고 거기에 기능을 넣어보고 있지만 객체가 우선인지 기능이 우선인지... 분간이 어렵고 제대로 정리가 되지 않아서 자꾸 꼬인다... 좀더 하다보면 뭔가 또 번쩍!!! 떠오르는게 있지 않을까?

간단히 학생들에 대한 점수 계산 후 ...

평점 순위별로 재정렬 하는 질문이었음.    참 재미있었음!!

쩝.. 분류를 어디다 넣는다!!.. ㅡ.,ㅡ;?


질문글
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=25054&Key=&Value=

답글
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=25061&Key=&Value=

<총점으로 정렬 하기>


<평균으로 정렬하기>


List<T> 를 이용해서 학생이 수강한 과목들을 가지는 학생정보를 생성하고
List<T> 를 이용해서 학생정보들을 취합한 학생들! 이란걸 만들었음.

그리고 학생들을 정렬시키는 조건이 되는 객체를 생성해서
Sort 에 넣어줌.

관련 링크는 아래 소스에 주석문에 포함되어있음.


* 학생정보들 이 되어야 될텐데.. 아차차!!!



<객체> 대충 그림.

사람 <-----  학생정보,
학생들 (*) ----- (1) ( 학생정보 (1) ---- (*) 과목 )
과목,
평균정렬, 총점정렬



// 설정
.net 2.0으로 제작!
폼 1개,
버튼 2개 -> 각 버튼별 Click이벤트 ,
리스트뷰 1개 -> View속성 -> View.List; 로 설정,




// 원본 소스
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        List<학생정보> 학생들 = new List<학생정보>();

        public Form1()
        {
            InitializeComponent();

            학생정보 a군 = new 학생정보("a군");
            a군.Add("영어", 10);
            a군.Add("국어", 50);
            a군.Add("수학", 40); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점
            a군.Add("수학", 10); // 총 100점 평 33점        // 순위 확인을 위해
            학생정보 b군 = new 학생정보("b군");
            b군.Add("영어", 10);
            b군.Add("국어", 20);
            b군.Add("수학", 100);// 총 40   평 13
           
            학생정보 c군 = new 학생정보("c군");
            c군.Add("영어", 10);
            c군.Add("국어", 10);           
            c군.Add("수학",  40); // 총 20   평 10
            a군.평균구하기();
            b군.평균구하기();
            c군.평균구하기();
            학생들.Add(a군);
            학생들.Add(b군);
            학생들.Add(c군);
            listView1.View = View.List;

// 리스트 뷰에 아이템 컬럼 추가하기
            listView2.View = View.Details;
            listView2.Columns.Add("이름", "이름");
            listView2.Columns.Add("과목수", "과목수");
            listView2.Columns.Add("총점", "총점");
            listView2.Columns.Add("평균", "평균");
            listView2.Columns.Add("영어", "영어");
            listView2.Columns.Add("국어", "국어");
            listView2.Columns.Add("수학", "수학");
            comboBox1.DataSource = Enum.GetNames(typeof(View));
           
           
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Text = "평균정렬";
            학생들.Sort(new 평균비교());
            Display();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            this.Text = "총점정렬";
            학생들.Sort(new 총점비교());
            Display();
        }
        public void Display()
        {
            listView1.Items.Clear();
            listView2.Items.Clear();
            foreach (학생정보 정보 in 학생들)
            {
                this.listView1.Items.Add(정보.ToString());

// 리스트 뷰에 아이템 추가하기
// [정보.이름]은 이미지에서 보다싶이 첫번재 컬럼에 들어감.
                ListViewItem _정보 = new ListViewItem(정보.이름);      
                _정보.SubItems.Add(정보.과목수.ToString() );
                _정보.SubItems.Add(정보.총점.ToString() );
                _정보.SubItems.Add(정보.평균.ToString() );
                _정보.SubItems.Add(정보["영어"].ToString() );
                _정보.SubItems.Add(정보["국어"].ToString() );
                _정보.SubItems.Add(정보["수학"].ToString() );              
                this.listView2.Items.Add(_정보);
            }
        }
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            View v = listView2.View;
            try
            {
                this.Text = "";
                listView2.View = (View)Enum.Parse(typeof(View ),  comboBox1.SelectedItem.ToString());
            }
            catch
            {
                this.Text = "err";
                listView2.View = v;
            }
        }    
    }
 
        #region  계산용 -- 클래스
        /// <summary>
        /// <para>  List.Sort  메서드 도움말 참조 </para>   
        /// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx  참고!    
        /// </summary>
        public class 평균비교
            : IComparer<학생정보>
        {
            #region IComparer<학생정보> 멤버
            public int Compare(학생정보 x, 학생정보 y)
            {
                if (x == null)
                {
                    if (y == null)
                    {
                        return 0;
                    }
                    return -1;
                }
                else
                {
                    if (y == null)
                    {
                        return 1;
                    }
                    if (x.평균 > y.평균)
                    {
                        return 1;
                    }
                    else if (x.평균 < y.평균)
                    {
                        return -1;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            #endregion
        }
        /// <summary>
        /// <para>  List.Sort  메서드 도움말 참조 </para>   
        /// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx  참고!    
        /// </summary>
        public class 총점비교 : IComparer<학생정보>
        {
            #region IComparer<학생정보> 멤버
            public int Compare(학생정보 x, 학생정보 y)
            {
                if (x == null)
                {
                    if (y == null)
                    {
                        return 0;
                    }
                    return -1;
                }
                else
                {
                    if (y == null)
                    {
                        return 1;
                    }
                    if (x.총점 > y.총점)
                    {
                        return 1;
                    }
                    else if (x.총점 < y.총점)
                    {
                        return -1;
                    }
                    else
                    {
                        return 0;
                    }
                }
            }
            #endregion
        }
        #endregion

    public class 사람
    {
        private string __이름 = string.Empty;
        public string 이름
        {
            get { return __이름; }
            //set { __이름 = value; }
        }
        public 사람(string 사람이름)
        {
            this.__이름 = 사람이름;
        }
        public override string ToString()
        {
            return string.Format("나는 {0}입니다." + Environment.NewLine, __이름);
        }
    }

    public class 학생정보 : 사람
    {
        public 학생정보(): base("홍길동")
        {           
        }
        public 학생정보(string 이름): base(이름)
        {}

        List<과목> 수강과목 = new List<과목>();
        public int 과목수
        {
            get { return 수강과목.Count; }
        }
        public int this[string ___과목명]
        {
            get {
                foreach (과목 item in 수강과목)
                {
                    if (item.p과목명 == ___과목명)
                    {
                        return item.점수;                        
                    }
                }
                return -1;
                // throw new Exception("과목이없음.");
                }
        }

        public void Add(과목 과목)
        {
            수강과목.Add(과목);
        }
        public void Add(string _과목명, int _점수)
        {
            Add( new 과목( _과목명, _점수 ));
        }
        int __평균 = 0;
        public int 평균
        {
            get { return __평균; }
       //     set { __평균 = value; }
        }
        int __총점 = 0;
        public int 총점
        {
            get { return __총점; }
         //   set { __총점 = value; }
        }
        public void 평균구하기()
        {
            if (수강과목.Count <= 0)
            {
                __평균 = __총점 = 0;
                return;
            }
            총점구하기();           
            this.__평균 = __총점 / 수강과목.Count;
        }
        private void 총점구하기()
        {
            foreach (과목 item in 수강과목)
            {
                __총점 += item.점수;
            }
        }
        public override string ToString()
        {
            string ret = base.ToString(); 
            ret += string.Format(" 과목수:{2}, 총점:{0} , 평균:{1} 입니다" +Environment.NewLine, __총점, __평균, 수강과목.Count);
            foreach (과목 item in 수강과목)
            {
                ret += item.ToString();
            }
        
            return ret + Environment.NewLine;
        }  
    }

    public class  과목
    {
        public 과목(string _과목명,  int _점수)
        {
            __과목명 = _과목명;
            __점수 = _점수;
        }
        string __과목명 = string.Empty;
        public string p과목명
        {
            get { return __과목명; }
        //    set { 과목명 = value; }
        }
        int __점수 = 0;
        public int 점수
        {
            get { return __점수; }
            //set { __점수 = value; }
        }
        public override string ToString()
        {
            return string.Format("{0} 과목의 점수는 {1}점입니다. "+Environment.NewLine, __과목명, __점수);
        }
    }

}

'# 1) 프로그래밍' 카테고리의 다른 글

VS : 정의 보기 -> 되돌아가기.. 단축키  (1) 2010.01.22
나만에 개발방법...  (0) 2010.01.13
디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10

http://iilii.egloos.com/tag/디자인패턴

자바로 되있지만.
설명이 무척 잘되어 있어서 보기 좋음.

'# 1) 프로그래밍' 카테고리의 다른 글

나만에 개발방법...  (0) 2010.01.13
훈스에서 어느분이 객체지향을 공부하신다기에....  (0) 2009.07.15
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10
객체지향 정리!  (0) 2009.07.10

 어느날 C#을 하면서 인터페이스라는 놈이 날 괴롭혔다.
전자 전공인지라 자꾸 물리적인 인터페이스만 떠올라서 계속 생각하고 대체 이놈을 어디다
쓴단 말인가???
 훈스게시판에 문의를 했던적이 있다 인터페이스가 무엇인가??

처음 질문은 답이 없었고...
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=3330&Key=Name&Value=%ec%9c%a4%ec%a7%80%ec%86%a1 

두번재 질문.
http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=3373&Key=Name&Value=%ec%9c%a4%ec%a7%80%ec%86%a1 

이글에는 김창우님께서 답글을 달아주셨다.

그 당시에 이걸 이해는 불가했었던거 같고... 한참이 지난 후 class 업캐스팅! 관련해서 보다가
인터페이스를 떠올리고서야 .. 아하!! 했던기억이 새록 새록...


인터페이스란.
객체A에서   객체B를 이용한다고 할때  객체 B가 가진 인터페이스를 통해서 접근하여 B에 멤버 변수와 기능에 대한 접근을 하도록 도와주며. 객체 B에 대한 접근범위를 제한하게 된다.

interface I누구
{
       string  이름();
}

class ObjectA
{
       public void 넌누구냐( I누구   지목된대상  )
       {
               MessageBox.Show(   지목된대상.이름() );
        }
}

class ObjectB : I누구
{
       public string 이름()
      {
           return "객체B라네";
      }
}

위 처럼 구현시

  ObjectA와 ObjectB를 생성하고 ObjectA에서 넌누구냐(  생성된objectB참조 ) 를 호출하면
ObjectB에 이름을 알수있게 된다.


ObjectA에 넌누구냐()에 파라미터로   I누구라는 인터페이스를 이용하는데
ObjectB라 정의 하지 않고 어찌 I누구를 썼는가? 라고 한다면

ObjectC가. ObjectD가 그이외에 객체를 대상으로 묻고자 한다면 오버로드로 처리 할것인가??????
라고 되물을 수가 있을것이다.

인터페이스를 이용하면 굳이 귀찮게 오버로드를 만들 필요가 없지 아니한가?

I누구만 상속받아서 객체 생성을 한다면 ObjectA 에 넌 누구냐에 대상이 될수 있다!

또한 넌누구냐() 의 구현부안에서는
I누구의 멤버인 [이름]만이 접근이 가능하기에 접근에 대한 제한이 가능하므로 쓸데없는 참조나
데이타 조작이 불가능해지므로 좀더 에러에 대한 대처 범위가 줄어들게 된다.











'# 1) 프로그래밍' 카테고리의 다른 글

훈스에서 어느분이 객체지향을 공부하신다기에....  (0) 2009.07.15
디자인 패턴관련...  (0) 2009.07.13
객체지향을 꿈꾸며...  (0) 2009.07.10
객체지향 정리!  (0) 2009.07.10
노가다~~ 고고싱~?  (0) 2009.06.29

 객체지향 코딩??
C#을 처음 할때만 해도 뭐든지 뚝딱 만들 수만 있다면 좋지 않을까 생각했었으나
코딩을 하면서, 프로그램을 만들어갈때마다 뭔가 부족한 느낌이 팍팍 들때마다 떠오르는건
객체지향 코드였었다.
 
 class를 선언하고 정의했음에도 불구하고 왠지 코딩을 하다보면 반복되는 기능을 다시 구현하고 있고 복사해서 써도 될것을 약간에 수정이 필요한 부분 때문에 다시 만들고, 잊어버리기 일수였고, 와이즈엠에서 처음 시작하던 시절에 중국에 다녀와서는 아무것도 모르는 객체 지향에 대한
막연한 갈망이 시작되었다.

 어떻게 하면 객체지향적인 코드를 만들어낼수 있을까? 재사용성은 대체 무슨 말인가?
객체간에 결합도가 어떻다는 말인가
?
어차피 코드로 되어있으면 요구사항에 대한 코드수정은 불가피 한것이 아닌가? 나는 좀더 빠른 코딩과 코드분석이 필요할 뿐이었다 라고 판단하고 알고리즘, 자료구조. 프로그래밍 관련 문서들을 닥치는데로 읽어들였으나, 역시나 객체지향이란것이 눈앞에 아른거려서 공부를 다시 시작하였다. 그러나 내 눈에 들어오는게 하나도 없었고, 이사님께서는 "쉽다" 하신다. 고수에게는 쉬울지언정, 난 어쩌란 말인가...
또 인터페이스라는 것이 궁금해 이사님께 여쭈었더니 "좀더 큰 프로젝트에서 팀간 모듈을 만들때나 쓰는거다. 알필요없다!"라고 하시는 말씀에 그런줄 알았다.

 어느날 문득... TextBox를 새롭운 기능을 하나 가진 놈을 만들어야 할 때가 왔었다. 어떻게 할까 고민 고민 하다가 C++책에서 class관련 책을 읽던 중 [상속] 부분이 자꾸 눈에 거슬려서 두세번 읽고, Textbox를 상속해보기로 마음먹었다.

 상속 후 새로운 기능을 추가하고 사용에 이르렀을 때는... 머리속에 형광등이 깜박거리듯이
아하! 이런게 상속이고 객체를 사용하는 방법이구나! 라고 들떠오르기 시작했었다.
다시한번 C++ 상속부분을 대여섯번은 읽은 듯 하다.

그 이후 뭐든 새로운걸 할려면 자꾸 상속에 의존하게 되었다.

'# 1) 프로그래밍' 카테고리의 다른 글

디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향 정리!  (0) 2009.07.10
노가다~~ 고고싱~?  (0) 2009.06.29
객체지향 관련된 글  (0) 2009.05.04

 누님께 객체지향을 설명드리면서 작성했던 문건을 블로그에 등록해본다.
실제 코드사용은 더 복잡시렵기도 단순한기도 하지만, 설명을 위해
최대한 짧고 포인트되는 부분만 다뤄본다고 정리 해보았으나 ...
역시 표현이 부족하다는건 늘 느낀다.


-- 아래는 설명에 필요한 내용들을 적었다가 설명이 끝나면서 따로 정리해서
보내주고 그 문서를 여기에 등록하였음.

 단순히 클래스를 정의 하고 그 기능을 호출하고자 할때 점을 찍어서 접근 가능한
멤버에 기능명을 호출하게 됨.
 
  class 휴대폰
 {
           켜다();
           끄다();
 }

   휴대폰.켜다(),          휴대폰.끄다();

 이렇게 되면 휴대폰 를 켜다, 휴대폰 를 끄다!! 라고 표현이 가능하고
실제 구현부는 휴대폰 를 켜고 끄는 동작에 대한 기술을 할수 있게됨.  와~~!!!  쉽다!

 그러나 켜다 끄다라는 기능은 휴대폰에만 있는 기능이 아니고,
컴퓨터, pc, 형광등, 에어콘...등... 제품에 전원을 넣고, 끊고에 대한 처리이므로
공용으로 사용 가능한 기능이 된다.

 그러면 컴퓨터, pc등의 제품들에 켜다, 끄다의 기능을 주고자 할때는 어찌하면 되는가를
생각하게 된고 아래와 같이 단순하게 표현해 보았다.

 class  전자제품
 {
              켜다();
              끄다();
 }
휴대폰 : 전자제품 {} ,          컴퓨터 : 전자제품  {} ,          pc : 전자제품 {} ...

등 상속을 통해 해당 제품에 대한 켜다, 끄다의 기능을 부여하게 됨

IS-A 관계라고 함.

          휴대폰 IS 전자제품( O ), 전자제품 IS 휴대폰(O)

 현재 시중에 있는 휴대폰은 다양한 기능을 가지는데 이 휴대폰을 만들어 보자!

기본적으로 휴대폰에 있는 기능들을 나열해볼까?

  휴대폰 {   전화, 게임, 다이어리, 사진, 동영상, mp3 ... } 참 많은 기능이 있음.

-> class화 해보자!!

class 휴대폰  : 전자제품
{
        전화;
        게임;
        다이어리;
        카메라;
        저장소; ...
        버튼들;
}

간단한 휴대폰에 기능을 넣어봤음.  넘 쉽자나~!

 휴대폰에 포함된 기능에 관련된 객체들은 HAS -A 관계로
        휴대폰Has게임(O), 게임Has휴대폰(X) , ...
        휴대폰IS게임(O), 게임IS휴대폰(X), ...

휴대폰은 게임을 가진다, 게임은 휴대폰을 가진다..의 차이!!랄까?
또 휴대폰은 게임, 게임는 휴대폰.

어감에 차이가 있지만 그나마 말이되는것을 찾을수 있게 됨.

        휴대폰IS전화( O ) , 전화IS 휴대폰 ( O )    어랏!!

휴대폰은 전화다, 전화는 휴대폰이다.. 이렇게 일치되었음에도
상속을 통하지 않고 포함을 이용하는것은 설계자 맘이다! ㅡ.,ㅡ;;
이때는 전화를 어떻게 설계하느냐에 따라 상속을 통해야하는가
포함을 써도 되느냐에 틀려짐.  아리송~~~ 해~!

객체와 객체간의 관계는 함하느냐, 상속하느냐! 로 구분지어서 생각해보자!!

아래 전화를 정의 한것을 보면...
- 전화 고유의 기능으로 전화를 직접 생성해서 이용가능
Class 전화
{
   public    송화(송화음 );
   public    수화음 수화();
   public    연결(전화대상);
}

- 전화 고유의 기능을 내부에 감추어두고 상속한 자식객체만이 사용가능하게 만듬.
Class 전화
{
    protected   송화(송화음 );
    protected   수화음 수화();
    protected   연결(전화대상);
}

두가지의 전화중 어떤 전화를 이용하느냐에 따라~ 상속을 하느냐 포함을 하느냐로
결정할수가 있게 됨.  아하!! 하시겠죠?

추상화 객체???

 객체를 처음 만든다고 했을 때, 해당 객체의 기본 기능을 정의 하고, 기본적인 기능에 대한 구현 및
멤버들을 정의하여 실제 객체에 적용(상속)시 기본기능이 빠지지 않게 하고자 함이며,
인터페이스처럼 자체적인 객체 생성은 불가하다. 또 추상메서드를 포함하여 객체 상속을
통해 자식객체에게 그 구현부를 떠넘기게 되며, 이는 반듯이 정의 되어야 객체로서
쓸모가 있음을 판단하게 해준다.
 

 추상 말그대로... 상상속에 객체를 만드는 것임.

abstract class 휴대폰  : 전자제품
{
       전화;
       게임;
       abstract void fnDispla();
}

내가 만들 휴대폰은  간단히 전화와 게임만 되는 휴대폰이다.


Class 햅틱 : 휴대폰
{
     override void fnDisplay(){
           // 표현!!
       }
}

   이렇게 간단한 코드로 휴대폰을 만들었고.
 또 다른 폰을 만들기 위해서는 휴대폰을 넣으면 됨.

이건 햅틱이란 모델이 되겠다.
전화+게임+Mp3기능을 갖춘 A모델이고
전화+게임+카메라기능이 있는 B모델도 만들수 있게 된다.

Class 햅틱_Mp3 : 햅틱                           ---------------( A모델 )
{
     Mp3;  
     노래소리 fn음악플레이(){     // mp3 플레이~~    }
}

 Class 햅틱_카메라햅틱                       ---------------( B모델 )
{
     카메라;  
     void 찰칵( ){   저장( 카메라.사진 );   }
     저장(사진);
     저장(동영상); ...
}


전혀 다른 모습에 다른기능이 담긴 휴대폰을 만든다고 했을때
class 오즈 : 휴대폰...   처럼도 가능해진다.

재사용성!! 이란것을 충분히 이용하게 됨.


인터페이스??
 : 인터페이스도 추상 객체처럼 혼자서 객체가 되지 못함. 

객체와 객체간에 연결시 인터페이스를 이용해서 1: N 관계를 형성할수 있게 해줌.

인터페이스를 상속받아 구현한 객체는 이 인터페이스를 이용하는 객체와 연결이 가능해짐.

간단한 예를 들자면  마우스에 USB라는 인터페이스를 이용해서
PC에 IO에 USB포트에 가져다 넣고 마우스 이동좌표, 클릭된 버튼값들의 값들이 PC전송이 됨. 만들어보자!!

interface IUSB
{
         Data{ get; set;}
}

class 마우스 : IUSB
{
       마우스볼;
       휠;
       버튼[];
       Data
       {
           get{ return (마우스볼+버튼+휠)_데이타; }
           set{  }
       }     
}

class USB모듈
{
      USB모듀을가진PC;      
     데이타
     {
        set{        USB모듀을가진PC.USB데이타읽기  = value;        }
       }
}


class  PC
{
       USB모듈;
       USB데이타읽기;
       USB포트( IUSB    usb)
      {
           USB모듈.데이타  = usb.Data;
        }       
      /// pc 동작!! ...
}


위처럼 객체가 4개 정도 풀어서 만들었다면.
PC  pc  = new PC();
마우스 mouse = new 마우스();
pc.USB포트( mouse ); 이렇게 사용이 가능해짐.

IUSB  =  mouse; 라는 등식이 성립하므로...
업캐스팅이일어나게 됨.

USB포트( IUSB    usb) 이걸 왜 이렇게 하는가?

PC객체는 인터페이스를 이용해서 다른 객체를 받아들임으로써
연결되는 두객체간에 결합구조를 느슨하게 만들어줄수 있게 되고
이렇게 USB포트에 연결될 객체는 반듯히 IUSB 라는 인터페이스 규격을 맞추어야 사용이
가능하므로 규격화가 가능해짐.

PC – 마우스, 키볻, 스캐너....등...  IUSB를 상속받아서 사용하는 주변 소모품들을 객체화 가능해지고 PC와 데이타 교환을 프로그래밍으로 표현이 가능해짐.


 

'# 1) 프로그래밍' 카테고리의 다른 글

디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10
노가다~~ 고고싱~?  (0) 2009.06.29
객체지향 관련된 글  (0) 2009.05.04

 현재 작업중인 학사 관련 프로그래밍은 BaseForm을 두고
이를 확장해가는 작업을 하여 폼별 특성에 맞춰 유저컨트롤을 만들어 붙이게 되며
이폼에 사용되는 컨트롤들은 팩토리를 통해 제공하게 됨.

근데 하면 할수록 ... 이건 혼자서 할려니 힘들다... 너무 많은 폼작업때문인지...
총 54개의 메뉴에 폼마다 기본 4개의 폼이 붙지만 이게 공용으로 사용한다면 2개정도로 줄게 된다
여기에 미리보기, 프린트가 따로 구현이 되면 2개 또 추가... 되고
다른 기능들이 추가적으로 붙으면 그이상이 된다.

 해서 작업을 하다보니... 객체 지향도 좋지만 역시나 시스템에 맞는 최적에 설계가 필요한듯 하다.
경험 부족과 시간이 촉박함에 설계를 최적화 하지 못하고 바로 작업이 들어가서인지..
그때는 참 쉽게 만들것이라는 예상을 뒤엎고 UI그리면서 난관에 봉착했다.
파생되는 폼이 너무 많아지고 그에 맞춰 확장을 하다보니 이건... 뭐~~~

 노가다 거리가 늘어나면서 점점 힘에 붙힌다...  혼자 하다보니 역시나. 걸리는게 너무 많은듯 하다.
그렇다고 날코딩을 할 순없잖은가? 이 회사에 자리 깔고 버틸생각을 한다면 말이쥐...

 또한 자리깔고 버틸수 있을지도 의문이다. 직원들간의 대화로... 월급이 밀린다는 얘기도 듣는 지금..
내일까지 기다려봐야지...  또 어디론가 이동해야 할상황이 생기는게 아닌지 ...

ps : 이번에 설계된 데이타 비지니스부분은 참 잘 만들었다. 단지 UI쪽 관련 설계에서 약간에 미쓰가
발생한듯 하다. 추후~ 비슷한 시스템을 만든다면... 미쓰된 부분을 재정의해서 써야 겠음.
많은 UI를 커버하기 위한 작업을 조금 신경써야 할것 같음. 코드로 할것인가? 디자이너를 쓸것인가...
사용자 삽입 이미지
 << 간단히 그린 구성도 >>



'# 1) 프로그래밍' 카테고리의 다른 글

디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10
객체지향 정리!  (0) 2009.07.10
객체지향 관련된 글  (0) 2009.05.04

http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/oop

 객체 지향 관련 된 것은 직접 글로 표현하는 것보다는 현재 인터넷상에서 있는 글이 많기에
따로 쓰지 않음.

'# 1) 프로그래밍' 카테고리의 다른 글

디자인 패턴관련...  (0) 2009.07.13
인터페이스  (0) 2009.07.10
객체지향을 꿈꾸며...  (0) 2009.07.10
객체지향 정리!  (0) 2009.07.10
노가다~~ 고고싱~?  (0) 2009.06.29