티스토리 툴바


블로그 이미지
내 생활과 잡다한 정보들을 모아두자.
호기심만땅

Notice

Recent Comment

Recent Trackback

Archive

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  • 7,527total
  • 1today
  • 4yesterday
2010/07/06 15:57 개발의 세계../기타

출처 : http://rkttu.com/235

The Code Project Open License (CPOL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Common Development and Distribution License (CDDL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Microsoft Public License (Ms-PL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Mozilla Public License 1.1 (MPL 1.1)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Common Public License Version 1.0 (CPL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Eclipse Public License 1.0

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The MIT License

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The BSD License

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Apache License, Version 2.0

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 예
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The Creative Commons Attribution-ShareAlike 2.5 License

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 아니오**
* 라이센스 전파 여부: 예**

The zlib/libpng License

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

공개 커뮤니티에 대한 공헌 (라이센스 아님)

* 저작권 보호: 아니오**
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 아니오
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 아니오

The GNU Lesser General Public License (LGPL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 아니오**

* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 예
* 라이센스 전파 여부: 예**

The GNU General Public License (GPL)

* 저작권 보호: 예
* 상용 소프트웨어에서 사용 가능: 예
* 버그 패치 및 기능 확장 제공의 의무: 예**
* 명시적 특허권 행사 가능 여부: 아니오**
* 사유 프로그램 (소스 비공개 프로그램)에서 사용 가능 여부: 아니오**

* 라이센스 전파 여부: 예**

노트: ** 기호가 붙은 항목은 라이센스 선택 시 고려해야 할 주의 사항입니다.
출처: http://www.codeproject.com/info/Licenses.aspx


'개발의 세계.. > 기타' 카테고리의 다른 글

오픈소스 라이센스 정리 [펌]  (0) 2010/07/06
VS2005 관련 튜토리얼  (0) 2007/09/21
정규표현식  (0) 2007/06/13
posted by 호기심만땅
2009/11/14 09:46 여행

 


☆ 1 . 안동 - 하회마을
☆ 2 . 안동 - 탈 박물관
☆ 3 . 정선 - 아우라지
☆ 4 . 태백 - 석탄 박물관
☆ 5 . 서산 - 간월암 일몰 풍경 고수동굴 

☆ 6 . 단양 - 고수동굴
☆ 7 . 진안 - 마이산 겨울풍경
☆ 8 . 영덕 - 강가에서 축산까지
☆ 9 . 영덕 - 일출과 강구항
☆ 10 . 서산 - 천수만 철새탐조여행 
☆ 11 . 부안 - 채석강
☆ 12 . 진부 - 오대산 설경
☆ 13 . 청송 - 주왕산 설경
☆ 14 . 신안 - 다도해의 보석 , 엘도라도
☆ 15 . 원주 - 치악산 설경 

☆ 16 . 완도 - 청산도
☆ 17 . 울릉도 - 유람선 관광
☆ 18 . 울릉도 - 내륙 관광
☆ 19 . 공주 - 계룡산 동학사
☆ 20 . 강진 - 다산초당과 다산유물관 
☆ 21 . 남제주 - 송악산
☆ 22 . 정읍 - 내장산(단풍)
☆ 23 . 봉화 - 내청량사와 김생굴
☆ 24 . 서천 - 신성리 갈대밭
☆ 25 . 강릉 - 오대산소금강 단풍 

☆ 26 . 양평 - 양수리 두물머리
☆ 27 . 영광 - 불갑사와 상사화
☆ 28 . 봉평 - 이효석 문화마을과 메밀밭
☆ 29 . 보령 - 무창포 해수욕장
☆ 30 . 보령 - 대천 해수욕장 
☆ 31 . 양양 - 학마을
☆ 32 . 부안 - 곰소만 갯벌여행
☆ 33 . 제주서부 - 용머리해안
☆ 34 . 부안 - 내변산 직소폭포
☆ 35 . 통영 - 동양의 나폴리 

☆ 36 . 최남단의 섬
☆ 37 . 성산포 - 해뜨는 일출봉
☆ 38 . 서귀포 - 천지연 폭포
☆ 39 . 고흥 - 소록도
☆ 40 . 용인 - 와우정사 
☆ 41 . 제주 - 섭지코지
☆ 42 . 제주 - 산방산 산방굴사
☆ 43 . 부여 - 궁남지
☆ 44 . 단양,영주 - 소백산
☆ 45 . 평창 - 오대산 상원사 

☆ 46 . 강릉 - 오대산 소금강
☆ 47 . 순천 - 선암사
☆ 48 . 춘천 - 남이섬
☆ 49 . 몽산포 해변 오프로드
☆ 50 . 태안 - 안면도 자연휴양림 
☆ 51 . 거제 - 해금강
☆ 52 . 합천 - 황매산
☆ 53 . 남원 - 바래봉 철쭉
☆ 54 . 괴산 - 화양 9곡
☆ 55 . 담양 - 소쇄원 

☆ 56 . 영월 - 래프팅
☆ 57 . 강촌 - 번지점프
☆ 58 . 성산포 스킨 스쿠버
☆ 59 . 강원 - 오프로드
☆ 60 . 화순 - 운주사 
☆ 61 . 청송 - 주산지
☆ 62 . 하동 - 쌍계사 10리 벚꽃
☆ 63 . 여수 - 돌산도 향일암
☆ 64 . 거제 - 외도
☆ 65 . 진안 - 겨울 마이산 

☆ 66 . 공주 - 계룡산 갑사
☆ 67 . 영덕 - 복사꽃마을
☆ 68 . 광양 - 섬진강변의 매화마을
☆ 69 . 완주 - 송광사와 벚꽃
☆ 70 . 구례 - 산수유마을 
☆ 71 . 언양 - 자수정동굴
☆ 72 . 당진 - 안섬 휴양공원
☆ 73 . 남양주 - 운길산 수종사
☆ 74 . 강진 - 백련사와 동백
☆ 75 . 영주.단양 - 소백산 설경 

☆ 76 . 무주 - 덕유산 눈꽃 산행
☆ 77 . 고성 - 거진항
☆ 78 . 양양 - 남대천 연어 축제
☆ 79 . 태안 - 안면도 꽂지일몰
☆ 80 . 고성 - 진부령 황태덕장 
☆ 81 . 양양 - 낙산 일출
☆ 82 . 강원 - 환상선 눈꽃 열차
☆ 83 . 태백 - 태백산설경
☆ 84 . 양양 - 설악 주전골
☆ 85 . 청송 - 주왕암과 주왕굴 

☆ 86 . 서산 - 간월도
☆ 87 . 홍성 - 천수만 철새
☆ 88 . 아산 - 외암리 전통마을
☆ 89 . 순천 - 낙안 읍성 민속마을
☆ 90 . 강릉 - 정동진 일출 
☆ 91 . 서귀포 - 해저 잠수함 투어
☆ 92 . 합천 - 가야산 홍류동 계곡
☆ 93 . 합천 - 매화산
☆ 94 . 영주 - 부석사
☆ 95 . 장성 - 만추의 백양사 

☆ 96 . 동두천 - 소요산 자재암
☆ 97 . 인제 - 백담사 계곡 단풍
☆ 98 . 영광 - 모악산 불갑사
☆ 99 . 보성 - 보성다원
☆ 100 . 고창 - 선운산 
☆ 101 . 화성 - 제부도
☆ 102 . 포항 - 내연산 12폭포 계곡
☆ 103 . 포항 - 청하 보경사
☆ 104 . 구리 - 한강둔치 장미공원
☆ 105 . 구리 - 코스모스공원 

☆ 106 . 영암 - 월출산
☆ 107 . 제주 - 우도 사빈백사
☆ 108 . 제주 - 우도
☆ 109 . 영월 - 섬안이강
☆ 110 . 여주 - 강변고찰 신륵사 
☆ 111 . 김천 - 직지사
☆ 112 . 영월 - 요선정과 요선암
☆ 113 . 창녕 - 화왕억새
☆ 114 . 창녕 - 화왕산 패러글라이딩
☆ 115 . 밀양 - 사자평 억새 

☆ 116 . 옹진 - 덕적도 자갈마당 해변
☆ 117 . 옹진 - 덕적도 서포리 해변
☆ 118 . 강화 - 마니산과 참성단
☆ 119 . 가평 - 청평호반
☆ 120 . 강화 - 석모도 
☆ 121 . 강화 - 석모도 보문사
☆ 122 . 봉평 - 흥정천 계곡
☆ 123 . 봉평 - 메밀꽃과 이효석생가
☆ 124 . 평창 - 대관령목장
☆ 125 . 강화 - 덕포진 

☆ 126 . 울진 - 덕구계곡
☆ 127 . 제주 - 성읍 민속마을
☆ 128 . 군산 - 선유도
☆ 129 . 하동,구례 - 섬진강 100리길
☆ 130 . 양양 - 낙산 해수욕장 
☆ 131 . 영덕 - 옥계계곡
☆ 132 . 포항 - 장기곶 해맞이
☆ 133 . 포항 - 장기곶
☆ 134 . 포항 - 구룡포해수욕장
☆ 135 . 통영 - 비진도 

☆ 136 . 태안 - 안면도 대하잡이
☆ 137 . 통영 - 소매물도 등대섬
☆ 138 . 양양 - 하조대 해변
☆ 139 . 춘천 - 위도
☆ 140 . 제천 - 월악산 용하구곡 
☆ 141 . 삼척 - 신남해변
☆ 142 . 단양 - 삼선구곡
☆ 143 . 단양 - 다리안 계곡
☆ 144 . 강릉 - 사천진항과 해변
☆ 145 . 남해 - 금산 보리암 

☆ 146 . 남해 - 금산절경
☆ 147 . 경주 - 문무왕 수중왕릉
☆ 148 . 창녕 - 화왕산 진달래
☆ 149 . 거제 - 구조라 해수욕장
☆ 150 . 거제 - 여차해변 
☆ 151 . 거제 - 학동몽돌해변
☆ 152 . 고성 - 상족암해변 (공룡발자국)
☆ 153 . 청도 - 소싸움 축제
☆ 154 . 보령 - 대천
☆ 155 . 괴산 - 선유동 계곡


출처 : http://blog.naver.com/kangjs3690/70048711092

'여행' 카테고리의 다른 글

국내 가볼만한 곳  (2) 2009/11/14
국내여행지 베스트 50  (0) 2009/11/14
posted by 호기심만땅
2009/11/14 09:21 여행

http://blog.daum.net/qsimon2000/2707382
여기서 퍼옴..

국내여행지 베스트 50

[강화] 시월애 촬영지 석모도
[제천] 내륙의 바다 청풍호반
[신안] 때뭇지 않은 자연 흑산도
[담양] 대나무골 테마공원
[태안] 꽃지 해안 공원

[남해] 다랭이 마을
[부안] 기암괴석의 채석강
[군산] 신선이 노닐던 선유도
[여수] 가 보고 싶은 섬 돌산도
[완도] 하늘도 바다도 푸른 청산도

[강릉] 바다와 가장 가까운역 정동진
[거제] 붉은 동백꽃섬 지심도
[진안] 한국의 불가사의 마이산 탑사
[창녕] 국내 최대의 자연늪 우포늪
[가평] 축령산 자락 아침고요수목원

[해남] 한반도의 땅끝 땅끝마을
[고성] 바다와호수가 있는 화진포
[화성] 바닷길이 열리는 제부도
[인천] 천국의 계단 촬영지 무의도
[진주] 진주성,촉석루,의암

[구례] 시와 함께떠나는 섬진강
[통영] 기암절벽 산행 짜릿한 사량도
[당진] 일출 일몰의 명소 왜목마을
[고창] 동백꽃 만발 선운사
[신안] 모래산이 아름다운 우이도

[순천] 낙안읍성 민속 마을
[삼척] 5억년 어둠 밝힌 환선굴
[거제] 남국의 파라다이스 외도
[영암] 달이 뜨는 산 월출산 국립공원
[보령] 신비의 바닷길 무창포

[울릉도] 뱃길로 찾는 신비의 섬
[구례] 푸근하고 경건함을 주는 큰산 지리산 국립공원
[속초] 사계절 진경의 최고 명산 설악산 국립공원
[양산] 천년고찰 한국불교의 정신적 지주 통도사
[합천] 법보종찰 팔만대장경 해인사

[단양] 기암호수의 진경 단양팔경
[정선] 청정자연 정선아리랑의 고장
[경주] 신라천년의 숨결 경주남산 문화답사
[변산] 생태관광지 변산반도 국립공원
[영주] 국보 보물로 가득한 아름다운 절 부석사

[청송] 빼어난 경관 내륙의 주왕산
[광양] 매화향기 가득한 청매실농원
[옹진] 자연의 매력에 푹 빠지는 최북단 백령도
[울진] 진귀한 문화와 온천의 고장
[봉평] 메밀과 문학의 고장

[철원] 비상하는 겨울철새 아름다운 평야
[서산] 새와 사람의 아름다운 만남 서산 천수만
[무안] 문화와 연꽃축제의 고장
[포항] 12폭포의 진경 내연산 보경사

'여행' 카테고리의 다른 글

국내 가볼만한 곳  (2) 2009/11/14
국내여행지 베스트 50  (0) 2009/11/14
posted by 호기심만땅
2009/09/30 01:47 퍼오기..
 

저도 SSD 유저중 한명으로써 정보들을 일일히 찾아보고 생각도 해보려니 귀찮아서 백업하자는 의미에서 한번 적어봅니다.



1. SSD 구매후 펌웨어 업데이트

아직 SSD가 초기라 그런지 펌웨어에 따라 성능차이가 나는 경우가 있기 때문에 펌웨어 업데이트를 꼭 해주셔야됩니다.

그런데 SSD는 HDD와 다르게 펌업 Flash를 하면 자료가 다 날아가버리니 이왕이면 구매후에 바로 해주는것이 좋겠습니다.

엠트론, 인텔 제품은 펌업해도 자료 안지워진다고 하는데 요즘 많이들 쓰시는 OCZ 버텍스는 자료 지워집니다.

엠트론: http://www.mtron.net/Korea/Customer/firmware_list.asp

인텔: http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=17485

OCZ: http://www.ask-korea.com/tt/site/ttboard.cgi?db=oczfaq



2. 클러스터 사이즈, 포멧 형식 변경

본 게시판에서 프리징 관련 검색을 해보시면 FAT32와 클러스터 사이즈 32k로 사용을 하면 더 좋다고 합니다.

SSD 고유의 프리징 문제를 해결할수 있는 팁중에 위 내용은 항상 들어가더라구요.

저는 파티션매직으로 부팅해서 쉽게 변경하였습니다만 혹시나 싶어서 윈도우 설치전에 작업해주었습니다.

필수로 해주실 필요는 없지만 SSD 이용하시는 많은분들이 권장하시는 팁입니다.

스눕 xp 등으로 부팅하면 파티션매직으로 부팅가능합니다 ^^

관련 링크1: http://www.coolenjoy.net/bbs/zboard.php?id=hdd&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=32k&select_arrange=headnum&desc=asc&no=519



3. 바이오스 RAID 모드로 변경

뭐 대부분 유저분들이 SSD 용량 부족때문에 레이드 0 을 이용하거나 단일이라 해도 미리 설정해두시는게 좋습니다.

바이오스에서 IDE 모드를 RAID 모드로 변경하고 부팅시 Ctrl+I 로 레이드 0 설정과 스트립 사이즈 128k로 설정해줍니다.

관련 링크1: http://www.coolenjoy.net/bbs/zboard.php?id=hdd&no=760&category=&page=1



4. 윈도우 설치 (레이드 드라이버 설치)

비스타 까시는분이라면 상관없지만 XP 사용하시는분은 아예 Snoopy Final 같이 레이드 드라이버 통합된 트윅버전...

혹은 윈도우 설치시 디스켓(부팅USB)를 이용해 따로 레이드 드라이버를 윈도우 설치와 함께 설치를 해주셔야합니다.

그냥 보통은 정품XP 설치하면서 F6 눌러주고 부팅되는 USB를 이용해 레이드 드라이버 깔아주면 됩니다.

윈도우 설치후에는 꼭 Intel Matrix Storage를 설치해주시고 쓰기 캐쉬를 활성화 해줍니다.

관련 링크1: http://www.parkoz.com/zboard/view.php?id=my_tips&no=8751

관련 링크2: http://www.parkoz.com/zboard/view.php?id=my_tips&no=11050



5. SSD 사용시 팁

SSD는 항상 총 용량의 20% 정도는 비워두시는걸 대부분 권장하시더라구요.

그리고 충분한 RAM 이 있으신 경우에는 램디스크를 설정해서 최소한 인터넷 임시폴더라도 램디스크에 설정해주세요.

SSD 프리징 가장 큰 이유가 용량 작은 파일을 수없이 쓰고 읽고 할때 발생을 한다고 하는데,

인터넷 이용시에 가장 이런 작업이 많기 때문에 램디스크만 활용해도 좋다고 합니다.

제 경우에는 램디스크 1G에 인터넷 임시폴더+윈도우 임시폴더 둘다 설정해서 사용중입니다.

메모리가 부족해 가상메모리 사용하시는분은 다른 보조 HDD등으로 옮기는게 좋다고합니다만,

역시나 SSD 구매할정도면 RAM 용량 충분히 확보하셔서 램디스크를 꼭 활용해주시는것을 권장합니다.

그리고 SSD는 조각모음을 하면 역시나 HDD와는 다르게 역효과이니 해주실 필요가 없습니다.

윈도우 서비스중에 Index Service 항목을 종료시켜줍니다. HDD 유저분들도 이건 해주시는게 좋습니다.

또한 윈도우 Prefetch 와 시스템 복원 기능은 SSD 에서 쓸모가 없거나 비효율적이니 꺼주시는게 효과적입니다.

마지막으로 SSD 에서 슈퍼캐쉬는 쓰지 않는게 좋다고 합니다.

관련 링크1: http://www.thinkmania.com/zb40/zboard.php?id=ibmboard2&no=104041

관련 링크2: http://cafe.naver.com/newssd/1480

관련 링크3: http://www.parkoz.com/zboard/view.php?id=dm_storage_qna&page=1&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=391



6. 사용후 포멧을 해야될때

SSD 특징상 오래 사용해도 일반 HDD 처럼 느려지는 증상이 없지만, 포멧을 하면 오히려 느려진다고 합니다.

포멧이라는것이 실제로 데이터를 완전히 삭제 시키는게 아니라 SSD 에서는 독이라고 합니다.

인텔사의 HDDERASE 를 이용해서 공장출하상태로 되돌려야 제 속도가 나온다고 하네요 ^^

HDDERASE를 부팅 디스켓 넣으시고 바이오스에서 IDE 모드로 변환후 실행하면 된다고 합니다.

SSD에서 이 작업은 포멧이란 단어보다는 초기화라고 말씀하시더라구요.

관련 링크1: http://www.parkoz.com/zboard/view.php?id=dm_storage_qna&page=1&sn1=&divpage=1&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=396

 

읽어주셔서 감사합니다. SSD 초기시장이라 여러가지 신경써줘야할 부분이 있습니다.

하지만 정말 HDD 와는 넘사벽인 SSD 만의 성능을 느껴보시길 바랍니다.

 

 

================댓글들==================

 

 

 
 
  lv.7일단뛰엇 = 이정백 (2009/04/22 - 15:00:49)  ip : 211.168.82.xxx
생각보다 번거로운 준비작업들이 있군요, 이것저것 귀찮은분들은 벨로시 레이드로 편안하게 가심이 ;;/
@ 추천 
 
 
 
  칸 = 김유곤 (2009/04/22 - 15:03:34)  ip : 211.232.54.xxx
좋은 팁이군요. ^^/
@ 추천 
 
 
 
  센치 = 오정석 (2009/04/22 - 15:20:59)  ip : 210.94.230.xxx
펌웨어 업데이트 얼마전햇는데 자료 그대로던데여 ㅎㅎ/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 15:22:06)  ip : 210.97.37.xxx
그런가염.. ㅎㅎ 저는 OCZ 버텍스 펌업하는 팁보니까 다 날아간다 되어있어서../
@ 추천 
 

 
 
  센치 = 오정석 (2009/04/22 - 15:23:44)  ip : 210.94.230.xxx
아 저는 엠트론 ^^/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 15:26:13)  ip : 210.97.37.xxx
아 제가 쓰는 엠트론은 사자마자 펌업해서 잘 모르겠네요

일단 펌업이라는게 위험성이 항상 있는것이니 ^^/
@ 추천 
 
 
 
  [80´s]낭이 = 김상효 (2009/04/22 - 15:41:56)  ip : 211.59.106.xxx
저그럼..윈도우 깔때 포멧을하고 깔잔아요... 그건 어떻게 해야되죠? 인텔 HDDERASE로 하라고 말해줄수도 없구..~_~;;/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 16:11:12)  ip : 210.97.37.xxx
HDDERASE로 부팅해서 싹 지워주고 윈도우 설치할때 포멧하면 자료없는 상태에서 포멧되는거니 상관없을듯합니다.
자료 꽉 채운상태에서 포멧을 한뒤에 윈도우 사용을 하면 그때부턴 사실상 원래 있던 자료를 지우면서 다시 자료를 쓰기때문에 느려집니다.
참고링크
http://cafe.naver.com/intelssd.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=464
http://cafe.naver.com/intelssd.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=637
http://www.parkoz.com/zboard/view.php?id=dm_storage_qna&no=396/
@ 추천 
 
 
 
  [80´s]달려라달려 = 김찬호 (2009/04/22 - 16:45:38)  ip : 119.70.185.xxx
멋진 팁 감사합니다 ^^/
@ 추천 
 
 
 
  월랑 = 임지용 (2009/04/22 - 16:57:59)  ip : 166.104.142.xxx
좋은 정보 감사드립니다. 내일 드뎌 지른 OCZ SSD가올 예정이라..
많이 도움될것 같네요
/
@ 추천 
 
 
 
  오리지날킴 = 김영준 (2009/04/22 - 17:55:42)  ip : 125.176.227.xxx
단일 4기가 이상 파일은 ntfs에서만 되지 않나요?/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 18:39:58)  ip : 121.144.18.xxx
넵 맞습니다.
저는 단일 4기가 이상 파일을 SSD에 저장할 이유가 없어서 FAT으로 포멧했습니다.
SSD를 저장용 하드로 쓰시는분은 없겠죠?^^;; 많은분들이 FAT32로 SSD 사용하고 계십니다./
@ 추천 
 
 
 
  컴덕후 = 박재성 (2009/04/22 - 17:58:18)  ip : 222.101.183.xxx
질문하나 드릴께요... 현재 엠트론 32기가 제품 달일로 사용중인데
처음 구입해서 os가 제대로 안깔려서 10번정도 포멧을 했는데
테스트 해보면 다른 벤치와 비슷한 속도가 나오는데
HDDERASE는 해주면 속도 향상이 있을까요?

/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 18:42:45)  ip : 121.144.18.xxx
SSD를 자료로 다 채우고 나서 포멧을 하는 경우가 반복되는경우를 말하는듯합니다.
여러자료 검색해보니 빠른포멧의 경우에는 디스크에 0 또는 1 데이터를 덮어쓰지 않아서 상관없다는분도 계시네요.
HD TUNE으로 속도 측정해보시고 정상값나오시면 그냥 사용하셔도 무방할듯 합니다.
제 경우에는 SSD 를 절반이상 용량을 사용한 상태이기 때문에 혹시 나중에 포멧할일이 있으면 HDDERASE로 밀예정입니다.
/
@ 추천 
 
 
 
  9900GTX = 이진관 (2009/04/22 - 18:11:32)  ip : 220.76.22.xxx
