달력

10

« 2024/10 »

  • 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
2010. 6. 2. 17:14

트러스트 Who&What2010. 6. 2. 17:14


NPKI (민간 최상위 인증기관)

---------------
GPKI (공공 최상위 인증기관)

NT 도메인은 부서단위

1user / 1account

상호신뢰관계 성립 (Trust)
out going / in comming
단방향 / 양방향
리소스를 주는쪽에서 받는쪽을 Trusting(신뢰)줘야 함
--------------------------
upgrade
1. 공존 :
2. 마이그레이션

support tool 설치 : movetree, cla
1. adsiedit
2. ldp
3. 복제모니터링 [replmon]

도메인간의 개체 이동작업
1. movetree => sid 유지, support 별도 설치
2. admt => MS 다운받아 설치
==============================================
유니버셜그룹의 정보는 GC에 저장됨

cached logon  기능지연 => xp 이상

xp => 빠른 로그온
=> 도메인 가입하면 느린 로그온

dnsmgmt.msc

Lesson 1: Maintaining the AD DS Domain Controllers
NTDS:
ntds.dit => 12MB

c:\windows\ntds => db이동 하기 위해서는.. 정지해야 함
2003 정상모드에서는 이동이 불가능

DC=> f8...
디렉터리 서비스 복원모드 => DSRM 모드
=> SAM 에 계정로그인

SYSVOL : NTFS 파일 시스템이어야 함.
FRS 복제
2003 R2부터 DFS-R

2003까지 SYSVOL FRS (복제알고리즘)
2008 SYSVOL DFS-R
=======================================
백업
NT백업
=> 수동으로 설치안해도 됨.
=> 파일단위의 백업을 진행
시스템 상태 데이터
=> 개개별 머신마다 상태데이터 백업을 별도 유지..

WS백업
=> 수동으로 설치해야됨.
=> 이미지 단위의 백업
=> DVD, USB 외장디스크(메모리 불가), 테잎장치는 직접 백업 기능지원불가

삭제된 개체 쉽게 살려낼 수 있음
LDP
modify:
distinguishedname
iddeleted => delete

dc1=dc2
user1 삭제
1. dc1, dc2에 모두 user1이 있는 상태
2. dc1, dc2의 백업 데이터
3. user1을 dc1에서 삭제
4. dc1, dc2에서 모두 user1이 삭제됨
도스창...띄우고..
 

dsrm 모드로 부팅해서 dc1의 시스템 상태 데이터를 복원.
6. 그냥부팅하면 복원해도 다시 dc2에서 복제되기 때문에 삭제되어 버림.
7. dsrm 모드에서.. cmd 도스창..
    ntdsutil
    authoritative restore.. user1 사용자 개체에 대한 정식복원
:
Posted by 에너지발전소
2010. 6. 1. 17:20

DNS 서버 필수적인 서비스 Who&What2010. 6. 1. 17:20


인터넷 AD 안쓰는 환경에서 DNS

windows 2000 이상의 모든 시스템..(hostname 변환)
컴퓨터이름 NetBIOS => Hostname

\\컴퓨터이름 <= 형식으로

1. hostname 캐시 : ipconfig /displaydns(hosts 파일포함)
    C:\WINDOWS\system32\drivers\etc\hosts
2. dns 서버에 질의..
3. netbios 캐시 : nbtstat -c
4. wins 서버에 질의
5. 브로드캐스트...

==============================================================================
DNS 서버
1. 이름변환 = 설치.. 하면 이름변환 함.. 
    컨디셔널 forwarder : 원하는 이름만 얘한테 물어보고 나머지는 내가 알아서 하겠다.. 
    확인 : nslookup => lon-dc1.emea.woodgrovebank.com
    보조DNS는 주서버가 멈췄을때 동작하지 정보를 찾지못했을 경우에는 동작하지 않음.

2. 영역관리
    정방향조회 : 이름 => IP로 변환
    역방향조회 : IP => 이름.. 
      - nslookup
      - web서버 : 공개되지 않은 서버를 위해 필터구성할때
        : IP주소로 제한
        : 도메인 이름/컴퓨터 이름으로 제한.
          =>source IP 등을 가지고 클라이언트가 접속을 시도 
  =============
    주영역
    보조영역 : R/O 모드

    ==========
    ad통합영역
    스텁영역
   
--------------------------------------------------
연습문제
주영역/보조영역 생성
NYC-DC1 / LON-DC1

영역DB 파일

3.
LDAP =>기본..
CN : 유일한 개체, 컨테이너
OU : OU 이름앞에
DC : 도메인 이름 앞에

user1 사용자 계정
a.com - korea

www.naver.com
유니크한 이름이 가장왼쪽, 광범위한 이름이 가장 오른쪽
cn=user1,ou=korea,dc=a,dc=com
만일 sub가 있다면
cn=user1,ou=korea,dc=sub,dc=a,dc=com

cn=administrator, cn=builtin,dc=a,dc=com
"cn=server operator, cn=builtin,dc=a,dc=com"

표준
cn=user1,ou=korea,o=a,c=com

ad통합영역... =>adsiedit
파티션을 가져올때..
1. 도메인에 있는 dns 서버들에게 all 복제
   => dc=domaindnszones,dc=woodgrovebank,dc=com
2. 포리스트에 있는 dns 서버들에게 all 복제
   => dc=forestdnszones,dc=~

DNS에서 자주사용하는 레코드
A레코드 : 이름 = IP
CNAME : 여러개의 역할에 대해  별칭
MX : 메일서버
PTR : 리버스룩업에서 사용(거꾸로 찾기 영역) IP =>이름
SOA :그 영역 자체의 정보
SRV : 어떠한 서비스를 수행하는 서버가 누구다..
      => MS 2000 DNS 지원
      =>

ad 통합영역을 사용했을 경우의 장점..
1. dns db에 대한 복제를 신경쓰지 않아도 됨.   
   ad 복제가 모두 담당.
2. SRV레코드가 등록되어짐

--------------------------------
AD를 위한 영역 구성을 위한 스텝
1. woodgrovebank.com => ad 통합영역생성 (10.10.0.10)
2. w.com 도메인내의 모든 dc들의 dns서버의 ip정보를 #1에서 설정한 dns 서버로 설정
3. dc에서 netlogon 서비스를 재시작...
4. 도메인 내의 모든 pc들(클라이언트 포함) dns 서버 => 10.10.0.10으로 변경
5. 모든 pc들 (dc + 클라이언트)
    도스창 : ipconfig /registerdns =>A 레코드
자신의 컴퓨터 이름 + 자신의 IP주소


2003=>2008

1. 백그라운드 존 로딩...
a.com => 6천개..
패치 작업.. =>
재부팅
최대 2시간

2. ipv6 지원...
3. globalname zone 지원 => wins 서버를 대체
=> 단일레이블 네임
a.com / b.com
woodgrovebank => 등록.

dns 관리 : dnsmgmt.msc
===================================================
사용자 관리
1. ad 사용자 및 컴퓨터 => GUI 도구...
2. net user // 2000까지사용자등록
3. dsadd user // 2003서버부터 지원
    dsadd user user cn=user10,ou=user,ou=korea,dc=woodgrovebank,dc=com -pwd Pa$$word -tel 555-1245 -memberof administrators
4. csvde
    개체를 최초에 등록... add
    문서화 작업이나 forest를 건너가면서 계정등록할 경우
    csvde -f wood.csv -r objectclass=user -d ou=user,ou=korea,dc=woodgrovebank,dc=com
5. ldifde
    개체의 add, modify, delete

6. 스크립트
7. 파워셸...

OU작업의 목적은 관리를 세분화
1. 그룹정책
2. 관리제어 위임.

다국적기업
a.com 단일 도메인의 경우.. ou
  - 한국
     - 컴퓨터
       - 노트북
       - 데스크탑
     - 사용자 
  - 미국
  - 싱가폴
2, 3 depth 이상 권고하지 않음.
===================================================
호스트머신
1. XP, VISTA, 2008 32/64(R2는 안됨) => 메모리 2GB 이상
   hyper-v 설치된 P 안됨
2. .Net framework
3. IIS - 웹서버
4. virtual server =>영문버젼...
5. 이미지 설치. 6425AL, 5047b
6. VHD - program files\microsoft learning\base
    05D,08A,08B,08C,08D-R
===================================================
Type : 보안그룹
whoami /all : access token 정보
 gpupdate /force : 부팅안하고 정책적용

user account : Global

