훈스에서 어느분이 객체지향을 공부하신다기에....
평점 순위별로 재정렬 하는 질문이었음. 참 재미있었음!!
쩝.. 분류를 어디다 넣는다!!.. ㅡ.,ㅡ;?
질문글
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;
{
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군.Add("영어", 10);
b군.Add("국어", 20);
b군.Add("수학", 100);// 총 40 평 13
학생정보 c군 = new 학생정보("c군");
c군.Add("영어", 10);
c군.Add("국어", 10);
c군.Add("수학", 40); // 총 20 평 10
b군.평균구하기();
c군.평균구하기();
학생들.Add(b군);
학생들.Add(c군);
// 리스트 뷰에 아이템 컬럼 추가하기
listView2.View = View.Details;
listView2.Columns.Add("과목수", "과목수");
listView2.Columns.Add("총점", "총점");
listView2.Columns.Add("평균", "평균");
listView2.Columns.Add("영어", "영어");
listView2.Columns.Add("국어", "국어");
listView2.Columns.Add("수학", "수학");
}
{
this.Text = "평균정렬";
학생들.Sort(new 평균비교());
Display();
}
{
this.Text = "총점정렬";
학생들.Sort(new 총점비교());
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(_정보);
}
}
{
View v = listView2.View;
{
this.Text = "";
listView2.View = (View)Enum.Parse(typeof(View ), comboBox1.SelectedItem.ToString());
}
catch
{
this.Text = "err";
listView2.View = v;
}
}
/// <summary>
/// <para> List.Sort 메서드 도움말 참조 </para>
/// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx 참고!
/// </summary>
public class 평균비교
: IComparer<학생정보>
{
#region IComparer<학생정보> 멤버
{
if (x == null)
{
if (y == null)
{
return 0;
}
}
else
{
if (y == null)
{
return 1;
}
{
return 1;
}
else if (x.평균 < y.평균)
{
return -1;
}
else
{
return 0;
}
}
/// <para> List.Sort 메서드 도움말 참조 </para>
/// http://msdn.microsoft.com/ko-kr/library/234b841s(VS.85).aspx 참고!
/// </summary>
public class 총점비교 : IComparer<학생정보>
{
#region IComparer<학생정보> 멤버
{
if (x == null)
{
if (y == null)
{
return 0;
}
}
else
{
if (y == null)
{
return 1;
}
{
return 1;
}
else if (x.총점 < y.총점)
{
return -1;
}
else
{
return 0;
}
}
#endregion
public class 사람
{
private string __이름 = string.Empty;
{
get { return __이름; }
//set { __이름 = value; }
}
{
this.__이름 = 사람이름;
}
{
return string.Format("나는 {0}입니다." + Environment.NewLine, __이름);
}
}
public class 학생정보 : 사람
{
public 학생정보(): base("홍길동")
{
}
{}
List<과목> 수강과목 = new List<과목>();
{
get { return 수강과목.Count; }
}
{
get {
{
if (item.p과목명 == ___과목명)
{
return item.점수;
}
}
// throw new Exception("과목이없음.");
}
}
public void Add(과목 과목)
{
수강과목.Add(과목);
}
{
Add( new 과목( _과목명, _점수 ));
}
{
get { return __평균; }
// set { __평균 = value; }
}
int __총점 = 0;
{
get { return __총점; }
// set { __총점 = value; }
}
{
if (수강과목.Count <= 0)
{
__평균 = __총점 = 0;
return;
}
총점구하기();
this.__평균 = __총점 / 수강과목.Count;
}
{
foreach (과목 item in 수강과목)
{
__총점 += item.점수;
}
}
{
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 _점수)
{
__과목명 = _과목명;
__점수 = _점수;
}
{
get { return __과목명; }
// set { 과목명 = value; }
}
int __점수 = 0;
{
get { return __점수; }
//set { __점수 = value; }
}
{
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 |
디자인 패턴관련...
'# 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 |
색칠이 쉽지 않넹...
타블렛 적응중~~
'--- 취미 > 만화' 카테고리의 다른 글
옛날꼰날에~ (0) | 2009.05.09 |
---|---|
타블렛으로 그린 첫그림... (0) | 2009.05.03 |
노가다~~ 고고싱~?
이를 확장해가는 작업을 하여 폼별 특성에 맞춰 유저컨트롤을 만들어 붙이게 되며
이폼에 사용되는 컨트롤들은 팩토리를 통해 제공하게 됨.
근데 하면 할수록 ... 이건 혼자서 할려니 힘들다... 너무 많은 폼작업때문인지...
총 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 |
MS-SQL 에서의 한글 자음으로의 검색...
declare @hangle_jaeum varchar(100)
declare @startchar char(2)
declare @endchar char(2)
set @hangle_jaeum = 'ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ'
set @startchar = @WORD
set @endchar = SUBSTRING( @hangle_jaeum, charindex( @startchar, @hangle_jaeum, 0 )+1, 1 )
print ( SUBSTRING( @hangle_jaeum, charindex( @startchar, @hangle_jaeum, 0 )+1,1 ) )
print ('s:'+ @startchar + ' e:' + @endchar)
SELECT *
FROM [테이블]
WHERE [NAME] BETWEEN @startchar AND @endchar
SQL 문을 도와주다가 이름을 ㄱ~ ㅎ으로 찾는 주소록 관련해서
쿼리를 살짝 도와주고 CASE문으로 조합하여 해당 쿼리를 완성해서 준적이 있었으나.
위 BETWEEN으로 된다고 하여 신기해서 블로그에 적어둠.
SQL에서의 어떤 속성값이 지원하는지? 아님 기본으로 지원이 되는것인지는 모르겠으나.
BETWEEN 'ㄱ' AND 'ㄴ' 하게 되면
ㄱ 으로 시작하는 첫글자를 대상으로 조회 해왔다
ㄴ이 오지는 않았다. ㄴ대신 ㄷ 을 넣게 되면 ㄱ , ㄴ 으로 시작하는 첫글자들을 결과집합으로
쿼리해오더라
'# 7) 데이타베이스 > Ms-Sql' 카테고리의 다른 글
[MS-SQL] 누적 계산에 사용한 쿼리... (0) | 2010.10.23 |
---|---|
[MS-SQL] SELECT 쿼리.. (0) | 2010.10.23 |
[ MS-SQL ] 간단한 쿼리인데 3개의 Row에 대해 계산해서 한행 추가 (0) | 2010.10.23 |
[MS-SQL] 피벗 .. (0) | 2010.08.24 |
하루 종일 쌩쑈하다. (0) | 2009.08.13 |
드디어 챠트를 만들다!!!
챠트가 완성되었다. 하나의 챠트에 복합구성하게되는 챠트로
헤더값을 하나로 처리하려다 꼬여서 다른 방법으로 겨우 풀어내었다.
+ 값만 생각하다 sin파 출력을 하니 엄청 당황스러운 파형이 나와서... 죄다 뜯어고쳐서
+든 -든 잘 처리가 되게끔 했음.
라인 챠트 시 점과 점 에 위치값을 구하는것도 꾀나 많이 수정이 되었음.
X, Y축 그릴때 많은 문제점이 나와서 모두 새로 작성이 되었음.
음 아직 히포챠트는 넘사벽이지만... 좋은 공부가 되었음.
투명처리는 우째 해야되는것일까낭....ㅡ.,ㅡ?????
- 나머지~
1. 타이머로 실시간 그래프를 해볼까낭....
2. 범례 표시만 해줌 되려낭...
3. 특정 포인트값 표시 랄까?? 음 이것까지 하면 좀 빡실것도 같은데~~
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
WaitCursor ... (0) | 2009.08.14 |
---|---|
데이타 그리드 뷰 헤더 이용하기. (2) | 2009.08.06 |
챠트 모듈을 만들다!! (0) | 2009.06.17 |
일일 일정 관리 프로그램 II ( upGrade ) (0) | 2009.06.12 |
하루 하루.... 일정 기록하고 관리 하는 기능! (0) | 2009.06.09 |
챠트 모듈을 만들다!!
챠트 구성 모듈을 만들었다.
위에는 3개의 그래프를 각각 타입별로 그린내용임.
막대그래프, 막대그래프 + 점, 점 + 라인
ㅎㅎㅎ
6 /18 --> 백그라운드 추가 좌표계 추가했음.
<< 새로 만든 모듈로 적용하여 그린 챠트임 >>
눈금 자동, Item항목 분리...
데이타 추가가 쉽게..
각 그래프별 속성 변경이 용이하게 객체 배치를 완료함.
'# 2) .Net ( Vs 2005 ) > WinForm' 카테고리의 다른 글
데이타 그리드 뷰 헤더 이용하기. (2) | 2009.08.06 |
---|---|
드디어 챠트를 만들다!!! (0) | 2009.06.19 |
일일 일정 관리 프로그램 II ( upGrade ) (0) | 2009.06.12 |
하루 하루.... 일정 기록하고 관리 하는 기능! (0) | 2009.06.09 |
TextBox 에서 Enter키가 눌렸을 때 Tab 이동.. 관련해서 두가지.. (0) | 2009.06.05 |