좀 번잡 스럽긴 하네요 좋은 정보 감사합니다 ^^/
@ 추천 
 
 
 
  에스까르고 = 최치욱 (2009/04/22 - 19:47:20)  ip : 211.219.122.xxx
좋은 정보 감사합니다%%/
@ 추천 
 
 
 
  민물장어의꿈 = 신상민 (2009/04/22 - 20:04:40)  ip : 59.22.115.xxx
나중에 SSD를 사용할 때 유용하게 참고 하겠습니다. 좋은 정보 고맙습니다./
@ 추천 
 
 
 
  꼬시 = 김진형 (2009/04/22 - 20:20:21)  ip : 113.61.3.xxx
벨로시랩터 150기가 두개를 레이드 0으로 묶어서 사용중입니다만

SSD가 급땡김이네여 차이가 많이 날까요?
/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/22 - 20:28:45)  ip : 121.144.18.xxx
저는 HDD 에서 바로 넘어왔는데 싱글인데도 체감 넘사벽입니다.
부팅시 바로 게임실행과 인터넷등등을 할수있다는건 기본이고...
램디스크+SSD 활용으로 게임 최소프레임까지 잡아주고 갑자기 급격히 떨어지는 프레임조차없습니다.
그리고 아주 많은 작업을 해도 소음이 없어서 불안감이 덜합니다.
왜냐면 HDD 사용중에는 드르륵소리가 완전 계속되면서 느려지는 현상이 발생하잖아요 ㅋㅋ/
@ 추천 
 
 
 
  아프로디테ll = 추문호 (2009/04/22 - 20:35:45)  ip : 116.126.135.xxx