global group : global group를 가져올 수 있음. user도..
=> 우리회사 조직도 생성
유니버셜 : 전사직원 그룹핑
도메인로컬 : 사용자 그룹핑이 목적이 아님.
=> 권한할당..
:
Posted by 에너지발전소
2010. 5. 31. 21:44

[17일차]Objective-C 2.0에서 추가된 기능 Objective-C2010. 5. 31. 21:44

Protocal의 옵션 지정이 가능
=> 1.0까지 에서는 Protocol의 모든 메서드를 구현하지 않으면 Warning : 실행은 가능
=> 2.0에서는 @required와 @optional을 지정해서 필수적으로 구현할것과 선택적으로 구현이 가능하도록 지정가능
    defalult는 required
   

dev-c : objective-c 1.0 기반
x-code : objective-c 2.0 기반
cocoa

2. for 구문의 변경
1) for의 (    )안에서 변수 생성이 가능(지역변수)

2) for(변수명 in 배열명)  <= nsdictionary 의 경우 key값을 리턴
=>배열의 모든 멤버가 순차적으로 변수에 하나씩 대입이 됩니다.
   이 기능을 고속 열거라고 합니다.
=>단 변수에 대입되는 멤버는 오브젝트 이어야 합니다.
    value 타입또는 일반 C 배열은 안됩니다.
=> enumerator를 반환할 수 있는 컬렉션 만이 배열명에 올 수 있습니다. 
    ex. nsarray 는 Object를 리턴

//가장 느림
NSArray * ar = 생성 ;
    int i ;
    for(i=0;i<[ar count];i++)
   {
       NSLog(@"%@",[ar ObjectAtIndex:i]);
   }

// 가장빠름, 코딩양이 많음.
NSEnumerator * it ;
    it = [ar getEnumerator];
    NSString * str;
    While((str=[it nextObject])!=nil)
    {
        NSLog(@"%@",str);
    }

//코딩양도 적고 빠름. enumerator형태로 변환되어 실행
NSString * str
    for(str in ar)
        NSLog(@"%@",str);
======================================================================
ex) for ~ in 예제
#import <foundation/foundation.h>
int main()
{
   NSAutorelease * pool = [[NSAutoreleasePool alloc]init];
   NSArray* monthName = [NSArray arrayWithObjects:@"Janurary",@"Feburary",nil];
   // NSArray 는 get Enumerator을 소유
   for(NSString * temp in monthName)
       NSLog(@"%@",temp);
   [Pool drain];
   return 0;
}
======================================================================
*잘못된 예
int ar[3]={1,2,3};
for(int n in ar)
    // n 은 Object가 아님, int 계열에는 get Enumerator가 없음.
    NSLog(@"%i",n);
======================================================================

* Property가 추가
=> 모든 멤버변수의 setter와 getter 문제 해결
예약어
@property : setter 와 getter의 선언
@synthesize : setter 와 getter의 구현

======================================================================
@interface Test:NSObject
{
    int a;
}
-(void)setA:(int)n;
-(int)a;
// 위의 두 선언은 @property int a; 로 완전히 대체
// 멤버변수와 메소드가 동일한 이름을 가져도 문제가 없다.
@property(setter=setting:)int k;
@end
======================================================================
@implementation Test
-(void)setA:(int)n
// 여기부터
{
   a=n;
}
-(int)a
{
   return a;
}
// 여기까지 => synthesize a; 로 대체
-(void)setting :(int)x
{
   k=x;
   NSLog(@"K가 초기화");
}
@end

Teste *obj = [Test new];
   [obj setk:10]; <=setter 구문을 그대로 사용가능

복사옵션지정 (property에 적용)
assign : 대입
retain : retain 메서드 호출
copy : 얕은 복사
=> NSArray * ar; 얕은 복사 문제발생 가능성 높음 // objective-c는 참조형 배열

    NSString * str ; 얕은 복사 문제 발생가능성이 적음



:
Posted by 에너지발전소

나중에 따로 정리예정

워크그룹 : 독립실행형...
도메인 : C/S 모델을 이야기 함.=> 중앙 디렉터리 서비스 => ADS/AD DS
         인터넷 DNS 이름을 말하는게 아님. 싱글사인온 구현 가능.

우리 조직의 부서이름 반영
NT 도메인들이 부서마다 따로따로 있었음.

2000 AD로 가면서

NT 도메인 : 부서단위
2000 AD : 회사단위..
========================================================
OS들의 특징
1. 공유레벨의 시스템 => 밀레니엄시스템 이전에 끝남.
2. 사용자 레벨의 시스템 => 강제 로그온..
SSO => 도메인 환경..
WUS
========================================================
이름/..
도메인/ 컴퓨터 이름.. =>
컴퓨터 네이밍 :
NetBIOS  => 16자리. 15자리 + 서비스코드
Hostname => 255자리. com1.sec.com.

www.naver.com:80

sec.com = sec  : netbios 명을 매핑해야 함.
suwon.sec.com = suwon
SAM :DB 파일을 관리

도메인 로그인할 경우 DC가 사용자 티켓 발급(10시간 TTL)
타시스템 이용시 유효기간, 발급서버 등 확인 (DC에서)
사용자 서비스 티켓 발급 (10시간 TTL)

Local (LSA)
ntds.dit 파일 디렉터리 DB파일
1. 스키마티션 ==> forest 레벨에서 공유
2. 구성 파티션 ==> forest 레벨에서 공유

3. 도메인파티션 => 도메인 내에서만
4. 응용프로그램 파티션 => 관리자의 선택에 따라
5. PAS(GC) ==> forest 레벨에서 공유
==> 기본적으로 Root DC에 할당됨.
==> 전체 forest의 간략한 정보를 저장하고 있는 저장소
user1 => 도메인 파티션에 저장했더니 attribute가  200개...  핵심은 => 10개 를 GC에 저장
forest 전체의 도메인에서 모든 개체들에 대한 간략한 정보를 저장해두는 저장소 => gc

adsiedit.msc

도메인 관리도구
1. ad 사용자 및 컴퓨터 : 일반세팅
2. adsiedit.msc : 고급세팅
3. ldp : 개개별 개체에 세팅되어 있는 아주 디테일한 정보. 고급세팅

스키마
1. ad 스키마 : 관리도구에 있음. 기본적으로는 나타나지 않음.
스키마 관리도구 등록 :  regsvr32 schmmgmt.dll
스탠다드 스키마의 경우 계정하나당 200K 정도 할당
보통 400K 까지도 할당될수 있음.
SAM => 40MB 를 초과할 수 없음
AD Ntds.eit... 백만개 저장할 수 있음. 
우리회사 : 사용자 계정/컴퓨터 계정 => 600KB 사이징...
도메인파티션과 스키마가 다름.

2. adsiedit.msc
========================================================

도메인 : OU(새분화해서 관리)
- 보안구성을 위한 하나의 범주
- 관리의 범위

도메인 => administrator
1학년1반 = > 담임선생님..

LG전자
lg.com (도메인)
OU : 의미있는 이름으로 생성, 체계적으로 관리
- 서울
   - 여업
   - 서비스
- 평택
   - 멀티미디어
   - PC사업부
   - CD롬 사업부
- 구미
   - 냉장고
     - 생산실
     - 연구실
   - TV

지역적인 부분으로 구분...
===============================================
LG전자는 사업부가 크게 두가지
lge.com
멀티미디어 사업본부
- PC 사업본부
- CD롬 사업본부

리빙 사업본부
- 냉장고
- TV
===============================================
조직도 ... OU => 가장 권장하지 않는 방법.

도메인 구성방법
1. Parent, client 형 도메인
서버가 많이 포함되어짐.. (돈이 많이듬)
도메인ㅂㄹ 서버관리자 필요
WAN 구간 속도저하.

2. 도메인 안에서 OU로 구분
지역별 DC중 어디에 로그인할지 알 수 없음.
복제문제

===============================================
dcpromo
1. NTDS 디렉터리 생성 => AD DB
2. SYSVOL => AD 그룹정책이 저장 =>폴더를 자동 공유. NTFS 파일시스템이 반드시 필요

2000
1. 혼합모드
2000 + NT4 백업용도...  : 디렉토리구성모드가 호환성모드로 낮추어짐.
2. 기본모드 : 2000 DC로만 구성

2003
1. 혼합모드 nt
2. 기본모드 2000 + 2003
3. 2003 기능수준레벨

2008
1. 더이상 nt 지원안함.
2. 기본모드
3. 2003 기능수준레벨
4. 2008 수준