좋은 정보 감사합니다.^^/
@ 추천 
 
 
 
  오즐가이 = 김경환 (2009/04/22 - 21:28:09)  ip : 221.151.254.xxx
정보 감사합니다../
@ 추천 
 
 
 
  누군가옆에서 = 황석훈 (2009/04/22 - 22:00:39)  ip : 119.71.107.xxx
좋은 정보 감사합니다/
@ 추천 
 
 
 
  재료역학 = 조민재 (2009/04/23 - 00:25:52)  ip : 61.99.42.xxx
저궁금해서 그런데요..

단일 드라이브도 raid를 깔수있나요?

/
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/23 - 01:15:30)  ip : 121.144.18.xxx
RAID를 깐다기보다 RAID 모드로 사용할수 있습니다.
실제로는 두개의 드라이브가 있어야 묶을수는 있지만요.
미리 RAID 모드를 해두고 윈도우 설치를 하시면 추후 드라이브 구매를 해서 고스트 백업을 하고 레이드로 묶은뒤에,
고스트로 복원을 하시면 자료 그대로 바로 사용이 가능합니다.
IDE 모드로 깔아뒀으면 RAID 드라이버가 없으므로 포멧후에 다시 윈도우 설치를 해주셔야됩니다./
@ 추천 
 
 
 
  뿡스 = 유상현 (2009/04/23 - 01:58:45)  ip : 211.225.18.xxx
HDDERASE란게 프로그램인가요 ?
공장 출하상태라면 로우포멧 한것일텐데
각 브랜드마다 로우포멧 파일이 따로 있는걸로 알고 있는데
HDDERASE는 뭔가요 ? /
@ 추천 
 

 
 
  Shine* = 이상봉 (2009/04/23 - 09:02:16)  ip : 210.97.37.xxx
프로그램 입니다.. IDE 모드에서 바이오스 펌업할때처럼 실행해주면 됩니당...
인텔 프로그램이라는데 파코즈에 iso로 여러 유틸 포함된 자료에 포함되있고 인텔SSD 카페에서도 다운가능하네요./
@ 추천 
 
 
 
  진서&성민아빠 = 박동현 (2009/04/23 - 03:52:13)  ip : 203.248.234.xxx
좋은 정보 감사합니다.. 스크랩 해갑니당. ^^/
@ 추천 
 
 
 
  장독이 = 김장현 (2009/04/24 - 10:05:54)  ip : 61.84.5.xxx
정말 좋은 정보 감사합니다... 스크랩하고...추천드립니다~^^/
@ 추천 
 
 
 
  덤블 = 김형근 (2009/04/24 - 11:34:42)  ip : 116.46.71.xxx
유용한 정보 감사합니다~/
@ 추천 
 
 
 
  surellin = 이중석 (2009/04/25 - 09:50:34)  ip : 125.135.69.xxx
대충 눈팅만 하면서 막연히 좋은데 비싸서 못쓰겠구나했는데

아직 이런 저런 문제점이 있는거 같군요. 컴퓨터 잘 모르시는분들은

좋은 제품 사놓고 활용을 잘 못할수도있겠어요. 좋은 정보 감사드립니다./
@ 추천 
 
 
 
  nadree = 오정렬 (2009/04/25 - 12:25:18)  ip : 58.120.50.xxx
정말 유용한 글이네요 아직은 ssd가 확실하게 실용적으로 다가오진 않은 모양입니다 개선되고 가격도 좀 더 떨어져야 할텐데요/
@ 추천 
 
 
 
  AQVA = 한진 (2009/04/25 - 21:49:21)  ip : 115.86.90.xxx
Prefetch 요건 어디서 끄면 되나요^^?/
@ 추천 
 
 
 
  배우고싶어요 = 김은택 (2009/04/27 - 12:37:33)  ip : 125.142.30.xxx
곳ssd 하나 지를까 준비 중인데 좋은거 배우고 가내요../
@ 추천 
 
 
 
  아일랜드 = 오경남 (2009/05/02 - 19:23:27)  ip : 116.33.144.xxx
좋은자료네요/
@ 추천 
 
 
 
  제로쿨 = 오종택 (2009/05/03 - 19:26:34)  ip : 124.53.10.xxx
나중을 위해서라도 스크랩 해놔야 겠네요~~~ 좋은 자료네요/
@ 추천 
 
 
 
  혁만 = 권혁만 (2009/05/06 - 09:03:46)  ip : 202.30.207.xxx
좋은 자료입니다. SLC SSD를 믿고 별거 안했었는데..
일단 메모리가 충분하다면 램디스크 사용은 필수입니다.

팁을 하나 더 넣자면...

수퍼캐시라는 프로그램이 있습니다. 요넘을 사용하면 엑세스타임을 조금 더 줄일 수 있지요.. 이미 빠른 SSD지만, 프리징 해소에 도움이 된다고 합니다(특히 MLC에서) 하지만 XP에서만 사용가능합니다.

프리패치나 수퍼패치는 싹다 꺼버리고, 인덱싱 이런것도 다 죽여버리는게 좋죠...

 

그나저나, SLC 64G 하나면 될것같은데 요넘 구하려니 총알이 만만찮네요 ㅠㅠ/

 

 

 

 

출처 : http://www.coolenjoy.net/bbs/zboard.php?id=hdd&no=1896 

 

'퍼오기..' 카테고리의 다른 글

SSD 유저가 참고해야될 작업들  (0) 2009/09/30
주문을 외워봐  (0) 2008/01/30
We Are the World  (0) 2007/08/31
posted by 호기심만땅

 

Jesse Liberty
이 글을 이해하려면 C++에 대한 기본 지식이 있어야 합니다.
난이도? ?? 1?? 2?? 3?
요약 :C#는 C++의 구문과 의미를 바탕으로 설계되었으므로, C 프로그래머는 .NET 및 공용 언어 런타임을 충분히 활용할 수 있습니다. C++에서 C#으로의 전환은 비교적 쉬운 작업이지만, new, struct, 생성자 및 소멸자에 대한 변경 사항을 포함하여 몇 가지 유의해야 할 부분도 있습니다. 이 글에서는 가비지 수집, 속성, foreach 루프 및 인터페이스와 같은 C#에서 새로운 언어 기능을 살펴봅니다. 인터페이스를 다루면서 속성, 배열 및 기본 클래스 라이브러리도 함께 다룰 것입니다. 이어서, 비동기 I/O, 특성 및 검토, 형식 발견, 동적 호출 등에 대해 살펴봅니다.
거의 10년을 주기로 개발자들은 새로운 프로그래밍 기술을 익히기 위해 시간과 노력을 투자하고 있습니다. 1980년대 초에는 Unix와 C, 1990년대 초에는 Windows와 C++, 그리고 지금은 Microsoft .NET Framework와 C#이 대표적입니다. 이러한 과정이 진행되면서 들인 비용보다는 얻는 이익이 훨씬 더 많았습니다. 반가운 소식은 C#과 .NET으로 이루어지는 거의 모든 프로젝트의 분석 및 디자인 단계가 C++과 Windows의 방식에서도 바뀐 점이 별로 없다는 것입니다. 하지만 새로운 환경에서의 프로그래밍 접근 방식에는 상당한 차이가 있습니다. 이 글에서는 C++ 프로그래밍에서 C# 프로그래밍으로 전환할 수 있는 방법과 정보를 소개합니다.
C# 구현의 향상 내용에 대해 소개한 자료는 많으므로 여기에서 다시 반복하지는 않겠습니다. 대신, C++과 C# 사이에 가장 많이 변경되었다고 생각되는 사항, 즉 관리가 없는 환경에서 관리 가능한 환경으로의 변화에 대해 집중적으로 살펴볼 것입니다. 또한 부주의한 C++ 프로그래머들이 주의해야 할 몇 가지 중요한 함정에 대해 소개하고, 프로그램 구현 방법에 영향을 미치는 새로운 언어 기능에 대해서도 살펴볼 것입니다.

맨 위로


관리 가능한 환경으로 이동

C++은 플랫폼에 구애 받지 않는 하위 단계 수준 의 개체 지향형 프로그래밍 언어로 고안되었습니다. C#은 C++보다 상위 단계 수준 의 구성 요소 지향형 언어로 고안되었습니다. 관리 가능한 환경으로의 이동은 프로그래밍이라는 영역에서는 커다란 변화입니다. C#은 정확한 제어 보다는 전체적인 모습을 볼 수 있는 프레임워크를 제공합니다.
예를 들어, C++의 경우 생성은 물론 개체의 레이아웃에 대해서도 많은 제어 권한을 가집니다. 즉 C++은 배치 연산자 new를 사용하여 개체를 다른 개체 스택 및 힙 위에 또는 메모리의 특정 위치에도 만들 수 있습니다.
.NET의 관리 가능한 환경에서는 이러한 수준의 제어를 포기해야 합니다. 개체의 형식을 선택하면 해당 개체가 어디에 만들어지는지 암시적으로 정해집니다. 일부 형식(int, double 및 long)은 항상 스택(다른 개체 내부에 포함되는 경우 제외)에 만들어지고, 클래스는 항상 힙에 만들어집니다. 개체를 힙의 어디에 만들 것인지 제어할 수 없고, 해당 주소를 얻을 수 없으며, 특정 메모리 위치에 둘 수도 없습니다. 이러한 제약 사항을 해결할 수 있는 방법이 있기는 하지만 이 글의 주제에서 벗어나므로 생략하도록 합니다.
이제는 더 이상 개체의 수명을 제어할 수 없습니다. C#에는 소멸자가 없습니다. 개체 저장 영역에 대한 참조가 더 이상 없을 경우에는 가비지 수집기가 해당 항목의 저장 영역을 회수할 것이지만, 그 시기에 대해서는 알 수 없습니다.
C#의 구조를 통해 기본 프레임워크를 알 수 있습니다. 다중 상속은 관리되거나 가비지 수집이 이루어지는 환경에서는 효과적으로 구현하기가 매우 어렵고, 일반 사항은 프레임워크에서 구현되지 않았기 때문에 다중 상속과 템플릿이 없습니다.
간단한 C# 형식은 하부 CLR(공용 언어 런타임) 형식에 대한 매핑에 불과합니다. 예를 들면, C# int는 System.Int32에 매핑됩니다. C#에서 형식은 언어가 아닌 공용 형식 시스템에 의해 결정됩니다. 사실, 사용자가 Visual Basic 개체에서 C# 개체를 만들어 내는 능력을 보유하려면 모든 .NET 언어에 의해 공유되는 기능인 공용 언어 하위 집합에 종속되어야 합니다.
반면, 관리 가능한 환경 및 CLR를 통해 많은 이점을 얻을 수 있습니다. 가비지 수집 및 모든 .NET 언어에서의 단일 형식 시스템 이외에도, 크게 향상된 구성 요소 기반 언어를 얻게 됩니다. 구성 요소 기반 언어는 버전 관리를 완벽하게 지원하고 리플렉션를 통해 런타임에서 사용 가능한 확장가능 메타 데이터를 제공합니다. 후기 바인딩을 특별히 지원할 필요도 없습니다. 형식 찾기 및 후기 바인딩은 언어에 포함되어 있습니다. C#에서는 열거 및 속성이 언어의 첫 번째 클래스이고 이벤트 및 대리자(형식에 관계 없는 함수 포인터)와 마찬가지로 하부 엔진에 의해 완벽하게 지원됩니다.
하지만 관리 가능한 환경의 최대 장점은 .NET Framework입니다. 프레임워크는 모든 .NET 언어에서 사용할 수 있고, C#은 프레임워크의 풍부한 클래스, 인터페이스 및 개체로 프로그래밍할 수 있도록 최적으로 고안된 언어입니다.

맨 위로


함정

C#은 C++와 크게 달라 보이지 않기 때문에 전환이 쉬울 수 있지만, 여기에는 분명히 유의해야 할 함정이 있습니다. C++에서는 완벽하게 보이는 코드를 작성한 후 컴파일되지 않거나, 심한 경우 예상대로 작동하지 않을 수도 있습니다. C++에서 C#으로의 구문상 변화는 크지 않습니다. 다만 클래스 선언 뒤에 세미콜론이 없고, Main을 대문자로 시작한다는 정도입니다. 구문상의 변화를 쉽게 참고할 수 있도록 이러한 목록을 게시한 웹 페이지를 만들고 있지만, 컴파일러에서 쉽게 다룰 수 있으므로 여기에서는 다루지 않겠습니다. 그렇다고 해도 문제를 일으킬 수 있는 몇 가지 중요한 변화는 있음을 강조하고 싶습니다.

맨 위로


참조 및 값 형식
C#에서는 값 형식과 참조 형식을 구분합니다. 단순 형식(int, long, double 등) 및 struct는 값 형식이고, 모든 클래스는 개체와 마찬가지로 참조 형식입니다. 값이 참조 형식 내부에 포함되지 않을 경우, 값 형식은 C++의 변수와 같이 스택에서 값을 가집니다. 참조 형식 변수는 스택에 있지만, C++의 포인터와 유사하게 힙에서 개체의 주소를 가집니다. 값 형식은 값(복사본)에 의해 메서드에 전달되는 반면, 참조 형식은 참조에 의해 효율적으로 전달됩니다.

맨 위로


Struct
Struct는 C#에서 많이 다릅니다. C++의 경우 struct는 기본 상속 및 기본 액세스가 전용이 아닌 공용이라는 점만 제외하면 클래스와 동일합니다. 그러나 C#에서의 struct는 클래스와 매우 다릅니다. C#의 struct는 경량 개체를 캡슐화하기 위해 디자인되었습니다. 즉 struct는 참조 형식이 아닌 값 형식이므로 값에 의해 전달됩니다. 또한 클래스에 적용되지 않는 제한 사항이 있습니다. 예를 들어, struct는 봉인되어 있습니다, 즉 struct는 개체에서 파생되는 System.ValueType에서 파생될 수 없으며? 그것과 다른 기본 클래스를 가질 수도 없습니다. struct는 기본(parameterless) 생성자를 선언할 수 없습니다.
반면, struct는 클래스보다 더욱 효율적이므로 경량 개체 생성에 가장 적합합니다. struct의 봉인 및 값 의미가 문제가 안 된다면 아주 작은 개체를 만들 때는 클래스보다 struct를 사용하는 것이 훨씬 유리합니다.

맨 위로


모든 것은 개체에서 파생
C#의 경우 모든 것은 결국 개체에서 파생됩니다. 여기에는 생성 클래스는 물론 int 또는 struct와 같은 값 형식이 포함됩니다. 개체 클래스는 ToString과 같은 유용한 메서드를 제공합니다. 예를 들면, C#의 cout라 할 수 있는 System.Console.WriteLine 메서드인 ToString을 사용할 경우입니다. 이 메서드는 오버로드되어 개체의 문자열 및 배열을 가집니다.
WriteLine을 사용하려면 기존 방식의 printf와는 달리 대체 매개 변수를 제공해야 합니다. myEmployee가 사용자 지정된 Employee 클래스의 인스턴스이고 myCounter가 사용자 지정된 Counter 클래스의 인스턴스라고 가정해 보겠습니다. 다음과 같은 코드를 작성할 수 있습니다.
Console.WriteLine("The employee: {0}, the counter value: {1}", 
                  myEmployee, myCounter);
WriteLine은 각 개체에 대해 가상 메서드인 Object.ToString을 호출하여 매개 변수 대신 반환된 문자열로 대체합니다. Employee 클래스가 ToString을 재정의하지 않을 경우, 기본 구현(System.Object에서 파생)이 호출되어 문자열로 클래스의 이름을 반환합니다. Counter는 ToString을 재정의하여 정수 값을 반환할 것입니다. 이 경우, 출력은 다음과 같습니다.
The employee: Employee, the counter value: 12
정수 값을 WriteLine에 전달할 경우는 어떻게 될까요? 정수에 대해 ToString을 호출할 수는 없지만, 컴파일러는 값이 정수 값으로 설정될 개체의 인스턴스에서 int를 암시적으로 가둘 수 있습니다. WriteLine이 ToString을 호출할 경우 개체는 정수의 값을 나타내는 문자열을 반환합니다. (그림?1 참고)

맨 위로


Reference 매개 변수 및 Out 매개 변수
C++과 마찬가지로 C#에서도 메서드는 하나의 반환 값만 가질 수 있습니다. C++의 경우 포인터 또는 참조를 매개 변수로 전달하여 이 제한 사항을 해결할 수 있었습니다. 호출된 메서드가 매개 변수를 변경하고, 호출하는 메서드는 다시 새로운 값을 사용할 수 있습니다.
참조를 메서드에 전달하면 C++에서 참조 또는 포인터 전달을 통해 액세스하는 방식과 동일하게 원래 개체에 액세스할 수 있습니다. 하지만 이런 방식이 값 형식의 경우에는 해당되지 않습니다. 값 형식을 참조로 전달하려는 경우에는 값 형식 매개 변수를 ref 키워드로 표시해야 합니다.
public void GetStats(ref int age, ref int ID, ref int yearsServed)
ref 키워드는 메서드 선언과 메서드에 대한 실제 호출 모두의 경우에 사용해야 한다는 점을 유의하십시오.
Fred.GetStats(ref age, ref ID, ref yearsServed);
이제 호출 메서드에서 age, ID 및 yearsServed를 선언하고 GetStats로 전달하면 변경된 값을 얻게 됩니다.
C#에서는 명확한 할당이 필요합니다. 즉 로컬 변수, age, ID 및 yearsServed는 GetStats를 호출하기 전에 초기화되어야 합니다. 이것은 불필요한 수고입니다. 이것들은 단지 GetStats에서 값을 얻기 위해서만 사용되기 때문입니다. 이 문제를 해결하기 위해 C#에서는 out 키워드도 제공합니다. 이 키워드는 초기화되지 않은 변수를 전달하고 참조에 의해 전달되도록 지정합니다. 다음은 이러한 의도를 명시적으로 나타내는 방법입니다.
public void GetStats(out int age, out int ID, out int yearsServed)
이 때, 호출 메서드는 일치해야 합니다.
Fred.GetStats(out age,out ID, out yearsServed);

맨 위로


New 호출
C++의 경우, 키워드 new는 힙의 개체를 인스턴스화합니다. 하지만 C#의 경우는 그렇지 않습니다. 참조 형식의 경우, new 키워드는 힙의 개체를 인스턴스화합니다. 하지만 struct와 같은 값 형식의 경우 개체는 스택에서 생성되고 생성자가 호출됩니다.
사실, new를 사용하지 않고 스택에 struct를 생성할 수도 있지만 조심해야 합니다. new는 개체를 초기화합니다. new를 사용하지 않을 경우 struct의 값을 사용하기 전에, 즉 메서드에 전달하기 전에 모든 값을 직접 초기화해야 하며, 그렇지 않을 경우 컴파일되지 않습니다. 또한 명확한 할당을 위해서는 모든 개체가 초기화되어야 합니다. (그림?2 참고)

맨 위로


속성
대부분의 C++ 프로그래머는 멤버 변수를 전용으로 유지하려고 합니다. 이러한 데이터 숨김을 통해 캡슐화가 용이하고 클라이언트가 의존하는 인터페이스를 건드리지 않고도 클래스의 구현을 변경할 수 있기 때문입니다.그러나 클라이언트가 직접 이러한 멤버의 값을 얻거나 설정할 수 있게 하기 위하여, C++ 프로그래머는 전용 멤버 변수의 값을 수정하는 일을 담당하는 접근자 메서드를 생성합니다.
C#에서 속성은 클래스의 첫 번째 클래스 멤버입니다. 클라이언트에게 속성은 멤버 변수로 보이지만, 클래스 구현자에게는 메서드로 보입니다. 이런 개념은 적절하다고 볼 수 있습니다. 즉 프로그래머는 완전한 캡슐화 및 데이터 숨김이 가능하고 클라이언트는 멤버에 쉽게 액세스할 수 있기 때문입니다.
Employee 클래스에 Age 속성을 제공하여 클라이언트가 employee의 age 멤버를 얻고 설정하도록 할 수 있습니다.
public int Age
{
    get
    {
        return age;
    }
    set
    {
        age = value;
    }
}
키워드 값은 속성에서 암시적으로 사용할 수 있습니다. 다음과 같이 작성하는 경우,
Fred.Age = 17;
컴파일러는 값으로 17을 전달합니다.
Set 접근자가 아닌 Get 접근자를 사용하여 YearsServed에 대해 읽기 전용 속성을 만들 수도 있습니다.
public int YearsServed
{
    get
    {
        return yearsServed;
    }
}
이러한 접근자를 사용하기 위해 드라이버 프로그램을 변경할 경우 어떻게 작동하는지 볼 수 있습니다. (그림?3 참고)
속성을 통해 Fred의 age를 얻은 다음, 이 속성을 사용하여 age를 설정할 수 있습니다. YearsServed 속성을 액세스하여 값을 얻을 수 있지만 설정할 수는 없습니다. 마지막 줄에서 주석을 제거하지 않을 경우 프로그램이 컴파일되지 않습니다.
나중에 데이터베이스에서 Employee의 age를 가져오려는 경우 접근자 구현만 변경하면 됩니다. 클라이언트는 아무런 영향을 받지 않습니다.

맨 위로