dvanced 모드로 설치

다중마스터에서도 싱글마스터 작업 5가지
스키마마스터

AD DC가 복제를 해결할 수 있는 방법
1. 동일한 이름으로 개체가 등록되는 경우 (이론상으로 15초 delay 이후에 보냄)
    같은 랜구간에 있으면 실시간으로 됨..
    시간이 조그이라도 빠른 개체를 선택
    NYC-DC1
    DC2에서 user1??? user1%CNF%dc2의 GUID

repadmin /?
repadmin /showobjmeta nyc-dc1 cn=user1,ou=ou,dc=woodgrovebank,dc=com

2. user1이 있는 상태.
DC1에서 500-1234
DC2에서 900-1234 로 변경0
time stamp가 조금이라도 느린것 선택.

3. ou라는 ou
DC1에서는 ou에다가 user2를 추가
DC2는 ou 자체를 삭제..

싱글마스터 작업
1. 스키마 마스터 => 스키마 변경시..
;; schema
2. 도메인 네이밍 마스터 => 포리스트내 이름을 유지관리 => 포리스트내에서 도메인 추가/제거 작업시
;; trust
=====================================================================
LON DC1
3. PDC 애뮬레이터
-;; NT4 BDC에 대한 pdc로서의 역할..
-;; 이전 버전의 클라이언트들이 암호변경을 하려면  PDC
---------------------------------------------------------------------
-;; 시간서버
-;; 긴급복제, 항상 최신의 DB를 유지

4. rid 마스터 (http://www.systemtools.com) DumpSec v2.8.6 다운로드
-;; sid : user, computer, group

5. infrastructure 마스터
=> 단일 도메인 환경에서는 동작안함
=> 다중 도메인 환경에서 동작하는데, 이미 GC로 구성되었다면 역시 동작안함.
http://support.microsoft.com/kb/255504

전송 : GUI, Ntdsutil.exe
점유 : Ntdstuil.exe

:
Posted by 에너지발전소
2010. 5. 28. 21:32

[16일차]에러처리 Objective-C2010. 5. 28. 21:32

1. 에러 처리

에러가 발생하면 메서드나 함수의 리턴 값 형태로 에러의 발생을 리턴합니다.

파일 처리에는 이러한 에러 처리를 위한 객체를 대입하도록 되어 있습니다.

이 경우 에러 처리에 관련된 오브젝트를 대입하면 에러가 발생해도 프로그램이 중단되지 않고 적절한 메시지를 출력하도록 프로그램을 만들 수 있습니다.


2. 타이머

일정한 주기를 가지고 또는 일정 시간을 delay 한 후 실행해야 하는 프로그램이나 메서드가 있다면 이 때는 타이머 오브젝트를 이용할 수 있습니다.

이 클래스는 NSTimer.h에 정의되어 있습니다.



3. 스레드(Thread)

NSThread 클래스가 스레드 기능을 제공하며 NSThread.h 파일에 정의와 구현되어 있습니다.

실제 main 함수도 스레드로 동작합니다.
모든 Objective-c프로그램 1개 이상의 스레드 소유.
기본적으로 main도 하나의 main 스레드로 생성해서 실행

현재 스레드가 수행 중인지 아닌지 확인하는 메서드는 아래와 같습니다.

 

+(BOOL)isMultiThreaded

멀티 스레드인지 아닌 지 확인해주는 메서드. 과거 한번이라도 수행이 되었는지 확인

+(NSThread *)currentThread

현재 스레드를 나타내는 인스턴스 리턴

+(NSThread *)mainThread

현재의 main 스레드를 나타내는 인스턴스 리턴
---------------------------------------------------------------
#import <Foundation/Foundation.h>
int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    NSThread * thread;
    thread = [NSThread currentThread];
    if(thread !=nil)
     NSLog(@"현재 스레드가 동작중입니다");
    else
     NSLog(@"현재 스레드가 동작중이지 않습니다.");
    
    if(thread == [NSThread mainThread])
     NSLog(@"이 스레드는 main스레드 입니다.");
    else
     NSLog(@"이 스레드는 main스레드가 아닙니다");
    
    if([NSThread isMultiThreaded] == YES)
     NSLog(@"현재 프로그램은 멀티 스레드 환경입니다.");
    else
     NSLog(@"현재 프로그램은 멀티 스레드 환경이 아닙니다.");        
    
    [pool drain];
    system("pause");
    return 0;
}

---------------------------------------------------------------

스레드 생성하기

-(id) initWithTarget:(id)스레드 수행 주체 selector:@selector(스레드로 수행할 메서드:) object:인수로 넘겨줄 오브젝트-스레드함수에게 넘겨줄 매개변수];

 

스레드 수행 메서드

-(void)메서드명:(id)argument

{        

    작업 내용

}

-스레드 시작
[스레드객체 Start];

-스레드 중지
+(void)exit // 현재 실행중인 스레드 중지
-(void)cancel // 호출하는 인스턴스 스레드가 중지

ex)스레드로 메서드 수행
---------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <stdlib.h>
@interface ThreadTest:NSObject
{
    NSThread *thread;
}     
-(void)setThread; // 스레드 생성하고 시작
-(void)Print:(id)argument; // 스레드가 수행할 메서드
@end

@implementation ThreadTest
-(void)setThread
{
//  -(id) initWithTarget:(id)스레드 수행 주체 selector:@selector(스레드로 수행할 메서드:) object:인수로 넘겨줄 오브젝트-스레드함수에게 넘겨줄 매개변수];
    thread = [[NSThread alloc] initWithTarget:self selector:@selector(Print:) object:nil];
               // 생성                                시작
    [thread start];
}
-(void)Print:(id)argument
// 비선점
{        
    NSLog(@"Hello World");               
}
@end

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    ThreadTest *Obj = [[ThreadTest alloc]init]; // 현재 스레드 생성 안됨
    if([NSThread isMultiThreaded] == YES)
     NSLog(@"현재 프로그램은 멀티 스레드 환경입니다.");
    else
     NSLog(@"현재 프로그램은 멀티 스레드 환경이 아닙니다.");
     [Obj setThread];
     if([NSThread isMultiThreaded] == YES)
     NSLog(@"현재 프로그램은 멀티 스레드 환경입니다.");
     else
     NSLog(@"현재 프로그램은 멀티 스레드 환경이 아닙니다.");
    [pool drain];   
    system("pause");    
    return 0;
}
---------------------------------------------------------------

//* 두개의 스레드 수행
---------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <stdlib.h>
@interface ThreadTest:NSObject
{
    NSThread *thread1;
    NSThread *thread2;
}     
-(void)setThread;
-(void)Print:(id)argument;
@end

@implementation ThreadTest
-(void)setThread
{
    thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(Print:) object:nil];
    thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(Disp:) object:nil];
    [thread1 start];
    [thread2 start];
}
-(void)Print:(id)argument
{
         int i;                         
         for(i=0; i<10; i++)                
         {
                  NSLog(@"Hello World");
                  Sleep(1000);
         } 
         NSLog(@"Print 메서드 수행 종료");     
}
-(void)Disp:(id)argument
{
         int i;                         
         for(i=0; i<10; i++)                
         {
                  NSLog(@"Hi Objective-C");
                  Sleep(1000);                 
         } 
          NSLog(@"Disp 메서드 수행 종료");      
}
@end

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    ThreadTest *Obj = [[ThreadTest alloc]init];
    [Obj setThread];
    [pool drain];
    system("pause");
    return 0;
}
---------------------------------------------------------------

멀티스레드의 자원공유문제에러 => Mutex 에러 // Syncronize 하지 않아서 발생
                              // (Mutual Exclusion - 상호배제에러)

#import <Foundation/Foundation.h>
#import <stdlib.h>
@interface ThreadTest:NSObject
{
    NSThread *thread1;
    NSThread *thread2;
    int share;
}     
-(void)setThread;
-(void)Print:(id)argument;
@end

@implementation ThreadTest
-(void)setThread
{
    thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(Print:) object:nil];
    thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(Disp:) object:nil];
    [thread1 start];
    [thread2 start];
    share = 0;
}
-(void)Print:(id)argument
{
         int i;                                        
          for(i=0; i<10; i++)                
          {                
                  share --;
                  Sleep(100);
                  NSLog(@"감소 시킨 share 값: %i:", share);
          }       
}
-(void)Disp:(id)argument
{
         int i;
       
         for(i=0; i<10; i++)                
         {
                  share ++;
                  Sleep(100);
                  NSLog(@"증가 시킨 share 값: %i:", share);
         }         
}
@end

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    ThreadTest *Obj = [[ThreadTest alloc]init];
    [Obj setThread];
    [pool drain];
    system("pause");
    return 0;
}
---------------------------------------------------------------