배열
C#에서는 기존의 C/C++ 배열보다 개선된 버전의 배열 클래스를 제공합니다. 예를 들어, C# 배열의 범위를 벗어나서 작성하는 것은 불가능합니다. 또한 Array에는 더 진보적인 기능의 ArrayList도 있습니다. ArrayList는 프로그램의 크기 변화에 대한 요구 사항을 동적으로 관리할 수 있습니다.
C#에서 배열은 1차원, 다차원 사각형 배열(C++ 다차원 배열과 유사) 및 가변 배열(배열안의 배열)의 세 종류로 사용 가능합니다.
1차원 배열은 다음과 같이 만들 수 있습니다.
int[] myIntArray = new int[5];
또는, 다음과 같이 초기화할 수도 있습니다.
int[] myIntArray = { 2, 4, 6, 8, 10 };
다차원 사각형 배열은 다음과 같이 만들 수 있습니다.
int[,] myRectangularArray = new int[rows, columns];
또는, 다음과 같이 간단히 초기화할 수도 있습니다.
int[,] myRectangularArray =  
{
    {0,1,2}, {3,4,5}, {6,7,8}, {9,10,11}
};
가변 배열은 배열안의 배열이므로 1차원만 제공하면 됩니다.
int[][] myJaggedArray = new int[4][];
그런 다음, 다음과 같이 각 내부 배열을 만듭니다.
myJaggedArray[0] = new int[5]; 
myJaggedArray[1] = new int[2]; 
myJaggedArray[2] = new int[3]; 
myJaggedArray[3] = new int[5]; 
배열은 System.Array 개체에서 파생되므로 Sort 및 Reverse를 포함하여 많은 수의 유용한 메서드와 함께 사용됩니다.

맨 위로


인덱서
자신만의 배열 같은 개체를 만들 수도 있습니다. 예를 들면, 표시가 가능한 문자열 집합을 가진 목록 상자를 만들 수 있습니다. 배열에서 하듯이 인덱스로 상자의 내용을 액세스할 수 있다면 편리할 것입니다.
string theFirstString = myListBox[0];
string theLastString = myListBox[Length-1];
이것은 인덱서를 이용하면 가능합니다. 인덱서는 속성과 비슷한 점이 많지만, 인덱스 연산자의 구문을 지원합니다. 그림 4에서는 속성을 보여주는데 속성의 이름 다음에 인덱스 연산자가 옵니다.
그림?5는 아주 간단한 ListBox 클래스를 구현하고 인덱스 기능을 제공하는 방법을 보여 줍니다.


맨 위로


인터페이스
소프트웨어 인터페이스는 두 형식이 상호 작용하는 방식에 대한 계약입니다. 한 형식이 인터페이스를 등록하면 클라이언트에게 "다음 메서드, 속성, 이벤트 및 인덱서에 대한 지원을 약속한다"는 이야기를 하는 것입니다.
C#은 개체 지향형 언어이므로, 이러한 계약은 인터페이스라는 엔티티로 캡슐화됩니다. 인터페이스 키워드는 계약을 캡슐화하는 참조 형식을 선언합니다.
개념적으로 보면, 인터페이스는 추상 클래스와 유사합니다. 차이가 있다면, 추상 클래스는 파생된 클래스의 패밀리에 대한 기본 클래스로 제공되고, 인터페이스는 다른 상속 트리와 혼합됩니다.


맨 위로


IEnumerable 인터페이스
이전 예제로 다시 돌아가서, 일반 배열로 할 수 있는 것과 마찬가지로 foreach 루프를 사용하여 ListBoxTest 클래스에서 문자열을 출력할 수 있다면 좋을 것입니다. 이것은 클래스에서 IEnumerable 인터페이스를 구현해서 할 수 있고, IEnumerable 인터페이스는 다시 foreach 생성에 의해 암시적으로 사용됩니다. IEnumerable는 열거 및 foreach 루프를 지원하는 모든 클래스에서 구현됩니다.
IEnumerable은 단 하나의 메서드인 GetEnumerator를 가지는데, 이 메서드의 임무는 IEnumerator의 특수한 구현을 반환하는 것입니다. 따라서, Enumerable 클래스의 의미를 통해 Enumerator를 제공할 수 있습니다.
Enumerator는 IEnumerator 메서드를 구현해야 합니다. 이것은 컨테이너 클래스 또는 별도의 클래스에 의해 직접 구현할 수 있습니다. 이 중에서 두 번째 방식이 일반적으로 선호되는데, 그 이유는 컨테이너를 흩어 놓는 대신 Enumerator 클래스에서 해야 할 일을 캡슐화하기 때문입니다.
이미 그림 5에서 보았던 ListBoxTest에 Enumerator를 추가할 것입니다. Enumerator 클래스는 컨테이너 클래스에만 해당되기 때문에(즉 ListBoxEnumerator는 ListBoxTest에 대해 많이 알고 있어야 하므로) ListBoxTest 내에 포함시켜 전용 구현으로 만들 것입니다.
이러한 의미에서 ListBoxTest는 IEnumerable 인터페이스 구현을 위한 것으로 정의할 수 있습니다. IEnumerable 인터페이스는 Enumerator를 반환해야 합니다.
public IEnumerator GetEnumerator()
{
    return (IEnumerator) new ListBoxEnumerator(this);
}
메서드가 현재 ListBoxTest 개체(this)를 열거자에게 전달한다는 점을 알아두십시오. 이를 통해, 열거자가 이 특정 ListBoxTest 개체를 열거할 수 있게 됩니다.
여기에서 Enumerator를 구현하기 위한 클래스는 ListBoxTest 내에서 정의된 전용 클래스인 ListBoxEnumerator로 구현되었습니다. 이 클래스의 임무는 매우 분명합니다.
열거되는 ListBoxTest는 인수로 생상자에게 전달되고, 여기에서 멤버 변수인 myLBT에게 할당됩니다. 또한 생성자는 멤버 변수 인덱스를 -1로 설정하여 개체 나열이 아직 시작되지 않았음을 나타냅니다.
public ListBoxEnumerator(ListBoxTest theLB)
{
    myLBT = theLB;
    index = -1;
}
MoveNext 메서드가 인덱스를 증가시킨 다음 열거하려는 개체의 마지막 부분을 넘어서 실행하지 않도록 확인합니다. 그럴 경우 false가 반환되고, 그렇지 않을 경우 true가 반환됩니다.
public bool MoveNext()
{
    index++;
    if (index >= myLBT.myStrings.Length)
        return false;
    else
        return true;
}
Reset은 인덱스를 -1로 재설정합니다.
Current 속성은 마지막으로 추가된 문자열을 반환하기 위해 구현됩니다. 이것은 임의의 결정입니다. 다른 클래스에서 Current는 디자이너가 결정한 모든 해당 의미를 가지게 됩니다. 하지만 정의될 경우에는 현재 멤버에 대한 액세스는 열거자가 수행하는 임무이므로 모든 열거자가 현재 멤버를 반환할 수 있어야 합니다.
public object Current
{
    get
    {
        return(myLBT[index]);
    }
}
이제 다 되었습니다. foreach에 대한 호출이 열거자를 페칭하고 이것을 사용하여 배열에 걸쳐 열거합니다. foreach는 의미 있는 값을 추가했는지 여부에 상관 없이 모든 문자열을 표시하므로, 관리하기 쉽게 표시 위해 myStrings의 초기화를 여덟 개의 항목으로 변경하였습니다.
myStrings = new String[8]; 

맨 위로