:
Posted by 에너지발전소
2010. 5. 27. 21:03

[15일차]일반 오브젝트 아카이브 Objective-C2010. 5. 27. 21:03

1. 일반 오브젝트 아카이브

일반 오브젝트를 아카이브 할 때는 NSCoding 프로토콜에 정의되어 있는 encodeWithCoder: initWithCoder: 메서드를 정의하면 됩니다.

 

메서드의 원형

-(void)encodeWithCoder:(NSCoder *)encoder

이 메서드의 안에서 encoder가 아카이브 할 실제 멤버들을 직접 인코딩하면 됩니다.

 

-(id) initWithCoder:(NSCoder *)decoder

이 메서드의 안에서 decoder가 언아카이브 할 실제 멤버들을 직접 디코딩하면 됩니다.




2. NSData를 이용한 아카이브

여러 개의 데이터를 아카이브 해야 하는 경우 NSData를 이용해서 이러한 작업을 수행할 수 있습니다.

이 때는 NSData를 이용해서 미리 영역을 설정한 후 이를 아카이브 클래스의 오브젝트에 연결한 후 이들을 아카이브 해나가면 됩니다.

------------------------------------------------------------
//Achive

#import <Foundation/NSObject.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import <Foundation/NSKeyedArchiver.h>
#import <Foundation/NSCoder.h>
#import <Foundation/NSData.h>
@interface Test : NSObject<NSCoding>
{
  NSString * str;
  int n;
  float f;
}
-(void)setStr:(NSString *)msg;
-(NSString *)str;
-(void)setN:(int)temp;
-(int)n;  
-(void)setF:(float)temp;
-(float)f;                    
@end

@implementation Test
-(void)setStr:(NSString *)msg
{
  str = [NSString stringWithString:msg];
}
-(NSString *)str
{ return str; }
-(void)setN:(int)temp
{ n = temp; }
-(int)n
{ return n;}
-(void)setF:(float)temp
{ f = temp; }
-(float)f
{return f; }

-(void) encodeWithCoder:(NSCoder *)encoder
{
        [encoder encodeObject:str forKey:@"TestSrt"];
        [encoder encodeInt:n forKey:@"TestN"];
        [encoder encodeFloat:f forKey:@"TestF"];       
}

-(id) initWithCoder:(NSCoder *)decoder
{
    str =  [decoder decodeObjectForKey:@"TestSrt"];
     n =   [decoder decodeIntForKey:@"TestN"];
     f =   [decoder decodeFloatForKey:@"TestF"];       
}
@end

int main ()
{
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 Test *Obj1 = [ [ Test alloc] init];
 Test *Obj2 = [ [ Test alloc] init];
 NSMutableData *dataArea; //nsData로 선언하면 Data변경이 안됨
 NSKeyedArchiver *archiver;
 
 [Obj1 setStr:@"Hello World"];
 [Obj1 setN: 111];
 [Obj1 setF: 11.1];
 
 [Obj2 setStr:@"Objective-C"];
 [Obj2 setN: 222];
 [Obj2 setF: 22.2];
 
 dataArea = [NSMutableData data]; // "data"는 생성자 , mutable 에서만 호출가능
 archiver = [[ NSKeyedArchiver alloc] initForWritingWithMutableData: dataArea];
 [archiver encodeObject:Obj1 forKey: @"Obj1"];
 [archiver encodeObject:Obj2 forKey: @"Obj2"];
 [archiver finishEncoding];
 
 if (( [ dataArea writeToFile:@"myArchive" atomically:YES ] ) == NO)
  NSLog(@"아카이빙 실패");
 
 [Obj1 release];
 [Obj2 release];
 [pool drain];
 system("pause");
    return 0;
}
------------------------------------------------------------
------------------------------------------------------------
//UnAchive
#import <Foundation/NSObject.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import <Foundation/NSKeyedArchiver.h>
#import <Foundation/NSCoder.h>
#import <Foundation/NSData.h>
@interface Test : NSObject<NSCoding>
{
  NSString * str;
  int n;
  float f;
}
-(void)setStr:(NSString *)msg;
-(NSString *)str;
-(void)setN:(int)temp;
-(int)n;  
-(void)setF:(float)temp;
-(float)f;                    
@end

@implementation Test
-(void)setStr:(NSString *)msg
{
  str = [NSString stringWithString:msg];
}
-(NSString *)str
{ return str; }
-(void)setN:(int)temp
{ n = temp; }
-(int)n
{ return n;}
-(void)setF:(float)temp
{ f = temp; }
-(float)f
{return f; }

-(void) encodeWithCoder:(NSCoder *)encoder
{
        [encoder encodeObject:str forKey:@"TestSrt"];
        [encoder encodeInt:n forKey:@"TestN"];
        [encoder encodeFloat:f forKey:@"TestF"];       
}

-(id) initWithCoder:(NSCoder *)decoder
{
    str =  [decoder decodeObjectForKey:@"TestSrt"];
     n =   [decoder decodeIntForKey:@"TestN"];
     f =   [decoder decodeFloatForKey:@"TestF"];       
}
@end

 

int main ()
{
   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSData    *dataArea;
 NSKeyedUnarchiver *unarchiver;
 Test *Obj1, *Obj2;
 dataArea = [NSData dataWithContentsOfFile: @"myArchive"];
 if (dataArea == nil)
    {
  NSLog(@"읽어 오기 실패");
  return 0;
 }
 
 unarchiver = [[ NSKeyedUnarchiver alloc] initForReadingWithData: dataArea];
 Obj1 = [unarchiver decodeObjectForKey: @"Obj1"];
    Obj2 = [unarchiver decodeObjectForKey: @"Obj2"];
 
 [unarchiver finishDecoding];
 NSLog(@"Obj1의 데이터");
    NSLog(@"==============");
 NSLog(@"\n%@\n%i\n%g", [Obj1 str], [Obj1 n], [Obj1 f]);
    NSLog(@"==============");
 NSLog(@"Obj2의 데이터");
    NSLog(@"==============");
 NSLog(@"\n%@\n%i\n%g", [Obj2 str], [Obj2 n], [Obj2 f]);
    [unarchiver release];
    [pool drain];
 system("pause");
    return 0;   
}
------------------------------------------------------------
ex>archive를 이용한 오브젝트의 복사(깊은 복사)
#import <Foundation/Foundation.h>
int main ()
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 NSData    *data;
 NSMutableArray  *ar1 = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"1"], [NSMutableString stringWithString:@"2"],[NSMutableString stringWithString:@"3"],nil];
 NSMutableArray  *ar2;
 NSMutableString  *str;
 int i;
 data = [NSKeyedArchiver archivedDataWithRootObject: ar1];
 ar2 = [NSKeyedUnarchiver unarchiveObjectWithData: data];
 str = [ar1 objectAtIndex: 0];
 [str appendString: @"1"]; 
 NSLog(@"ar1: ");
 NSLog(@"=================");
 for(i=0; i<[ar1 count]; i++ )
  NSLog(@"%@", [ar1 objectAtIndex:i]);
 NSLog(@"=================");
 NSLog(@"ar2: ");
 NSLog(@"=================");
 for(i=0; i<[ar2 count]; i++ )
  NSLog(@"%@", [ar2 objectAtIndex:i]); 
    [pool drain];
    system("pause");
    return 0;
}
------------------------------------------------------------


** 예외처리

1. 예외처리를 위한 예약어

@try: Exceptions이 던져질 수 있는 block을 정의합니다.

@throw Exception object를 던진다.

@catch() @try bolck안에서 던져진 exception catch한다.

@finally @try block에서 Exceptions가 던져지던 아니던 수행되어질 block code를 정의한다.

모두 NSException.h에 정의되어 있습니다.


2. NSAssert (메서드 안에서 작성)
특정 조건을 만족하지 않는 경우 NSInternalInconsistencyException예외를 발생시켜 프로그램을 강제로 중단시키는 매크로함수

사용방법
NSAssert(만족해야 하는 조건, 출력할 문장);
         ==> 조건을 만족하지 않으면 Excception 발생시킨후 출력내용 출력

 

:
Posted by 에너지발전소
2010. 5. 26. 20:28

[14일차]객체의 복사 Objective-C2010. 5. 26. 20:28

* 얕은복사
int *p = (int *)malloc(4);
int *q = p;
*p = 10;
printf("%d",*p);
printf("%d",*q);
*p =20;
printf("%d",*q);


* 깊은복사
int*p=(int *)malloc(4);
*p=10;
int *q = (int*) malloc(4);
*q=*p;
printf("%d",*p);
printf("%d",*q);
*p=20;
printf("%d",*q);

ex)copy와 mutablecopy는 얕은복사
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>
#import <foundation/NSAutorelease.h>
int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    NSMutalbeArray * ar1 = [NSMutalbeArray arrayWithObjects:[NSMutableString:@"1"],[NSMutableString:@"2", [NSMutableString:@"3"],nil];
NSMutableArray *ar2;
NSMutalbeString *str;
int i;
NSLog(@"ar 1의 요소");
NSLog(@"--------");
for(i=0; i<[ar1 count];i++)
    NSLog(@"%d",[ar1 objectAtIndex: i]);
    ar2=[ar1 mutableCopy]; 
    str=[ar1 objectAtIndex:0];
    [str app;endString:@"1"];
    NSLog(@"---------");
    NSLog(@"ar2의 요소");
    NSLog(@"---------");
    for(i=0;i[ar2 count];i++)
        NSLog(@"%@",[ar2 objectAtIndex:i]);

[ar1 release];
[ar2release];
[pool drain];
system("pause");
return 0;
}

3. Copy의 구현
=>NSObject 클래스의 NSCopying프로토볼이 선언
=>NSObject 클래스에는 실제구현되어 있지 않음
   이 메서드는 내부적으로
  -(id)copyWithZone:(NSZone *)
                             //heap에 관련된 클래스0
                                메모리할당시 allocwinthzone: nose객체를 이용하면 비슷한 경험이 생김

따라서 copy메서드를 사용하고자 하는 경우 위의 메서드를 출현
:
Posted by 에너지발전소
2010. 5. 25. 21:19

[13일차]파일처리 Objective-C2010. 5. 25. 21:19


4. 디렉토리 작업

NSFileManager에는 디렉토리를 다루는 메서드를 제공합니다.

 

-(NSString *)currentDirectoryPath

현재 디렉토리 경로 NSString으로 반환

 

-(BOOL)changeCurrentDirectoryPath: (NSString *)path

path로 현재 디렉토리를 변경

 

-(BOOL) copyPath:(NSString *)from toPath:to handler:handler

from으로부터 to로 디렉토리 구조를 복사

 

-(BOOL)createDirectoryAtPath: (NSString *)path attributes:(NSDictionary *) attr

path를 생성하고 attr에 속성을 저장

 

-(BOOL)fileExistsAtPath: (NSString *)path isDirectory:(BOOL *)flag

path가 디렉토리인지 여부를 flag에 저장                // 변수대입

 

-(NSArray *)directoryContentsAtPath:(NSString *)path

path의 내용을 배열로 리턴

 

-(BOOL)removeFileAtPath:(NSString *)path handler:handler

path 디렉토리를 삭제

 

-(BOOL) movePath:(NSString *)from toPath: (NSString *)to handler:handler

디렉토리 이름 변경                                  // to 존재하면 에러


5. 디렉토리 내용 열거

- (NSDirectoryEnumerator *)enumeratorAtPath:(NSString *)path
            // nextObject     allObjects : 전체를 NSArray타입으로 리턴
path
에 지정된 디렉토리내의 모든 서브 디렉토리와 파일목록을 가져 옵니다.
==> 하위디렉토리까지 전부조사

- (NSArray *)directoryContentsAtPath:(NSString *)path

path에 존재하는 파일 목록을 배열로 리턴
==> 파일명만 배열로 리턴 - 서브디렉토리 확인하지 않음

- (NSDictionary *)fileAttributesAtPath:(NSString *)path traverseLink:(BOOL)flag
path
에 지정된 파일 또는 디렉토리의 속성을 가지고 옵니다.

flag YES로 지정하면 심볼릭 링크된 파일의 원본 파일의 정보를 가져오며, NO일 경우에는 링크된 파일의 정보를 가지고 옵니다.

:
Posted by 에너지발전소

C 언어의 개요

1. C언어의 역사

C언어는 1972년 벨 연구소의 Dennis Ritchie에 의해 만들어졌습니다.

Dennis Ritchie UNIX 운영체제의 개발을 맡고 있었는데 운영체제는 그 특성상 하드웨어를 직접 제어할 수 있어야 했습니다.

또한 당시의 컴퓨터 환경이 지금과는 달라 CPU의 속도나 메모리의 용량이 충분하지 않았기 때문에 프로그램의 크기는 작아야 했고 속도는 빨라야 했습니다.

이런 모든 요구를 만족시킬 수 있는 유일한 언어는 어셈블리밖에 없었습니다.

그러나 어셈블리는 특정 기계에 종속적이며 이식성이 없기 때문에 여러 플랫폼에 사용하는 것이 목적인 UNIX와는 잘 어울리지 않았습니다.

그래서 Dennis Ritchie는 기존의 언어를 사용하지 않고 어셈블리의 강력한 기능과 고급언어의 이식성을 동시에 갖춘 새로운 언어를 직접 만들었습니다.

물론 Dennis Ritchie 혼자서 C언어를 다 만든 것은 아니며 과거 언어들의 장점을 정리해서 만든 것입니다.

C언어의 뿌리는 ALGOL언어이며 Dennis Ritchie는 동료인 켄 톰슨(Ken Thompson)이 만든 B언어를 개량하여 C언어를 만들었습니다.

C언어의 계보를 그려 보면 다음과 같습니다.

이 언어에 C라는 이름을 붙인 이유는 B보다 한 단계 더 발전했다는 의미로 B다음의 알파벳인 C를 사용한 것입니다.

C언어는 간결하면서도 강력한 프로그램을 작성하기에 적합하여 오늘날 가장 대중적인 프로그래밍 언어로 사용되고 있습니다.

차후에 C 언어는 C++ 로 발전하게 되는데 이때는 D언어라 하지 않고 C언어에서 하나 증가하는 연산자로 사용하는 C++라는 이름으로 불리게 됩니다.

이러한 시기 중간에 80년대 초에는 Brad Cox SmallTalk의 객체 지향 적인 개념과 C의 강력함을 동시에 사용하는 언어인 Objective – C를 설계하게 됩니다.

이를 기반으로 1988 NeXT Software(Steve Jobs)가 라이센스를 넘겨받아 새로운 개뱔 환경과 라이브러리를 개발합니다.

이를 다시 1996년에 애플이 이 회사를 인수하여 차세대 운영체제 개발에 이용하기로 하고 이러한 개발환경을 Cocoa라고 명명하게 됩니다.

사용법 자체는 C++와 유사합니다. (main 함수가 특정 클래스에 속하지 않음)

이 언어가 IPhone SDK의 모태가 됩니다.

C#이나 Java C++와 이 Objective-C를 개량한 객체지향언어입니다.

따라서 현재 사용되는 대부분의 언어는 C언어에 모태를 두고 있습니다.

C언어를 잘 하게 되면 다른 언어를 잘 할 수 있는 이유이며 언어를 공부할 때 C언어를 가장 먼저 공부하는 이유이기도 합니다.


 

2. C언어의 특징

① 문법이 간결하며 예약어가 적고 제공하는 연산자가 다양하기 때문에 짧은 명령으로 많은 일을 할 수 있습니다.

② 효율성이 좋아 대규모의 프로그램을 만들 수 있습니다.

제작된 프로그램의 크기가 작고 속도도 빠릅니다.

③ 운영체제 개발을 목적으로 만든 언어이므로 하위 수준 프로그래밍이 가능하며 어셈블리 수준의 하드웨어 제어를 할 수 있습니다.

④ 모든 분야에 활용할 수 있을 정도로 범용적입니다.

사무 처리, 과학 기술, 상업용 등 거의 대부분의 응용 프로그램을 개발할 수 있습니다.

⑤ 성능을 위해 불필요한 에러 처리를 하지 않습니다.

타입의 불일치나 배열 경계 점검 등은 프로그래머가 직접 해야 하므로 개발자는 항상 이 점을 주의해야 합니다.

⑥ 이식성이 좋습니다.

대부분의 플랫폼에서 C/C++ 언어를 사용할 수 있으므로 재 컴파일만 하면 타 운영체제에서 실행되는 프로그램을 쉽게 만들 수 있습니다.