기본 클래스 라이브러리 사용
C#이 C++과 어떻게 다르고, 문제 해결을 위한 접근 방식이 어떻게 바뀌어야 하는지에 대한 이해를 돕기 위해 다소 간단한 예제를 살펴보도록 하겠습니다. 큰 텍스트 파일을 읽고 화면에 해당 내용을 표시하는 클래스를 만들 것입니다. 이것을 다중 스레드 프로그램으로 만들어 데이터를 디스크에서 읽는 동안 다른 작업을 할 수 있도록 할 것입니다.
C++에서는 파일을 읽는 스레드를 만들고, 다른 작업을 수행하는 스레드를 별도로 만들어야 합니다. 이러한 스레드는 독립적으로 작동하지만 동기화가 필요합니다. 이러한 모든 것을 C#에서도 할 수 있지만, 대부분의 경우 자신의 스레드를 작성할 필요는 없습니다. .NET에서 비동기 I/O를 위한 매우 강력한 메커니즘을 제공하기 때문입니다.
비동기 I/O 지원은 CLR에 포함되어 있고 일반적인 I/O 스트림 클래스와 같이 사용이 쉽습니다. 컴파일러에게 많은 수의 System 네임스페이스에서 개체를 사용할 것임을 알리는 것부터 시작합니다.
using System;
using System.IO;
using System.Text;
System을 포함시켜도 그 밑의 모든 하위 네임스페이스가 자동으로 포함되지 않기 때문에 using 키워드를 사용하여 명시적으로 포함시켜야 합니다. I/O 스트림 클래스를 사용할 것이므로 System.IO가 필요하고, 바이트 스트림을 ASCII로 인코딩하기 위해서는 System.Text도 필요 합니다.
이 프로그램 작성 단계는 매우 간단합니다. .NET이 대부분의 작업을 대신해 주기 때문입니다. Stream 클래스의 BeginRead 메서드를 사용할 것입니다. 이 메서드는 비동기 I/O를 제공하고, 버퍼에 가득 찬 데이터를 읽은 다음, 버퍼 프로세싱 준비가 되면 콜백 메서드를 호출합니다.
콜백 메서드에 대한 버퍼 및 대리자로 바이트 배열을 전달해야 합니다. 이 두 가지를 드라이버 클래스의 전용 멤버 변수로 선언합니다.
public class AsynchIOTester
{
    private Stream inputStream;       
    private byte[] buffer;          
    private AsyncCallback myCallBack;
멤버 변수 inputStream은 Stream 형식에 속하고 BeginRead 메서드를 호출하는 개체에 있으며, 대리자(myCallBack) 및 버퍼를 전달됩니다. 대리자는 멤버 함수에 대한 형식에 관계 없는 포인터와 매우 유사합니다. C#에서 대리자는 언어의 첫 번째 클래스 요소입니다.
.NET은 바이트가 디스크의 파일에서 채워져 데이터를 처리할 수 있을 때 대리된 메서드를 호출합니다. 기다리는 동안 다른 작업을 수행할 수 있습니다. (이 경우 정수를 1에서 50,000으로 올릴 수 있지만, 생산 프로그램에서는 사용자와 상호 작용하거나 다른 유용한 작업을 수행할 수 있습니다.)
.NET은 바이트가 디스크의 파일에서 채워져 데이터를 처리할 수 있을 때 대리된 메서드를 호출합니다. 기다리는 동안 다른 작업을 수행할 수 있습니다. (이 경우 정수를 1에서 50,000으로 올릴 수 있지만, 생산 프로그램에서는 사용자와 상호 작용하거나 다른 유용한 작업을 수행할 수 있습니다.)
public delegate void AsyncCallback (IAsyncResult ar);
따라서, 이 대리자는 void를 반환하는 다른 모든 메서드와 연결될 수 있고 매개 변수로 IAsyncResult 인터페이스를 가집니다. CLR은 메서드가 호출되면 런타임에 IAsyncResult 인터페이스를 전달하므로, 다음과 같이 메서드만 선언하면 됩니다.
void OnCompletedRead(IAsyncResult asyncResult)
그런 다음, 생성자에서 대리자를 연결합니다.
AsynchIOTester()
{
      ???
     myCallBack = new AsyncCallback(this.OnCompletedRead);
}
이것은 멤버 변수 myCallback(이전에 형식 AsyncCallback에 속하도록 정의)에게 대리자 인스턴스를 할당합니다. 대리자 인스턴스는 AsyncCallback 생성자를 호출하고 대리자와 연결하려는 메서드로 전달함 으로써 만들어집니다.
다음은 전체 프로그램이 단계별로 작동하는 방식입니다. Main에서 클래스의 인스턴스를 만들고 실행되도록 합니다.
public static void Main()
{
    AsynchIOTester theApp = new AsynchIOTester();    
    theApp.Run();
}
new에 대한 호출로 생성자가 실행됩니다. 생성자에서 파일을 열고 Stream 개체를 다시 얻습니다. 그런 다음, 버퍼에 공간을 할당하고 콜백 메커니즘을 연결합니다.
AsynchIOTester()
{
    inputStream = File.OpenRead(@"C:\MSDN\fromCppToCS.txt");
    buffer = new byte[BUFFER_SIZE];
    myCallBack = new AsyncCallback(this.OnCompletedRead);
}
Run 메서드에서 BeginRead를 호출하면 파일의 비동기적 읽기가 이루어집니다.
inputStream.BeginRead(
     buffer,             // where to put the results
     0,                  // offset
     buffer.Length,      // how many bytes (BUFFER_SIZE)
     myCallBack,         // call back delegate
     null);              // local state object
이제 다른 작업으로 이동합니다.
for (long i = 0; i < 50000; i++)        
{
    if (i%1000 == 0)
    {
        Console.WriteLine("i: {0}", i);
    }
}
읽기가 완료되면 CLR이 콜백 메서드를 호출합니다.
void OnCompletedRead(IAsyncResult asyncResult)
{
OnCompletedRead에서 첫 번째로 해야 할 일은 Stream 개체의 EndRead 메서드를 호출하여 얼마나 많은 바이트가 읽혀졌는지 알아내고, 공용 언어 런타임에 의해 전달된 IAsyncResult 인터페이스 개체를 전달 하는 것입니다.
int bytesRead = inputStream.EndRead(asyncResult);
EndRead 호출의 결과는 읽은 바이트의 수를 다시 받는 것이고. 수가 0보다 클 경우 버퍼를 문자열로 변환하여 콘솔에 쓴 다음, 다른 비동기 읽기를 유발하기위해 BeginRead를 다시 호출합니다.
if (bytesRead > 0)
{
    String s = Encoding.ASCII.GetString(buffer, 0, bytesRead);
    Console.WriteLine(s);
    inputStream.BeginRead(buffer, 0, buffer.Length,
                          myCallBack, null);
}
이제 읽기가 진행되는 동안 다른 작업(이 경우는 50,000까지 카운트)을 수행할 수도 있지만, 버퍼가 가득 찰 때마다 읽은 데이터를 처리(이 경우는 콘솔에 출력)할 수 있습니다. 이 예제에 대한 전체 소스 코드 AsynchIO.cs는 이 글의 맨 위쪽에 있는 링크에서 다운로드할 수 있습니다.
비동기 I/O의 관리는 전적으로 CLR에서 제공합니다. 네트워크에 대한 다음 내용을 읽어보면 이에 대한 장점을 더 많이 알게 될 것입니다.

맨 위로


네트워크를 통한 파일 읽기
C++에서 네트워크를 통한 파일 읽기는 쉽지 않은 프로그래밍 작업입니다. .NET에서 이점을 폭넓게 지원합니다. 사실, 네트워크를 통한 파일 읽기는 표준 Base Class Library Stream 클래스 사용에 불과합니다.
먼저, TCPListener 클래스의 인스턴스를 만들어 TCP/IP 포트(이 경우는 포트 65000)에서 수신하도록 합니다.
TCPListener tcpListener = new TCPListener(65000);
생성되었으면 TCPListener 개체가 수신을 시작하도록 합니다.
tcpListener.Start();  
이제 클라이언트의 연결 요청을 기다립니다.
Socket socketForClient = tcpListener.Accept();
TCPListener 개체의 Accept 메서드는 Socket 개체를 반환하고, 이 개체는 표준 Berkeley 소켓 인터페이스를 나타내며 특정한 끝 지점(이 경우는 클라이언트)에 바인딩됩니다. Accept는 동기 메서드이고 연결 요청을 받을 때까지는 반환되지 않습니다. 소켓이 연결되면 클라이언트에게 파일을 보낼 준비가 마무리됩니다.
if (socketForClient.Connected)
{
???
그 다음, NetworkStream 클래스를 만들어 소켓을 생성자에게 전달합니다.
NetworkStream networkStream = new NetworkStream(socketForClient);
그런 다음, 이전과 같이 StreamWriter 개체를 만들기는 하지만, 이번에는 파일이 아닌 방금 생성된 NetworkStream에서 만듭니다.
System.IO.StreamWriter streamWriter = 
 new System.IO.StreamWriter(networkStream);
이 스트림에 쓰면 스트림이 네트워크를 통해 클라이언트에게 전송됩니다. 전체 소스 코드 TCPServer.cs도 다운로드가 가능합니다.

맨 위로


클라이언트 생성
클라이언트는 호스트에 TCP/IP 클라이언트 연결을 나타내는 TCPClient 클래스를 인스턴스화합니다.
TCPClient socketForServer;
socketForServer = new TCPClient("localHost", 65000);
이 TCPClient로 NetworkStream을 만들고, 이 스트림에 대해 StreamReader를 만들 수 있습니다.
NetworkStream networkStream = socketForServer.GetStream();
System.IO.StreamReader streamReader = 
    new System.IO.StreamReader(networkStream);
이제 스트림에 데이터가 있는 동안 계속 스트림을 읽고 결과를 콘솔에 출력합니다.
do
{
    outputString = streamReader.ReadLine();

    if( outputString != null )
    {
        Console.WriteLine(outputString);
    }
}
while( outputString != null );
이것을 테스트하기 위해 간단한 테스트 파일을 만듭니다.
This is line one
This is line two
This is line three
This is line four
다음은 서버에서의 출력입니다.
Output (Server)
Client connected
Sending This is line one
Sending This is line two
Sending This is line three
Sending This is line four
Disconnecting from client...
Exiting...
다음은 클라이언트에서의 출력입니다.
This is line one
This is line two
This is line three
This is line four

맨 위로


속성 및 메타데이터
C#과 C++ 사이의 큰 차이점 중 하나는 C#에서는 메타데이터, 즉 클래스, 개체, 메서드 등에 대한 데이터를 기본적으로 지원한다는 것입니다. 특성은 CLR의 일부로 제공되는 특성과 자신의 필요에 맞게 만드는 특성, 두 종류가 있습니다. CLR 특성은 serialization, 마샬링 및 COM 상호 운용성을 지원하기 위해 사용됩니다. CLR을 검색해 보면 매우 많은 특성이 있다는 것을 알 수 있습니다. 이 중 일부 특성은 어셈블리에 적용되고, 다른 일부는 클래스 또는 인터페이스에 적용됩니다. 이러한 적용 대상을 특성 대상이라고 합니다.
특성은 대상 항목 바로 앞에 두고 대괄호로 묶으면 해당 대상에 적용됩니다. 특성은 다음과 같이 다른 특성 위에 두거나,
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(".\\keyFile.snk")]
여러 특성을 콤마로 구분함으로써 조합할 수도 있습니다.
[assembly: AssemblyDelaySign(false),
   assembly: AssemblyKeyFile(".\\keyFile.snk")]

맨 위로


사용자 지정 특성
사용자 지정 특성을 자유롭게 만들고 적당한 때 런타임에 사용할 수 있습니다. 예를 들어, 코드의 섹션을 연결된 문서의 URL로 태그를 추가하는 문서 특성을 만들 수 있습니다. 또는, 코드를 코드 검토 주석이나 버그 수정 주석으로 태그를 추가할 수 있습니다.
개발팀에서 버그 수정에 대한 기록을 유지하려는 경우를 생각해 보겠습니다. 모든 버그에 대한 데이터베이스를 유지하기 위해, 코드의 특정 수정 사항에 대해 버그 보고서를 연관시키려고 할 경우에는 코드에 다음과 같은 주석을 추가할 수 있을 것입니다.
// Bug 323 fixed by Jesse Liberty 1/1/2005. 
이렇게 해두면 소스 코드에서 쉽게 볼 수는 있겠지만, 이러한 정보를 보고서로 추출하거나 데이터베이스로 만들어 검색할 수 있도록 하면 더 좋을 것입니다. 또한 모든 버그 보고서 표시 방식을 동일한 구문으로 사용하면 좋을 것입니다. 이 때 필요한 것이 사용자 지정 특성입니다. 그러기 위해서는 주석을 다음과 같이 바꿀 수 있습니다.
[BugFix(323,"Jesse Liberty","1/1/2005") Comment="Off by one error"]
특성도 C#의 클래스에 해당합니다. 사용자 지정 특성을 만들려면 System.Attribute에서 파생된 새로운 사용자 지정 특성을 만듭니다.
public class BugFixAttribute : System.Attribute
컴파일러에게 이 특성이 어떤 종류의 요소(특성 대상)와 함께 사용될 수 있는지 말해 주어야 합니다. 이것을 특성으로 지정합니다. (너무 당연한가요?)
[AttributeUsage(AttributeTargets.ClassMembers, AllowMultiple = true)]
AttributeUsage는 특성에 적용되는 특성(메타 특성)입니다. 이것은 메타 메타데이터, 즉 메타데이터에 대한 데이터를 제공합니다. 이 경우는 두 개의 인수를 전달하게 되는데, 하나는 대상(이 경우는 클래스 멤버)이고 다른 하나는 주어진 요소가 이러한 특성을 둘 이상 받을 수 있는지 여부를 나타내는 플래그입니다. AllowMultiple은 true로 설정되어 있는데, 이것은 클래스 멤버에 둘 이상의 BugFixAttribute가 지정될 수 있음을 의미합니다.
Attribute 대상을 조합하려는 경우에는 OR를 사용할 수 있습니다.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface,
    AllowMultiple = true)]
이것은 특성이 Class 또는 Interface에 연결될 수 있도록 합니다.
새로운 사용자 지정 특성의 이름은 BugFixAttribute입니다. 표기법은 단어 Attribute를 해당 특성 이름에 붙이는 것입니다. 특성을 요소에 지정하면, 컴파일러에서 특성을 짧은 버전의 이름으로 호출할 수 있도록 지원합니다. 따라서 다음과 같이 작성할 수 있습니다.
[BugFix(123, "Jesse Liberty", "01/01/05", Comment="Off by one")]
컴파일러는 먼저 BugFix라는 이름의 특성을 찾고, 이것을 찾지 못할 경우 BugFixAttribute를 찾습니다.
모든 특성은 적어도 하나의 생성자를 가지고 있어야 합니다. 특성은 두 가지의 형식의 매개 변수를 가지는데, 하나는 위치 매개 변수이고 다른 하나는 이름 매개 변수입니다. 이전 예제에서 버그 ID, 프로그래머 이름 및 날짜는 위치 매개 변수이고, 주석은 이름 매개 변수에 해당합니다. 위치 매개 변수는 생성자를 통해 전달되고 생성자에서 선언된 순서대로 전달되어야 합니다.
public BugFixAttribute(int bugID, string programmer, string date)
{
    this.bugID = bugID;
    this.programmer = programmer;
    this.date = date;
}
이름 매개 변수는 속성과 같이 구현됩니다.

맨 위로


특성 사용
특성을 테스트하기 위해 MyMath라는 이름의 간단한 클래스를 만들고 두 개의 함수를 부여합니다. 그런 다음, 클래스에 버그 수정 특성을 지정합니다.
[BugFixAttribute(121,"Jesse Liberty","01/03/05")]

[BugFixAttribute(107,"Jesse Liberty","01/04/05", 
    Comment="Fixed off by one errors")]
public class MyMath
이러한 특성은 메타데이터와 함께 저장됩니다. 그림 6에 전체 소스 코드가 제공되어 있습니다. 다음은 출력입니다.
Calling DoFunc(7). Result: 9.3333333333333339
보는 바와 같이, 특성은 출력에 대해 전혀 영향을 미치지 않고, 특성을 만들어도 성능에는 아무런 영향이 없습니다. 사실, 특성이 존재한다는 사실도 제 말을 통해 믿을 수 밖에 없을 것입니다. 하지만 그림 7에서 보는 바와 같이 ILDASM을 사용한 메타데이터를 잠깐 살펴보면 특성이 있다는 사실을 알 수 있습니다.

맨 위로


검토
검토가 유용하려면, 이상적으로는 런타임 동안 메타데이터에서 특성에 액세스하는 방법이 필요합니다. C#은 메타데이터 검사를 위한 검토를 지원합니다. 먼저 MemberInfo 형식의 개체를 초기화합니다. System.Reflection 네임스페이스의 이 개체는 멤버의 특성을 발견하고 메타데이터에 대한 액세스를 위해 제공합니다.
System.Reflection.MemberInfo inf = typeof(MyMath);
MyMath 형식에 대해 typeof 연산자를 호출합니다. 그러면 MemberInfo에서 파생된 형식 Type의 개체가 반환됩니다.
다음 단계는 이 MemberInfo 개체에 대해 GetCustomAttributes를 호출하여 찾고자 하는 특성의 형식을 전달하는 것입니다. 이렇게 되면 개체 배열을 얻을 수 있으며, 여기서 이들 각 개체는 형식 BugFixAttribute에 속합니다.
object[] attributes;
attributes = Attribute.GetCustomAttributes(inf,    
    typeof(BugFixAttribute));
이제 그림 8과 같이 이 배열에 걸쳐 반복하여 BugFixAttribute 개체의 속성을 출력할 수 있습니다. 이 대체 코드를 그림 6의 코드에 삽입하면 메타데이터가 표시됩니다.

맨 위로


형식 찾기
검토를 사용하여 어셈블리의 내용을 찾고 검사할 수 있습니다. 어셈블리에 대한 정보를 표시할 도구를 만들거나 어셈블리에서 메서드를 동적으로 호출하려는 경우 특히 유용합니다. 스크립팅 엔진을 개발하여 사용자가 스크립트를 생성하고 프로그램을 통해 실행하도록 하려는 경우에도 해당합니다.
검토를 통해, 모듈과 연관된 형식, 메서드, 필드, 속성 및 이벤트와 연관된 형식은 물론이고, 각 형식 메서드의 서명, 형식에 의해 지원되는 인터페이스 및 형식의 슈퍼클래스도 찾을 수 있습니다.
우선, 어셈블리를 Assembly.Load 정적 메서드로 동적으로 로드합니다. 이 메서드에 대한 서명은 다음과 같습니다.
public static Assembly.Load(AssemblyName)
그런 다음, 코어 라이브러리를 전달해야 합니다.
Assembly a = Assembly.Load("Mscorlib.dll");
어셈블리가 로드되었으면 GetTypes를 호출하여 Type 개체의 배열을 반환할 수 있습니다. Type 개체는 검토의 핵심입니다. Type은 형식 선언, 즉 클래스, 인터페이스, 배열, 값 및 열거를 나타냅니다.
Type[] types = a.GetTypes();
어셈블리는 foreach 루프에 표시될 수 있는 형식의 배열을 반환합니다. 여기에서의 출력으로 많은 페이지가 채워집니다. 다음은 출력의 일부입니다.
Type is System.TypeCode
Type is System.Security.Util.StringExpressionSet
Type is System.Text.UTF7Encoding$Encoder
Type is System.ArgIterator
Type is System.Runtime.Remoting.JITLookupTable
1205 types found
코어 라이브러리의 형식으로 가득 찬 배열을 얻었고 이것을 하나씩 출력했습니다. 출력에서 보는 바와 같이 배열에는 1,205개 항목이 포함되어 있습니다.

맨 위로


형식에 대한 검토
어셈블리의 단일 형식에 대해서도 검토할 수 있습니다. 이렇게 하려면, GetType 메서드로 어셈블리에서 한 형식을 추출합니다.
public class Tester
{
    public static void Main()
    {
        // examine a single object
        Type theType = Type.GetType("System.Reflection.Assembly");
        Console.WriteLine("\nSingle Type is {0}\n", theType);
    }
}    
출력은 다음과 같습니다.
Single Type is System.Reflection.Assembly

맨 위로


멤버 찾기
그림 9에서 보는 바와 같이, 모든 해당 멤버에 대해 이 형식을 요청하여 모든 메서드, 속성 및 필드를 나열할 수 있습니다.
출력이 상당히 길어지긴 했지만 다음 출력의 일부에서 확인할 수 있듯이 출력 안에서 필드, 메서드, 생성자 및 속성을 볼 수 있습니다.
System.String s_localFilePrefix is a Field
Boolean IsDefined(System.Type) is a Method
Void .ctor() is a Constructor
System.String CodeBase  is a Property
System.String CopiedCodeBase  is a Property

맨 위로


메서드만 찾기
필드, 속성 등은 제외하고 메서드에 대해서만 관심이 있을 수 있습니다. 이렇게 하려면, GetMembers에 대한 호출을 제거합니다.
MemberInfo[] mbrInfoArray = 
    theType.GetMembers(BindingFlags.LookupAll);
그런 다음, GetMethods에 대한 호출을 추가합니다.
mbrInfoArray = theType.GetMethods();
이제 출력에는 메서드밖에 없습니다.
Output (excerpt)
Boolean Equals(System.Object) is a Method
System.String ToString() is a Method
System.String CreateQualifiedName(System.String, System.String)
 is a Method
System.Reflection.MethodInfo get_EntryPoint() is a Method

맨 위로


특정 멤버 찾기
마지막으로, 더욱 범위를 좁히기 위해 FindMembers 메서드를 사용하여 형식의 특정 멤버를 찾을 수 있습니다. 예를 들어, 그림 10에서 보는 바와 같이 문자 "Get"으로 이름이 시작하는 메서드에 대한 검색으로 제한할 수 있습니다.
출력의 일부는 다음과 같습니다.
System.Type[] GetTypes() is a Method
System.Type[] GetExportedTypes() is a Method
System.Type GetType(System.String, Boolean) is a Method
System.Type GetType(System.String) is a Method
System.Reflection.AssemblyName GetName(Boolean) is a Method
System.Reflection.AssemblyName GetName() is a Method
Int32 GetHashCode() is a Method
System.Reflection.Assembly GetAssembly(System.Type) is a Method
System.Type GetType(System.String, Boolean, Boolean) is a Method

맨 위로


동적 호출
메서드를 찾았으면 검토를 사용하여 호출할 수 있습니다. 예를 들어, 각도의 코사인 값을 반환하는 System.Math의 Cos 메서드를 호출하려는 경우를 생각해 보겠습니다.
이렇게 하려면, 다음과 같이 System.Math 클래스에 대한 Type 정보를 얻습니다.
Type theMathType = Type.GetType("System.Math");
이 형식 정보로 해당 클래스의 인스턴스를 동적으로 로드할 수 있습니다.
Object theObj = Activator.CreateInstance(theMathType);
CreateInstance는 개체 인스턴스화를 위해 사용할 수 있는 Activator 클래스의 정적 메서드입니다.
System.Math의 인스턴스가 있으면 Cos 메서드를 호출할 수 있습니다. 이렇게 하려면, 매개 변수의 형식을 설명하는 배열을 준비해야 합니다. Cos는 하나의 매개 변수(코사인 값이 필요한 각도)를 가지므로 하나의 멤버를 가진 배열이 필요합니다. 이 배열에 Cos에서 예상하는 매개 변수 형식인 System.Double 형식에 대한 Type 개체를 둡니다.
Type[] paramTypes = new Type[1];
paramTypes[0]= Type.GetType("System.Double");
이제 원하는 메서드의 이름과 이전에 얻은 형식 개체의 GetMethod 메서드에게 매개 변수의 형식을 설명하는 이 배열을 전달할 수 있습니다.
MethodInfo CosineInfo = 
    theMathType.GetMethod("Cos",paramTypes);
이제 메서드를 호출할 수 있는 형식 MethodInfo의 개체를 가지고 있습니다. 메서드를 호출하려면, 배열에서 다시 매개 변수의 실제 값을 전달해야 합니다.
Object[] parameters = new Object[1];
parameters[0] = 45;
Object returnVal = CosineInfo.Invoke(theObj,parameters);
이제 두 개의 배열을 만들었습니다. 하나는 매개 변수의 형식을 가진 paramTypes이고, 다른 하나는 실제 값을 가진 매개 변수입니다. 메서드가 두 개의 인수를 가지고 있는 경우 이러한 배열이 두 값을 가지도록 선언하면 됩니다. 메서드가 값을 가지고 있지 않은 경우에도 배열을 만들 수 있지만, 크기를 0으로 부여해야 합니다.
Type[] paramTypes = new Type[0];
조금 이상하게 보이지만 이것이 맞습니다. 그림 11에 전체 코드가 나와 있습니다.

맨 위로


결론
부주의한 C++ 프로그래머가 혼란스러워 할 수 있는 몇 가지 함정이 있기는 하지만 C#의 구문은 C++과 크게 다르지 않고 새로운 언어로의 전환은 비교적 쉽다고 볼 수 있습니다. C#으로 작업하면서 느끼는 흥미로운 점은, 이전에 직접 작성해야 했던 많은 기능을 제공하는 새로운 공용 언어 런타임 라이브러리를 항상 사용하게 된다는 점입니다. 이 글에서는 몇 가지 눈에 띄는 사항만 간단히 다루었습니다. CLR 및 .NET Framework는 스레드, 마샬링, 웹 응용 프로그램 개발, Windows 기반 응용 프로그램 개발 등을 위한 폭넓은 기능을 지원합니다.
언어 기능과 CLR 기능간의 구분이 모호할 때가 많은 것이 사실이지만, 이 두 가지는 분명 강력한 개발 도구인 것입니다.

posted by 호기심만땅
2008/02/29 16:06 쓸데 없는 말들..
현실적이고 절제된 아저씨 취향

당신의 취향엔 쿨하고 냉정한 매력이 있습니다.

당신의 취향은 실용주의, 물질주의, 보수주의로 요약 가능합니다.(문화 예술 취향이 그렇다는 말입니다. 정치 사회적으로 보수라는 건 아니죠.) 당신은 "예술이 밥 먹여주니"라는 말을 서슴없이 하는 '실학파'일 수도 있고, "예술보다 밥"이라고 말하는 완고한 보수파일 수도 있습니다.

당신은 절제된 형태의 표현을 좋아합니다. 슬픔에 흐느껴서도 안되고, 기쁨에 호들갑을 떨어서도 안되며, 사랑에 목소리가 떨려서도 안됩니다. 그리고 기존의 통념을 파괴하는, 원칙과 질서를 무시하는 철딱서니 없는 표현에도 거부감을 느낄 겁니다.  


당신의 취향은 바로 이런 분위기입니다.
좋게 말하면 냉엄한 사리분별일테고, 나쁘게 말하면 단순함이라 하겠습니다.

당신에겐 쉽고 간결하며 격식과 모양새를 갖춘 콘텐트가 잘 맞습니다. 그림으로 치자면 사실주의 작품들, 소설로 말하자면 사실주의 문학이 잘 맞습니다. 영화도 다큐멘터리에 가까운 건조하고 딱딱한, 하지만 현실있는 그대로 보여주는 진실된 메시지를 담은 종류를 좋아할 가능성이 높습니다.