C언어가 발표되기 전의 언어들은 각각 장단점이 있어서 특정 분야에서 독점적인 지위를 가지는 고유한 영역을 확보하고 있었습니다.

Pascal이나 Basic은 교육용 언어로 분류되었고 COBOL은 상업용 소프트웨어 작성에 효율적이었으며 FORTRAN은 과학 기술용 언어로 주로 사용되었습니다.

또한 LISP는 인공 지능 구현에 적합했으며 어셈블리는 시스템 프로그래밍을 위한 최적의 언어였습니다.

C언어는 거의 모든 분야에 광범위하게 사용되게 됩니다.

C 언어는 원래 목적이었던 UNIX제작은 물론이거니와 Microsoft사의Windows NT와 같은 운영체제를 만들 때도 사용되며 빠른 속도를 요하는 게임프로그래밍에서도 C언어 내부에 어셈블리언어를 삽입시켜 제작하게 됩니다.

이러한 강력한 특징 때문에 모든 프로그래머들이 처음 프로그래밍을 접할 때 C언어부터 배우게 됩니다.

하지만 이러한 많은 장점에도 불구하고 C언어에도 치명적인 단점은 존재합니다.

C언어는 플랫폼(하드웨어나 운영체제)에 종속적입니다.

특정 개발 환경하에서 만든 프로그램은 그 개발환경과 동일하거나 유사한 경우에만 실행이 됩니다.

이러한 이유는 C언어는 미리 컴파일을 한 후 오브젝트 프로그램(기계어와 유사)을 만들고 이를 기반으로 실행 프로그램을 만들기 때문입니다.

또한 C언어는 웹에는 취약한 기반입니다. - C언어가 나올 때는 Web이 없었습니다.

이러한 단점을 해결하기 위해 등장한 것이 Java와 닷넷입니다.

이러한 언어들은 중간코드까지만 만들고 두고 Java Virtual Machine이나 닷넷 프레임워크가 실행하게 됩니다.


 

3. C 언어 수행과정

프로그램을 작성한다는 것은 사용하는 언어의 문법에 맞게 명령들을 작성하는 것을 의미합니다.

언어의 문법에 맞게 명령들을 기술한 파일을 원시 파일(Source File)이라고 하며 원문 그대로 소스(Source)파일 이라고도 부릅니다.

소스는 고급 언어로 작성되어 있기 때문에 컴퓨터가 바로 이해할 수 없으며 따라서 실행할 수도 없습니다.

컴퓨터는 오로지 이진수로 된 기계어밖에 이해하지 못합니다.

그래서 소스를 컴퓨터가 이해할 수 있는 기계어 코드로 번역해야 하는데 이 동작을 컴파일(Compile)이라고 합니다.

컴파일이란 소스에 작성된 명령들을 컴퓨터 언어인 기계어로 번역하는 작업이며 컴파일을 해주는 프로그램을 컴파일러(Compiler)라고 부릅니다.

컴파일러는 소스 파일에 작성된 고급 언어 명령을 해석하여 기계어 코드로 바꾸고 그 결과를 목적 파일(Object File)에 써 넣게 됩니다.

따라서 컴파일러는 소스 파일을 목적 파일로 바꾸는 시스템 프로그램입니다.

목적 파일은 소스의 명령들을 번역한 기계어 코드를 가진 파일이되 이 파일도 곧바로 실행할 수 없습니다.

왜냐하면 프로그램은 기계어 코드 외에도 운영체제가 요구하는 코드를 추가로 가져야 하기 때문입니다.

목적 파일을 실행 파일로 바꾸기 위해서는 이 실행 파일이 운영체제의 요건에 맞도록 형태를 조금 바꾸고 스타트업(StartUp)이라는 추가 코드를 가져야 합니다.

목적 파일에 이런 처리를 하여 실행 파일로 만드는 동작을 링크(Link)라고 하며 링크를 해 주는 프로그램을 링커(Linker)라고 부릅니다.

하나의 프로그램이 작성되는 과정은 다음과 같이 그릴 수 있습니다.

Source File

à

Object File

à

Excute File

소스 파일은 컴파일러에 의해 컴파일되어 목적 파일이 되며 목적 파일은 링커에 의해 링크되어 최종적으로 실행 가능한 실행 파일이 됩니다.

소스 파일을 번역하여 곧바로 실행 파일을 만들지 않고 목적 파일이라는 중간 과정을 거치는 이유는 여러 개의 소스를 합쳐 하나의 실행 파일을 만들어낼 수 있어야 하기 때문입니다.

하나의 소스에 필요한 모든 명령을 다 기술할 수 없으므로 소스를 여러 개 작성하고 이것을 모두 연결하면 완전한 실행 파일이 나오게 됩니다.


A.c

à

A.obj

 

 

Linking

à

Excute

 

 

B.c

à

B.obj

 

 

 

 

C.c

à

C.obj

 

 

 

 

A.c를 컴파일하여 A.obj를 만들고 B.c, C.c는 각각 B.obj, C.obj를 만듭니다.

각 목적 파일은 소스 파일의 명령을 번역한 기계어 코드를 가지고 있을 것입니다.

이렇게 개별 소스를 컴파일해서 만들어진 세 개의 목적 파일을 연결하면 하나의 실행 파일이 되며 링크 단계에서 이미 만들어진 라이브러리도 결합되게 됩니다.

이런 식으로 소스를 여러 개 작성해서 최종적으로 링크하는 방식을 분할 컴파일이라고 하는데 여러 사람이 같이 작업하거나 기능별로 모듈을 개발할 때 일반적으로 사용하는 방법입니다.

하나의 실행 파일을 만들려면 편집기로 명령들을 기술하여 소스를 만들고 이 소스를 컴파일하여 목적 파일로 만든 후 다시 링크 과정을 거쳐야 합니다.

아직도 일부 Linux, Unix 환경에서는 이 방법대로 개발하기도 합니다.

최근의 개발툴들은 자체에 편집기, 컴파일러, 링커를 모두 내장하고 있기 때문에 한번에 소스를 실행 파일로 바꿀 수 있습니다.

뿐만 아니라 디버거, 프로파일러, 리소스 편집기 등 개발에 필요한 편의 기능까지 같이 제공하는데 이런 환경을 통합 개발 환경(IDE, Integrated Development Environment)이라고 부릅니다.

이러한 IDE로 가장 유명한 것이 Visual Studio 입니다.

개발 환경 내에서 편집, 개발, 디버깅, 최적화까지 다 할 수 있기 때문에 무척 편리하며 생산성 향상에 크게 기여하고 있습니다.

컴파일러란 소스 파일을 목적 파일로 변환하는 프로그램을 의미하는데 요즘은 통합 개발 환경이 워낙 일반화되었기 때문에 개발 환경 자체를 컴파일러라고 부르기도 합니다.

UNIX 환경에서는 .obj가 아니고 .o 파일이 생성될 것입니다.


 

4. C 컴파일러의 종류

C/C++ 컴파일러에는 많은 종류가 있습니다.

컴파일러가 생성해 내는 기계어는 특정 CPU와 운영체제에서만 동작하기 때문에 컴파일러는 본질적으로 플랫폼에 종속적입니다.

매킨토시용 컴파일러로 인텔 계열 CPU에서 동작하는 프로그램을 작성할 수 없으며 도스용 컴파일러로 Windows용 프로그램을 작성할 수 없습니다.

운영체제 별로 C/C++ 컴파일러를 분류해 보면 다음과 같습니다.

운영체제

컴파일러

도스용

터보 C, 볼랜드 C++, MS C

Windows

Visual C++, 볼랜드 C

유닉스용

gcc

Gcc + Mingw

Dev C++

최근에는 WindowsTurbo C도 등장했습니다.

같은 컴파일러라도 버전에 따라 기능과 사용 방법, 지원하는 문법 수준이 다르므로 사용할 컴파일러를 선택하는 것은 아주 어려운 일입니다.

현재 가장 많이 사용되는 컴파일러는 마이크로소프트사의 Visual C++입니다.

Windows 전용 컴파일러이므로 Windows용 프로그램을 가장 잘 생성하며 작업 환경이 편리합니다.

코드를 자동으로 생성해 주는 위저드 기능과 MSDN이라는 방대한 도움말, 프로젝트 관리 기능 등 개발자를 위한 많은 지원들이 포함되어 있습니다.

Visual C++ Windows 전용의 컴파일러이기 때문에 도스에 대한 지원이 없습니다.

대신 도스와 비슷한 콘솔 환경을 지원하는데 콘솔에서는 기본적인 입출력만 해 볼 수 있으며 도스에 비해 화면 제어 능력이 취약합니다.

Visual C++(Visual C++)은 마이크로소프트사에서 만든 C/C++ 컴파일러입니다.

1992 4월에 첫 버전인 1.0이 발표되었으며 꾸준한 버전업을 거쳐 2009년 현재 Visual 스튜디오 2008까지 발표되었으며 조만간 Visual C++ 2010도 발표될 예정입니다.

Visual C++은 단순한 C/C++ 컴파일러가 아니라 여러 가지 다양한 프로젝트를 만들 수 있는 종합 개발 툴입니다.

Visual C++ 2008을 설치한 경우에는 마이크로소프트사의 홈페이지에 접속해서 자신의 Visual C++ 2008 언어에 맞는 서비스 팩을 같이 설치하는 것이 좋습니다.

서비스 팩을 설치하지 않으면 컴파일이나 링크가 되지 않는 경우가 발생할 수 도 있습니다.


 

5. 첫번째 실습 예제

Microsoft VC++2008을 실행합니다.

메뉴에서 파일 -> 새로 만들기 -> 프로젝트 항목을 선택하여 새로 프로젝트를 만듭니다.

왼쪽 화면에서 Win32를 선택하고 오른쪽 화면에서 Win32 콘솔 응용 프로그램을 지정하고 이름 란에 프로젝트 이름을 입력합니다.

그리고 다음 화면에서 추가 옵션에서 빈 프로젝트 란에 체크하고 마침을 누릅니다.

그리고 오른쪽 화면의 솔루션 탐색기에서 소스파일을 선택하고 마우스 오른쪽을 클릭해서 [추가] – [새 항목]을 선택합니다.

그리고 오른쪽의 화면에서 C++ 파일을 선택하고 파일 이름란에 파일명을 입력합니다.

이 때 주의할 점은 순수 C파일을 만들 때는 확장자를 .c로 해주어야 한다는 것입니다.

확장자를 입력하지 않으면 cpp가 붙게 되어 C++ 파일이 됩니다.

다음으로 소스 편집 창에 아래와 같은 코드를 입력합니다.

C언어는 영어 대소문자를 구별하므로 정확하게 입력하도록 합시다.

1-1 실습예제

#include <stdio.h>

int main()

{

    printf("안녕하세요반갑습니다. \n");

        system("pause");

    return 0;

}

위의 코드에서 들여쓰기나 줄 바꿈은 큰 의미가 없으므로 정확하게 들여쓰거나 줄바꿈을 할 필요는 없습니다.

작성한 프로젝트를 Compile(Bulid 메뉴에서 Compile을 선택하거나 Ctrl + F7)하여 Source 파일을 Compile하고 난 후 Bulid(Bulid 메뉴에서 Bulid 를 선택하거나 F7)를 수행한 후 Excute(Bulid 메뉴에서 Excute 를 선택하거나 Ctrl + F5)를 수행하여 실행 시켜봅시다.

만약 에러가 없다면 console 화면에 안녕하세요 반갑습니다라는 메시지를 화면 상에 출력 시켜 주게 될 것입니다.

프로그램을 작성하다 보면 컴파일이 제대로 되지 않을 수도 있는데 이럴 때 컴파일러는 다음 두 방법으로 사용자의 실수를 지적해 줍니다.

 에러(Error): 문법상 명백하게 잘못된 점이 있어서 번역을 할 수 없는 경우 에러 메시지를 출력하고 컴파일을 하지 않게 됩니다.

가장 흔한 경우는 오타가 있고 형식이 맞지 않다든가 반드시 필요한 지정이 빠진 경우 등이 에러로 처리됩니다.

에러가 있는 상태로는 컴파일을 계속할 수 없으므로 반드시 수정해야 합니다.

경고(Warning): 좀 이상한 문장이기는 하지만 컴파일에 큰 문제가 없는 경우 경고를 해주는 것입니다.

경고의 내용은 무시해도 되지만 만일 사용자의 실수가 있어서 나오게 되는 경우라면 수정을 해주는 것이 좋습니다.

 

만일 에러가 발생했다면 디버그 모드를 실행해 볼 수 있습니다.

디버그 모드 실행은 코드를 한 줄씩 실행하면서 어디가 잘못되었는지 알아내는 방법입니다.

값이 애매한 경우나 어디서 잘못 되었는지 모르는 경우 디버그 모드를 이용하면 버그를 쉽게 찾을 수가 있습니다.

이 때 소스 코드는 디버그용으로 컴파일된 것이어야 합니다.

메뉴에서 [Build] – [Start Debug] – [Go]를 선택해서 디버그로 실행하면 됩니다.

F5를 단축키를 이용할 수도 있습니다.

F10, F11을 이용해서 코드를 한 줄씩 실행시켜볼 수 있으며 현재 실행하고 있는 줄을 표시해서 보여주게 됩니다.


 

gcc 컴파일러를 이용한 소스 작성 및 실행

gcc는 통합 개발환경이 아닙니다.

따라서 문서 편집 기능이 없습니다.

윈도우에서 사용한다면 먼저 메모장을 이용해서 파일을 작성합니다.

파일 명 뒤에 확장자를 .c로 해서 저장합니다.

[시작] – [실행] – [cmd]를 쳐서 콘솔 창으로 이동합니다.

cd 명령을 이용해서 gcc가 있는 디렉토리로 이동합니다.

그런 다음 gcc 소스 파일 경로 및 이름.c –o 실행 파일 경로 및 파일명.exe

로 컴파일합니다.

실행은 콘솔 창에서 실행 파일의 경로 및 파일 명을 입력하면 됩니다.

 

1. 메모장에 아래와 같이 작성해서 C:\Test.c로 저장

#include <stdio.h>

int main()

{

         printf("Hello World");

}

 

2. [시작] – [실행] – [cmd]

 

3. 실행 창에서 아래 와 같이 입력

C:\gcc\Bin>gcc c:\test.c -o c:\test.exe

C:\gcc\Bin>c:\test

Hello World


 

6. C 프로그램의 구조

1) 전처리부(Preprocessor)

- 먼저 컴파일 되는 부분

 

2) 전역 변수 선언부

- 전역 자료 형이나 변수를 선언하는 부분

 

3) 사용자정의함수 선언부

- 사용자가 직접 만들어 사용하는 함수를 선언하는 부분

 

4) 메인 함수부

- 기본적으로 존재해야 하는 함수

 

하지만 이 구조가 꼭 지켜져야 하는 것은 아닙니다.

main() 함수는 꼭 있어야 하지만 때론 전역변수 선언부나 사용자정의 함수부분은 존재하지 않을 수도 있습니다.

 

1-2 실습예제

#include <stdio.h>

int a;

void hello( )

{

        printf("안녕하세요\n");

        a = 2;

        printf("이예제는%d번째예제입니다\n",a);

}

int main( )

{

        hello();

        system("pause");

        return 0;

}

 


 

7. C 언어의 구성요소

1)키워드(Keyword)

C언어 차제가 의미를 미리 정해 놓은 단어들이며 예약어(Reserved word)입니다.

C언어가 이미 사용하고 있는 단어들이므로 다른 목적으로 사용할 수 없습니다.

키워드와 똑같은 이름의 변수나 함수를 만들 수 없습니다.

만약 키워드와 같은 이름의 변수를 사용하면 컴파일러는 이것을 변수로 인식하지 않고 키워드로 인식하므로 변수나 함수의 역할을 할 수 없을 것입니다.

C언어의 키워드에는 아래와 같은 것들이 있습니다.

 

auto, case, cdecl, const, char, continue, default, do, double, else, enum,

extern, float, for, goto, if, int, long, register, return, short, signed,

sizeof, static, struct, switch, typedef, union, unsigned, void, volatile,

while, asm, class, delete, friend, inline, mutable, new, operator, private,

protected, public, template, this, virtual, explicit, ....

 

일반적으로 Visual C++에서는 파란색 글씨로 보이게 됩니다.

 

2) 사용자정의 명칭(Identifier)

사용자정의 명칭은 사용자가 직접 만들어서 사용하는 것입니다.

변수나 함수는 다른 것들과 구분되어야 하므로 영역 내에서는 자기만의 고유한 이름을 가져야 합니다.