어쩌면 당신은 문화적으로 보수적인, 문화 예술의 발전에 저해되는 사람으로 치부받을지도 모르겠습니다. 실제로 당신의 취향 중에는 (극소수이긴 하겠지만) 창작의 자유를 해치는 검열주의자, 엄숙주의자, 종교적 근본주의자들이 있을지 모르겠습니다.

어쩌면 당신 취향의 상당수는 이것저것 다양한 문화 생활을 즐기긴 하지만 딱 부러지게 좋아하는 것이 없을 겁니다. 좋아하고 싫어하는 것에 일관된 기준이 없고, 좋아하고 싫어하는 것에 대해 그렇게 적극적이지 않을 가능성도 높습니다.


좋아하는 것
당신은 본론부터 간략히 말하는 것이 좋습니다. 추상적인 표현도 싫고, 은유적인 표현도 싫습니다. 그냥 있는 그대로 직설적으로 표현하는 것이 당신 취향에 가장 적합합니다. 가령, 심오하고 추상적인 미술 작품보다는, 아래와 같은 미술 작품이 훨씬 보기 좋다는 것이죠.

하이퍼리얼리즘의 대표작 "John" (Chuck Close)의 제작 과정


저주하는 것
당신은 일단 도를 벗어난, 과격한 것이 싫습니다. 그리고 상식적으로 쉽게 이해 안되는 문학적 예술적 표현도 싫습니다. 쉽게 풀어 얘기를 하면 될 걸 뭐하러 어렵게 꼬아 말을 하려는 건지 알 수가 없습니다.

블디랑 같은 취향이네-_-

http://azrial.pe.kr/265 ㅡㅡ;;

'쓸데 없는 말들..' 카테고리의 다른 글

나도 취향 테스트  (0) 2008/02/29
죽을 짓 했네..  (0) 2007/07/31
학교갔다옴  (0) 2007/05/07
맛있는거 많이 먹고 다니네~  (0) 2007/05/04
ㅋㅋㅋ  (0) 2007/05/04
블로그라...  (0) 2007/05/04
posted by 호기심만땅
TAG 테스트
원본링크 : http://blog.jeidee.net/entry/NET-Framework-%EC%A0%84%EC%B2%B4-%EC%86%8C%EC%8A%A4-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-%EB%B0%9B%EA%B8%B0   - 불펌함;;

얼마전에 .NET Framework library 소스가 공개되었다는 포스팅을 했었죠.
해당 포스트에서 직접 Visual Studio 2008에서 MS의 심볼파일 리소스 경로를 지정해 디버깅 환경을 설정하는 방법을 소개했었습니다.
하지만 위의 방법은 항상 온라인 상태여야 한다는 점과 디버깅시 해당 심볼파일이 캐쉬에 없을 경우 내려받아야 하기 때문에 느려지는 문제가 있었는데,
반갑게도 전체 소스를 내려받아 로컬에 저장해 놓을 수 있는 방법이 공개되었습니다.

원문 포스트 링크는 다음과 같습니다.
Download All the .NET Reference Source Code at Once with Net Mass Downloader

.NET Mass Downloader를 사용해 전체 소스를 다운로드 받을 수 있는 방법에 대해 설명하고 있습니다.
.NET Mass Downloader는 오픈소스로서 CodePlex에 프로젝트가 호스팅되어 있습니다.
CodePlex .NET Mass Downloader Home

그럼 .NET Mass Downloader의 최신 릴리즈를 다운로드 받아 .NET Framework 2.0 소스를 다운로드 받아 보도록(3.0과 3.5 프레임워크 라이브러리 소스 다운로드하기는 이 곳을 참조하세요.) 하지요.

1. .NET Mass Downloader 구하기

최신 릴리지는 CodePlex의 .NET Mass Downloader 프로젝트 Release 페이지에 있습니다.
Version 1.1 Release 페이지

2. 다운로드 받은 ReleaseVersion11.zip 파일의 압축을 풉니다.

3. 명령프롬프트를 열고 압축이 해제된 폴더로 경로를 이동합니다.

4. 다음 명령을 입력합니다.

netmassdownloader -d "c:\windows\microsoft.net\framework\v2.0.50727" -output c:\cachetest -v

5. 정상적으로 다운로드 될 경우 다음과 같이 다운로드 과정이 출력됩니다.
사용자 삽입 이미지


다운로드 받은 소스를 사용해서 Visaul Studio 2008에서 디버깅 환경을 설정하는 방법은 이전 포스트를 참조하시고,
이번에는 Visual Studio 2005에서 디버깅 환경을 설정하는 방법을 설명하겠습니다.

1. 다운로드 받은 경로는 c:\cachetest 폴더입니다.

2. Visual Studio 2005의 도구->옵션 메뉴를 선택합니다.

3. 옵션 다이얼로그에서 디버깅->기호 항목을 선택합니다.

사용자 삽입 이미지

기호파일(.pdb) 위치 리스트박스에 c:\cachetest 경로를 추가합니다.

4. 옵션 다이얼로그에서 디버깅->일반 항목을 선택합니다.

사용자 삽입 이미지
<내 코드만 사용(관리 전용)> 항목을 체크 해제합니다.
<소스파일이 원래 버전과 정확하게 일치해야 함> 항목을 체크 해제합니다.

5. 새 프로젝트를 하나 생성한 후 솔루션 탐색기에서 솔루션 속성 다이얼로그를 엽니다.
사용자 삽입 이미지
소스 코드가 포함되어 있는 디렉터리 리스트 박스에 c:\cachetest 경로를 제일 상단에 추가합니다.

6. 폼 위에 버튼을 생성하고 버튼의 Click 이벤트 핸들러에 MessageBox.Show() 문장을 입력합니다.

7. MessageBox.Show(...)문장에 중단점을 걸고 디버깅을 시작합니다.
버튼을 클릭한 후 실행이 정지되면 디버그 메뉴에서 <한 단계씩 코드 실행> 메뉴를 선택합니다.
정상적으로 설정이 완료되었다면 다음과 같이 다운로드 받은 프레임워크 소스로 디버깅 위치가 이동하는 것을 볼 수 있습니다.

사용자 삽입 이미지

이상으로 .NET Framework 2.0 소스를 다운로드 받아 Visual Studio 2005에서 디버깅 환경을 설정하는 방법까지 살펴보았습니다.
posted by 호기심만땅
2008/01/30 19:07 퍼오기..

하쿠나마타타 (Hakuna matata)

 스와힐리어로 . . .  다 잘될거야 . . . 란 뜻 . . . ^^

(라이온킹에서 심바가 아버지를 잃고 삼촌에게 내쫓임을 당하고 처저 있을때 멧때지가 불러준 노래에도 나오죠 . . . ^^ 하쿠나 마타타 폴레폴레 ~~심바 . . . ㅋㅋ 걱정마 잘될꺼야 사자야 ^^ 심바는 사자라는 뜻이라내요 ^^ )  또한 미녀는 괴로워에서 주인공이 문신으로 했던 문양또한 하쿠나 마타타라는 행운의 문양이다 . . .위 사진 . . .


케 쎄라 쎄라 (Que sera sera)


스페인어로 될대로 되라 . . . ^^

(이 말은 Doris Day 란 그룹이 불러 유행을 시켰죠 . . . ^^

아참. . .우리나라 드라마제목에도 . . ㅋㅋ ^^)



스트로폴로스 (CastorPollux) 행복을 비는 주문...

행복해지기를 바라는 누구에게나

혹은 상대방에게 전하는 짧은 주문...

항상 행복하라는 뜻이래요 ^-^*   }


아브라카다브라 (Abracadabra)

말한대로 이루어지게 하는 마법의 주문..

희망과 꿈이 있는 사람에게 분명 그 꿈을 이루어주는 주문으로

 '말한대로 이루어지리라 . . .  `


루프리텔캄 (Roopretelcham)

모든것을 이루어지게 하는 주문 . . 


오블리비아테(Obliviate)

상대방의 기억을 수정하는 주문..

좋은 기억만을 남겨두고 나쁜기억은 지울수 있다 . . {


세렌디피티(Serendipity)

뜻밖의 행운.

우연을 붙잡아 행운으로 바꾸는 힘,

생각지 못한 귀한 것을 우연히 발견하는 능력이다 . . . `


마하켄다프펠도문

슬픔과 고통을 잊을수 있게 해주는 주문 . . .



러버스레폴링레이디마트

사랑을 이루게 해주는 힘의 주문 . . .


마크툽(Maktoob)

 아랍어로써 . . .  신의 뜻대로, 신의 생각대로

어차피 그렇게 될것이다. 노력과 열성이면 모든것을 이룰수 있다 . . .

(류시화님의 하늘호수로 떠난 여행이나 지구별 여행자에서 간간히 나오죠 ^^ 연금술사에서도 . . .

이글을 읽으시는 분중에 위에 책 안읽어보신 분들은 한번씩 읽어보길 . . . ^^ 잼나답니다 . . .)




히투마드리수투만

미얀마 고대주문,

생명의 어머니의 힘으로 생명을 보호해주는 주문


順天節物 (순천절물)


하늘에 뜻에따라 . . .

물흐르듯이 살아가라 . . .^^

'퍼오기..' 카테고리의 다른 글

SSD 유저가 참고해야될 작업들  (0) 2009/09/30
주문을 외워봐  (0) 2008/01/30
We Are the World  (0) 2007/08/31
posted by 호기심만땅

1. 아웃룩2003(MSG파일)에서 첨부파일 다운로드 받는 방법

실행에서 regedit을 친다.

아래 경로를 찾아 들어간다.

HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security (2007인경우 12.0)


여기에서 오른쪽 창에서 오른쪽 마우스를 누른다음 새로만들기-> 문자열값 선택한다.


이름: Level1Remove로 수정하고, 값 데이터는 .exe;.cmd;.zip 하면된다...

(참고: pif 도 다운로드 가능하게 할려면 값 데이터에 .pif추가 하면된다. 각 구분자는 ; 이며, 필요하면 다른것도 추가 추가....)



=================================================================================================================


2. Outlook과 Outlook Express 에서 첨부파일 다운로드 받는 방법


1. msg 파일은 Outlook으로만 열수 있다고 함 -> Outlook 받은 편지로 이동
2. Outlook Express -> 도구 -> 옵션 -> 보안 -> 바이러스 가능성이 있는 첨부파일을 저장하거나 열 수 없음 ==> 해제
3. Outlook Express -> 가져오기 -> 메세지 -> Microsoft Outlook -> 받은 편지함.

'프로그램을 내맘대로.. > Outlook' 카테고리의 다른 글

Outlook - 첨부파일 다운로드 방법  (0) 2008/01/22
posted by 호기심만땅
2007/09/21 13:28 개발의 세계../기타

Class Designer

http://msdn.microsoft.com/vstudio/tour/vs2005_guided_tour/VS2005pro/Smart_Client/ClassDesign.htm


Enhanced DataTips and Data Visualizers

http://msdn.microsoft.com/vstudio/tour/vs2005_guided_tour/VS2005pro/Smart_Client/CPlusDataTips.htm


IntelliSense Code Snippets

http://msdn.microsoft.com/vstudio/tour/vs2005_guided_tour/VS2005pro/Smart_Client/CodeSnip.htm


Unit Testing

http://msdn.microsoft.com/vstudio/tour/vs2005_guided_tour/VS2005pro/Smart_Client/UnitTest.htm

'개발의 세계.. > 기타' 카테고리의 다른 글

오픈소스 라이센스 정리 [펌]  (0) 2010/07/06
VS2005 관련 튜토리얼  (0) 2007/09/21
정규표현식  (0) 2007/06/13
posted by 호기심만땅