만약 두 변수가 동일한 영역에서 같은 이름을 가진다면 컴파일러가 이 변수들을 구분하지 못하므로 제대로 컴파일되지 않을 것이다.

폴더 안에 속한 파일 이름들이 다르듯이 C언어에서도 사용자 정의 명칭은 동일한 영역에서 중복해서 사용할 수 가 없습니다.

사용자 정의 명칭은 사용자가 직접 정의하는 것이므로 이름을 자유롭게 붙일 수 있습니다.

입력하기 편리하도록 적당한 길이의 명칭을 작성하는 것이 좋고 최대한 의미를 기억하기 쉽도록 만드는 것이 좋습니다.

사용자정의명칭은 자유롭게 정의할 수 있으나 몇 가지 제약사항이 따릅니다.

① 키워드는 쓸 수 없습니다.

키워드는 C언어 자체가 이미 사용하고 있는 단어이기 때문에 명칭으로 사용해서는 안됩니다.

② 알파벳, 숫자, _ 로 구성됩니다.

그 외의 특수한 문자들이나 중간에 공백은 사용할 수 없습니다.

③ 첫 문자는 알파벳이나 _ 만 올 수 있습니다.

숫자는 사용자정의명칭의 중간에는 나올 수 있지만 숫자로 시작할 수는 없습니다.

C언어는 대소문자를 구분합니다.

대문자로 정의한 경우와 소문자로 정의한 경우는 전혀 다른 정의가 됩니다.

3)상수(Constant)

고정된 값을 가지는 것을 말합니다.

5, 10.7, ‘A’, “abc” 처럼 처음부터 고정된 값을 말합니다.

5는 정수상수이며 10.7은 실수상수, ‘A’는 문자상수, “abc”는 문자열 상수입니다.

 

4)연산자(Operator)

계산을 지시하는 기호들을 연산자라고 합니다.

+, -, *, / 같은 사칙 연산자들도 있고 이외에도 관계, 대입, 논리 연산자 등 다양한 연산자가 있습니다.

또한 C 언어만의 고유한 포인터 연산자, 삼항 연산자 등 도 있습니다.

 

5)구두점(Punctuator)

C언어에서 구성 요소를 구분하여 좀 더 분명한 의미를 가지도록 하는 구두점이 있습니다.

쉼표, 따옴표, 괄호, 세미콜론 등이 구두점으로 사용됩니다.

모든 명령의 마지막에는 세미콜론이 와야 합니다.

이 사실은 매우 중요합니다.

처음 C프로그램을 작성하는 분들은 세미콜론에 주의해야 합니다.

 

6)공백 문자(White Space)

스페이스와 탭, 개행(줄 바꿈)코드 등이 공백입니다.

공백 문자는 눈에 보이지 않지만 구성 요소들을 구분하는 아주 중요한 역할을 합니다.

 

7)주석(Comment)

설명을 위해 삽입되는 문자나 문장을 말합니다.

주석은 프로그램을 읽는 사람이 의미를 쉽게 파악할 수 있도록 설명을 붙여 놓는 것입니다.

어려운 부분이거나 보충설명이 필요한 부분 등에 대해서는 주석으로 설명을 달아 놓을 수 있습니다.

여러 줄의 주석은 /*로 시작해서 */로 끝나고 한 줄 주석을 쓰고 싶을 때는 //를 사용합니다.

주석은 컴파일러가 번역하지 않으므로 한글과 영문 모두 가능합니다.

프로그램을 작성할 경우에는 주석을 삽입하여 다른 사람이 알아보기 쉽게 하고 차후에 자신이 자신의 프로그램을 수정하는 경우에도 사용할 수 있으므로 습관화 하는게 좋습니다.

주석은 이외에도 에러가 발생한 경우 특정부분을 주석 처리하여 에러를 찾는데도 이용하기도 합니다.

 


 

다음이 주석을 활용한 예제입니다.

1-3 실습예제

/*

두개의문장을출력하는예제

*/

#include <stdio.h>

int main()

{

        printf("안녕하세요\n");

        printf("반갑습니다\n");

        //\n 은줄을바꿔주는제어문자입니다.

        system("pause");

        return 0;

}

 


 

8. 프로그램 작성 규칙

1) C언어는 대소문자를 구분하므로 키워드나 명칭 등을 작성할 때 대소문자 구분에 유의해야 합니다.

변수를 선언할 때는 Score로 선언해 놓고 쓸 때는 score로 쓰면 이 변수는 선언되지 않은 것으로 취급됩니다.

또한 main Main으로 써도 안되며 예약어들도 대소문자에 맞게 써야 한다.

INT num; 이라고 쓰면 안됩니다.

C의 예약어들은 모두 소문자입니다.

 

2) C 프로그램은 항상 main 함수로 시작합니다.

C는 함수 위주의 언어이며 필요한 함수를 자유롭게 만들어 쓸 수 있는데 함수 중에 반드시 있어야 하는 함수가 바로 main 함수입니다.

main은 프로그램의 시작점이 되며 이름이 고정되어 있습니다.

컴파일러는 main에서부터 실행을 시작합니다.

하나의 프로젝트에 반드시 하나의 main()만 존재해야 합니다.

 

3) 모든 문장은 세미콜론으로 끝이 나는데 세미콜론은 자연어의 마침표에 해당합니다.

컴파일러는 세미콜론을 기준으로 어디서 어디까지가 한 문장인지를 구분하므로 모든 명령 끝에 반드시 세미콜론을 달아 주도록 해야 합니다.

 

4) C언어는 프리 포맷(Free Format)을 지원합니다.

문법에만 맞으면 한 줄에 붙여 쓸 수도 있고 여러 줄에 나누어 쓸 수도 있습니다.

조금 여백을 주기 위해 괜히 한 줄을 비워 둘 수도 있으며 들여쓰기나 공백의 개수도 편한 대로 작성할 수 있습니다.

 

연습문제) 자기 자신의 이름을 출력하는 프로그램을 작성하시오.

#include <stdio.h>

int main()

{

         printf("박 문석\n");

         system("pause");

         return 0;

}


:
Posted by 에너지발전소
2010. 5. 24. 20:52

[12일차]Protocol Objective-C2010. 5. 24. 20:52


6. 프로토콜의 정합성 여부확인
* 재정의하면 안되는 메서드
+(BOOL)conformsToProtocol:@protocol(프로토콜이름)
                                         ==>대신에 프로토콜클래스 객체를 이용해도 됨
-(BOOL)conformsToProtocol:@protocol(프로토콜이름)
:호출하는 인스턴스나 클래스가 프로토콜이름에 기재된 프로토콜을 인증하고 있으면 YES 아니면 NO를 리턴
:프로토콜 클래스 객체 얻기
Protocol * 변수명 = @protocol(프로토콜이름)


앞쪽의 프로토콜과 클래스 구현부
    <ProtocolToString>    =>Test<ProtocolToString>


7. 비공식 프로토콜 =>@required (필수), @optional (선택) 로 전향
:
=>NSObject의 카테고리를 생성해서 메서드를 구현해도되고 안해도 되는 형태
=>프로토콜의 인증을 받으려면 프로토콜에 선언되어 있는 모든 메서드를구현


*AutoreleasePool (임시변수 생성시 활용)
1. AutoreleasePool
=>foundation에 속한 클래스읭 인스턴스들은 시스템이 메모리공간을 해제할 수 있도록 AutoreleasePool에 등록이 되어야 합니다.
=>인스턴스들이 release를 호출하지 않아도 pool이 drain을 호출하는 순간 자동적으로 release를 수행
=>AutoreleasePool에 등록하는 방법은 autorelease라는 메서드를 호출하면 됩니다. 현재위치에서 가장 가까운 pool에 등록됨
=>등록을 해도 retainCount에는 변함이 없으며 pool이 drain 될때 retainCount만 1씩 감소

1)생성
NSAutoreleasePool * 변수명 = [[NSAutoreleasePool alloc] init];

2)해제
[변수명 drain];
=>NSAutoreleasePool.h 에 정의 및 구현

* 자동적으로 retainCount가 변하는 경우
=> 강한 참조를 사용하는 collection에 삽입되는 경우 retain을 호출한것과 동일한 효과
=> collection에서 제거되는 경우 release를 호출한것과 동일한 효과
=>Copy메서드를 이용한 복사시에도 retain을 호출하는 효과

ex)retain, alloc, release를 호출하지 않아도 retainCount가 변하는 경우
:
Posted by 에너지발전소