Code Library/Objective C | Posted by 서비 2010/07/28 22:39

아이폰 개발 예제들

* 특정 포맷의 문자열 작성
NSString *aString = @"Cool";
NSString *myString = [NSString stringWithFormat:@"It's '%@'", aString];

* 문자열 수정
- (NSString *)stringByAppendingString:(NSString *)string;
- (NSString *)stringByAppendingFormat:(NSString *)string;
- (NSString *)stringByDeletingPathComponent;

NSString *myString = @"Hello";
NSString *fullString;
fullString = [myString stringByAppendingString:@" world!"]; // Hello world!

* 유용 NSString methods
- (BOOL)isEqualToString:(NSString *)string;
- (BOOL)hasPrefix:(NSString *)string;
- (int)intValue;
- (double)doubleValue;

* 유용 NSMutableString methods
+ (id)string;
- (void)appendString:(NSString *)string;
- (void)appendFormat:(NSString *)format, ...;

* 유용 NSArray methods
+ arrayWithObjects:(id)firstObj, ...;
- (unsigned)count;
- (id)objectAtIndex:(unsigned)index;
- (unsigned)indexOfObject:(id)object;

* 유용 NSMutableArray methods
+ (NSMutableArray *)array;
- (void)addObject:(id)object;
- (void)removeObject:(id)oject;
- (void)removeAllObjects;
- (void)insertObject:(id)object atIndex:(unsigned)index;

* 유용 NSDictionary methods
+ dictionaryWithObjectsAndKeys:(id)firstObject, ...;
- (unsigned)count;
- (id)objectForKey:(id)key;

* 유용 NSMutableDictionary methods
+ (NSMutableDictionary *)dictionary;
- (void)setObject:(id)object forKey:(id)key;
- (void)removeObjectForKey:(id)key;
- (void)removeAllObjects;

[colors setObject:@"Orange" forKey:@"HighlightColor"];

* 유용 NSSet methods : Unordered collection of objects
+ setWithObjects:(id)firstObj, ...;
- (unsigned)count;
- (BOOL)containsObject:(id)object;

* 유용 NSMutableSet methods
+ (NSMutableSet *)set;
- (void)addObject:(id)object;
- (void)removeObject:(id)object;
- (void)removeAllObjects;
- (void)intersectSet:(NSSet *)otherSet;
- (void)minusSet:(NSSet *)otherSet;

* 유용 NSNumber methods
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithDouble:(double)value;
- (int)intValue;
- (double)doubleValue;

* Selectors 활용 예
SEL mySelector = @(name);
SEL anotherSelector = @(setName:);
SEL lastSelector = @(doStuff:withThing:andThing:); // 3개의 arguments

* 클래스 / 인스턴스 메소드
+ methodName : 클래스 메소드
- methodName : 인스턴스 메소드

* 아이폰 시뮬레이터 단축키
스크린 방향 바꾸기 : command+왼쪽 화살표, command+오른쪽 화살표
홈으로 돌아가기 : command+shift+H
폰 잠그기 : command+L

* 자동회전과 리사이즈에 대한 지원
contentView.autoresizesSubviews = YES;
contentView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);

* 하위뷰 추가
[parentView addSubview:child];

* 하위뷰 확인
[parentView subviews];

* 하위뷰 제거
[childView removeFromSuperview];

* 하위뷰 순서 변경
[parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j];

* 직사각형 정의
CGRectMake(origin.x, origin.y, size.with, size.height);

* CGRect 구조체를 문자열로 변환
NSStringFromCGRect(myCGRect);

* 문자열을 CGRect 구조체로 변환
CGRectFromString(myString);

* 동일 위치에 정렬된 직사각형 생성
CGRectInset(myCGRect);

* 구조체 교차여부 확인
CGRectIntersectsRect(rect1, rect2);

* (0,0)에 위치한 높이 0의 직사각형 상수
CGRectZero;

* 상태바 숨기기
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];

* 가로보기 모드로 강제 전환
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

* 랜덤함수 사용예(3개의 색깔중 하나 선택)
NSString *myColor = [[NSArray arrayWithObjects:@"blue", @"red", @"green", nil] objectAtIndex:(random() % 3)];

* 드래그 뷰 생성
DragView *dragger = [[DragView alloc] initWithFrame:dragRect];

* 사용자 상호작용 설정
[dragger setUserInteractionEnabled:YES];

* 선택한 뷰를 맨 앞으로 가져옴
[[self superview] bringSubviewToFront:self];

* 사용자 디폴트 저장하기
[[NSUserDefaults standardUserDefaults] setObject:myScore forKey:@"myScore"];
[[NSUserDefaults standardUserDefaults] synchronize];

* 사용자 디폴트 불러오기
NSMutableArray *myScore;
myScore = [[NSUserDefaults standardUserDefaults] objectForKey:@"myScore"];

* 상단 버튼 삽입(setPlus는 함수명)
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"더하기" style:UIBarButtonItemStylePlain target:self action:@(setPlus)] autorelease];

* Superclass methods
Implicit variable, "self" : Like "this" in Java and C++
Superclass methods, "super"

* Object Creation
1st step : allocate memory to store the object
2nd step : initialize object state

+ alloc : class method(cf. dealloc for destruction)
- init : instance method

Person *person = nil;
person = [[Person allocinit];

* Multiple init methods
- (id)init;
- (id)initWithName:(NSString *)name;
- (id)initWithName:(NSString *)name age:(int)age;

- (id) init {
return [self initWithName:@"No Name"];
}
- (id) initWithName:(NSString *)name {
return [self initWithName:name age:0];
}

* Reference Counting
As long as retain count is greater than zero, object is alive and valid.
+alloc and -copy create objects with retain count == 1.
-retain increments retain count.
-release decrements retain count.
When retain count reaches 0, object is destroyed.(-dealloc method invoked automatically.)

You only deal with alloc, copy, retain, release.
You never call dealloc explicitly in your code except for "[super dealloc]".

* Returning a newly created object
- (NSString *) fullName {
NSString *result;
result = [[NSString alloc] initWithFormat:@"%@ %@", firstName, lastName];
[result autorelease];
return result;
}
The result is released, but not right away. Caller gets valid object and could retain if needed.

* Getters and Setters
- (int)age;
- (void)setAge:(int)age;

* Properties allow access to setters and getters through dot syntax
@ age;
int theAge = person.age;
person.age = 21;

* Various methods of UIApplicationDelegate
- (void)applicationDidFinishLaunching:(UIApplication *)application;
- (void)applicationWillTerminate:(UIApplication *)application;

- (void)applicationWillResignActive:(UIApplication *)application;
- (void)application:(UIApplication *)application handleOpenURL:(NSURL *)url;

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;

* 3 different flavors of action method selector types
- (void)actionMethod;
- (void)actionMethod:(id)sender;
- (void)actionMethod:(id)sender withEvent:(UIEvent *)event;

* Manual Target-Action
@ UIControl;
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
- (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;





> Stanford Lecture #5

* Add/remove views
- (void)addSubview:(UIView *)view;
- (void)removeFromSuperview;

* Manipulate the view hierarchy
- (void)insertSubview:(UIView *)view atIndex:(int)index;
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)view;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)view;
- (void)exchangeSubviewAtIndex:(int)index withSubviewAtIndex:(int)otherindex;

* 일시적으로 뷰 감추기
myView.hidden = YES;

* View location
CGPoint(x, y);

* View dimension
CGSize(width, height);

* View location and dimension
CGRect(origin, size);

* Manual view creation
CGRect frame = CGRectMake(20, 45, 140, 21);
UILabel *label = [[UILabel alloc] initWithFrame:frame];

[window addSubview:label];
[label setText:@"Number of sides:"];
[label release];

* Defining custom views
- (void)drawRect:(CGRect)rect;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

* When a view needs to be redrawn, use:
- (void)setNeedsDisplay;

[polygonView setNeedsDisplay];

* Access the graphics context within drawRect: by calling
(CGContextRef)UIGraphicsGetCurrentContext(void);

* 색상 설정
UIColor *redColor = [UIColor redColor];
[redColor set];
// [[UIColor redColor] set] 과 동일

* 폰트 설정
UIFont *font = [UIFont systemFontOfSize:14.0];
[myLabel setFont:font];

* 도형 색 채우기
UIRectFill(square);

* 테두리 색 채우기
UIRectFrame(square);

* 이미지 삽입하는 3가지 방법
+ [UIImage imageNamed:(NSString *)name];
- [UIImage initWithContentsOfFile:(NSString *)path];
- [UIImage initWithData:(NSData *)data];

* Bitmap image example
UIGraphicsBeginImageContext(size);
// drawing code...
result = UIGraphicsGetImageFromCurrentContext();
UIGraphicsEndImageContext();
return result;

* Getting image data
NSData *UIImagePNGRepresentation (UIImage *image);
NSData *UIImageJPGRepresentation (UIImage *image);

* Drawing text & images
- [UIImage drawAtPoint:(CGPoint)point);
- [UIImage drawInRect:(CGRect)rect);
- [UIImage drawAsPatternInRect:(CGRect)rect);
- [NSString drawAtPoint:(CGPoint)point withFont:(UIFont *)font];

* View animation example
- (void)showAdvancedOptions {
[UIView beginAnimations:@"advancedAnimations" context:nil];
[UIView setAnimationDuration:0.3];

// make optionsView visible
optionsView.alpha = 1.0;

// move the polygonView down
CGRect polygonFrame = polygonView.frame;
polygonFrame.origin.y += 200;
polygonView.frame = polygonFrame;

[UIView commitAnimations];
}

* View transforms
CGAffineTransformScale(transform, xScale, yScale);
CGAffineTransformRotate(transform, angle);
CGAffineTransformTranslate(transform, xDelta, yDelta);

* Saving state across app launches
+ (NSUserDefaults *)standardUserDefaults;

- (int)integerForKey:(NSString *)key;
- (void)setInteger:(int)value forKey:(NSString *)key;

- (id)objectForKey:(NSString *)key;
- (void)setObject:(id)value forKey:(NSString *)key;

* Creating a view in Code
- (void)loadView{
MyView *myView = [[MyView alloc] initWithFrame:frame];
self.view = myView;
[myView release];
}

* View controller lifecycle
- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { }
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)viewWillDisappear:(BOOL)animated {}

* Loading & Saving data
NSUserDefaults
Property lists
SQLite
Web services

* Supporting interface rotation
- (void)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
// This view controller only supports portrait.

// retrun (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
// This view controller supports all orientations except for upside-down.
}

* Autoresizing your views
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;

* Push to add a view controller
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

* Pop to remove a view controller
- (void)popViewControllerAnimated:(BOOL)animated;

* Pushing your first view controller
- (void)applicationDidFinishLaunching:(UIApplication *)application {
navController = [[UINavigationController alloc] init];
[navController pushViewController:firstViewController animated:NO];
[window addSubview:navController.view];
}

* Push from within a view controller on the desk
- (void)myAction:(id)sender{
UIViewController *viewController = ...;
[self.navigationController pushViewController:viewController animated:YES];
}

* Text bar button item
- (void)viewDidLoad{
UIBarButtonItem *fooButton = [[UIBarButtonItem alloc] initWithTitle:@"Foo" style:UIBarButtonItemStyleBordered target:self action:@(foo:)];
self.navigationItem.leftBarButtonItem = fooButton;
[fooButton release];
}

* System bar button item
- (void)viewDidLoad{
UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd style:UIBarButtonItemStyleBordered target:self action:@(add:)];
self.navigationItem.rightBarButtonItem = addButton;
[addButton release];
}

* Edit/Done button
self.navigationItem.leftBarButtonItem = self.editButtonItem;
- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
// Update appearance of views
}

* Custom title view
UISegmentedControl *segmentedControl = ...;
self.navigationItem.titleView = segmentedControl;
[segmentedControl release];

* Back button
self.title = @"Hello there, CS193P!";
UIBarButtonItem *heyButton = [[UIBarButtonItem alloc] initWithTitle:@"Hey!" ...];
self.navigationItem.backButtonItem = heyButton;
[heyButton release];
vs.

* Setting up a Tab Bar controller
- (void)applicationDidFinishLaunching:(UIApplication *)application {
tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = myViewControllers;
[window addSubview:tabBarController.view];
}

* Creating Tab Bar items : Title and image
- (void)viewDidLoad{
self.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Playlists" image:[UIImage imageNamed:@"music.png"] tag:0];
}

* Creating Tab Bar items : System item
- (void)viewDidLoad{
self.tabBarItem = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:0];
}

* Nesting Navigation Controllers
- Create a Tab Bar controller
tabBarController = [[UITabBarController alloc] init];

- Create each Navigation controller
navController = [[UINavigationController alloc] init];
[navController pushViewController:firstViewController animated:NO];

- Add them to the Tab Bar controller
tabBarController.viewControllers = [NSArray arrayWithObjects:navControlleranotherNavControllersomeViewController, nil];

* Using a Scroll View
// Create with the desired frame
CGRect frame = CGRectMake(0, 0, 200, 200);

// Add subviews
frame = CGRectMake(0, 0, 500, 500);
myImageView = [[UIImageView alloc] initWithFrame:frame];
[scrollView addSubview:myImageView];

// Set the content size
scrollView.contentSize = CGSizeMake(500, 500);

* UIScrollView delegate
@ UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
...
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

* Zooming with a Scroll View
scrollView.maximumZoomScale = 2.0;
scrollView.minimumZoomScale = scrollView.size.width / myImage.size.width;
- (UIView *)viewForZoomingInScrollView:(UIView *)view{
return someViewThatWillBeScaled;
}

* Provide number of sections and rows
- (NSInteger)numberOfSectionsInTableView:(UITableView *)table;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

* Provide cells for table view as needed
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

* Category on NSIndexPath with helper methods
+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section;
@(nonatomic,readonly) NSUInteger section;
@(nonatomic,readonly) NSUInteger row;

* Cell reuse
- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

* Triggering updates
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.tableView reloadData];
}

* Customize appearance of table view cell
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

* Validate and respond to selection changes
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

* Responding to selection
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSUInteger row = indexPath.row;
id objectToDisplay = [myObjects objectAtIndex:row];

MyViewController *myViewController = ...;
myViewController.object = objectToDisplay;

[self.navigationController pushViewController:myViewController animated:YES];
}

* Altering or disabling selection
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if(indexPath.row == ...){
return nil;
}else{
return indexPath;
}
}

* Accessory types
- (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath;

UITableViewCellAccessoryDisclosureIndicator

UITableViewCellAccessoryDetailDisclosureButton

UITableViewCellAccessoryCheckmark

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSUInteger row = indexPath.row;
...
}

* Add additional views to the content view
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = ...;
CGRect frame = cell.contentView.bounds;

UILabel *myLabel = [[UILabel alloc] initWithFrame:frame];
myLabel.text = ...;
[cell.contentView addSubview:myLabel];

[myLabel release];
}

* Custom row heights
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *text = ...;
UIFont *font = [UIFont systemFontOfSize:...];
CGSize withinSize = CGSizeMake(tableView.width, 1000];

CGSize size = [text sizeWithFont:font constrainedToSize:withinSize lineBreakMode:UILineBreakModeWordWrap];
return size.height + somePadding;
}

* Reading property lists
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;

* Writing property lists
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;

* Writing an array to disk
NSArray *array = [NSArray arrayWithObjects:@"Foo", [NSNumber numberWithBool:YES], [NSDate dateWithTimeIntervalSinceNow:60], nil];
[array writeToFile:@"MyArray.plist" atomically:YES];

* Writing a dictionary to disk
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Name", @"Evan", @"Lecture", [NSNumber numberWithInt:9], nil];
[dict writeToFile:@"MyDict.plist" atomically:YES];

* Property list to NSData
+ (NSData *)dataFromPropertyList:(id)plist format:(NSPropertyListFormat)format errorDescription:(NSString *)errorString;

* NSData to property list
+ (id)propertyListFromData:(NSData *)data mutabilityOption:(NSPropertyListMutabilityOptions)opt format:(NSPropertyListFormat *)format errorDescription:(NSString *)errorString;



* Basic directories
NSString *homePath = NSHomeDirectory();
NSString *tmpPath = NSTemporaryDirectory();

* Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];

* <Application Home>/Documents/foo.plist
NSString *fooPath = [documentsPath stringByAppendingPathComponent:@"foo.plist"];



* Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder{
[super encodeWithCoder:coder];
[coder encodeObject:name forKey:@"Name"];
[coder encodeInteger:numberOfSides forKey:@"Sides"];
}

* Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder{
self = [super initWithCoder:coder];
name = [[coder decodeObjectForKey:@"Name"] retain];
numberOfSides = [coder decodeIntegerForKey:@"Sides"];
}

* Creating an archive
NSArray *polygons = ...;
NSString *path = ...;
BOOL result = [NSKeyedArchiver archiveRootObject:polygons toFile:path];

* Decoding an archive
NSArray *polygons = nil;
NSString *path = ...;
polygons = [NSKeyedUnarchiver unarchiveObjectWithFile:path];



* Open the database
int sqlite3_open(const char *filename, sqlite3 **db);

* Execute a SQL statement
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*, int, char**, char**), void *context, char **error);

* Close the database
int sqlite3_close(sqlite3 *db);



* Options for parsing XML
libxml2 vs. NSXMLParser

* Reading a JSON string into Foundation objects
#import <JSON/JSON.h>
NSString *jsonString = ...;
id object = [jsonString JSONValue];

* Writing a JSON string from Foundation objects
NSDictionary *dictionary = ...;
jsonString = [dictionary JSONRepresentation];

* Finding (memory) leaks



* Typical NSThread use case
- (void)someAction:(id)sender{
// Fire up a new thread
[NSThread detachNewThreadSelector:@(doWork:) withTarget:self object:someData];
}

- (void)doWork:(id)someData{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[someData doLotsOfWork];

// Message back to the main thread
[self performSelectorOnMainThread:@(allDone:) withObject:[someData result] waitUntilDone:NO];
[pool release];
}



* NSLock and subclasses
- (void)someMethod{
[myLock lock];
// We only want one thread executing this code at once
[myLock unlock];
}

* Conditions
// On the producer thread
- (void)produceData{
[condition lock];
newDataExists = YES;
[condition signal];
[condition unlock];
}

// On the consumer thread
- (void)consumeData{
[condition lock];
while(!newDataExists){
[condition wait];
}
newDataExists = NO;
[condition unlock];
}



* Define a custom init method
- (id)initWithSomeObject:(id)someObject{
self = [super init];
if(self){
self.someObject = someObject;
}
return self;
}

* Override - main method to do work
- (void)main{
[someObject doLotsOfTimeConsumingWork];
}



* Using an NSInvocationOperation
- (void)someAction:(id)sender{
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@(doWork:) object:someObject];
[queue addObject:operation];
[operation release];
}

출처 : http://blog.missflash.com/
Code Library/Objective C | Posted by 서비 2010/07/28 13:25

NSString 을 int 로 변환하기

NSString를 int로 변환 하는 방법.


NSString *nStr;
nStr = @"16";
int j = [nStr intValue];



int를 NSString로 변환 하는 방법.

int j = 0;
NSString *nStr = [NSString stringWithFormat:@"%d",j];

Code Library/Objective C | Posted by 서비 2010/07/28 13:21

NSString 문자열 비교


NSString *strText = idField.text;
if([srText isEqualToString:@"mihr01"])
....
else if([srText isEqualToString:@"mihr02"])
....
else
...

문자열이 포함된 것을 찾으려면 (Pos 함수와 비슷)
if([strText rangeOfString:@"mihr01"].length) 
Code Library/Objective C | Posted by 서비 2010/07/28 13:19

전역변수 사용법 - 싱글톤

h file...
@interface  GlobalTest : NSObject {
    NSString *msg;
}
+ (GlobalTest *)sharedSingleton;

m file...

@implementation Conf

static GlobalTest * _globalTest = nil;

- (id) init {
   msg = @"Globall Value Test";
}

+(GlobalTest *)sharedSingleton
{
    @synchronized([GlobalTest class])
    {
        if (!_globalTest)        
            [[self alloc] init];
        
        return _globalTest;
    }
    
    return nil;
}

+(id)alloc
{
    @synchronized([GlobalTest class])
    {
        NSAssert(_globalTest == nil, @"Attempted to allocate a second instance of a singleton.");
        _globalTest = [super alloc];
        return _globalTest;
    }
    
    return nil;
}

호출시
#import "GlobalTest.h"

NSLog([[GlobalTest sharedSingleton] msg]);

변수에 값을 대입하고 싶으면 프로퍼티 선언 후
[[GlobalTest sharedSingleton] setMsg:@"text"];
Code Library/Objective C | Posted by 서비 2010/07/28 12:52

NSNumber 활용법

int -> NSNumer
NSNumber *anotherNum = [NSNumber numberWithInt: 5];
count = [NSNumber numberWithInt: [count intValue] + 2];
count = [NSNumber numberWithInt: [count intValue] + [anotherNum intValue];

비교문
if([count intValue] == 10) -> true

NSNumber -> int
NSNumber *count=[NSNumber numberWithInt:3];
Code Library/Objective C | Posted by 서비 2010/05/17 01:02

UIImageView URL로 로드하기

UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.abc.com/image.png"]]]];
Research/시맨틱웹 | Posted by 서비 2008/11/10 21:15

foaf 작성툴

http://foafme.opendfki.de/
http://mimul.com/pebble/default/2008/02/23/1203756420000.html

TAGFOAF

FOAF에 대한 조사를 진행하면서 한글로 된 웹 문서들을 모아 링크하고 간단히 요약해 보았습니다.

FOAF'Friend of a friend'의 약자로 '친구의 친구'입니다. '나의 친구의 친구는 또한 나의 친구'라는 생각으로 시작된 프로젝트로서, 단순화된 rdf 규격을 사용하고 있어 시맨틱웹으로의 라이트한 접근으로 여겨지고 있습니다. 팀 버너스-리 아저씨가 요즘 주력으로 밀고있다고 하네요. 많은 사람들이 FOAF를 가질수록 다양한 분석이 이루어질수있어, FOAF를 개인 홈페이지에 좀 올려달라고 홍보한다고 합니다.

FOAF의 가장 큰 문제는, 사람들이 직접 만들어야 하고 업데이트도 해줘야 한다는겁니다. HTML이 뭔지도 모르는 사람들에게 RDF문서를 컨트롤하게 해야하는 난관이 버티고 있는것이죠. 물론 이 문제 해결을 위해 여러 연구가 진행되고 있고, 다양한 시도가 있으며, 저도 매우 관심이 있습니다. 아래 많은 분들의 글을 보고 고민을 해보았으면 좋겠습니다.

잘못된 부분이나 원 저자분께 실례가 된 부분이 있다면 알려주십시오. 바로 수정하겠습니다. 또한 좋은 관련글이 있으면 추천 부탁드립니다.^^


FOAF의 제작과 실제적인 응용

시맨틱 소셜 네트워크를 향해 - DERI 연구소 김학래님의 DeveloperWorks 기고 글
  • 시맨틱 소셜 네트워크를 향해, Part 1: 시맨틱 소셜 네트워크와 FOAF(Friend Of A Friend) - http://www.ibm.com/developerworks/kr/library/s_issue/20070731/

    : 시맨틱웹에 대한 간단한 설명과 링크관계, 그리고 소셜 네트워크와의 연관성을 설명하고 있다. 시맨틱웹 기술로 소셜네트워크를 이해할수 있다는 가능성을 보여주고, 그 표현방법으로 FOAF에 대한 설명을 진행함. FOAF-a-Matic에 대한 설명도 포함됨

  • 시맨틱 소셜 네트워크를 향해, Part 2: FOAF 기반의 소셜 네트워크 분석 - http://www.ibm.com/developerworks/kr/library/s_issue/20070904/

    : FOAF를 활용한 실제적인 예를 보여줌. '보고 싶다 친구야'프로의 출연자들의 관계 그래프를 통해 간단히 설명하고 FOAF를 직접적으로 활용한 애플리케이션을 보임

  • 시맨틱 소셜 네트워크를 향해, Part 3: 의미 있는 온라인 활동망 구축하기 - http://www.ibm.com/developerworks/kr/library/s_issue/20071009/

    : 다양한 온톨로지와 FOAF의 결합을 통해 시맨틱 소셜 네트워크를 만드는 방안을 제시

  • SIOC: 시맨틱 웹 기술을 이용한 커뮤니티 간의 연결 - http://www.ibm.com/developerworks/kr/library/dwcod/20061017/

    : 김학래님의 SIOC에 대한 대략적인 설명. 커뮤니티 사이의 관꼐를 표현하는 SIOC 온톨로지와 이를 처리하기 위한 애플리케이션을 설명함


사람들의 FOAF에 대한 이해

  • 데이터 포터빌리티에 딴지걸기 - http://memoriesreloaded.net/2257360

    : TNC의 CK님의 글. 유저 프로필을 웹에 표현한다는 측면으로 본 고찰. 시맨틱웹적 접근이 아닌 업계의 사람으로서 생각하는 문제점에 대하여 이야기하고 있음

  • FOAF와 XFN 개념잡기 - http://cfamily.tistory.com/12

    : FOAF와 XFN에 대한 간단한 이야기

  • Portable Social Network 기술 정리 및 분석 - http://ayo79.egloos.com/3508860

    : 김승현님의 글. OpenID와 XFN과의 결합에 대한 세계 동향 이야기. 자세히 읽고 관련 연구들에 대해 조사해볼만함

  • 나도 이제 블로거가 되어 볼까?... - http://miconblog.com/tc/sohn/168

    : FOAF프로젝트의 필요성에 대한 간단한 이야기. 접근방법에 대한 방향 제시의 하나로 생각할 수 있겠음

  • FOAF, XFN 개념을 잡으신 분들을 위한 팁 - http://coolengineer.com/entry/xfn-foaf-url-tips
    : 웹페이지에 FOAF나 XFN을 적용하면서 주의해야하는 관계 설정에 대한 이야기

웹/시맨틱웹에 대한 이슈를 다루면서 FOAF에 대한 언급이 있는 글

Research/시맨틱웹 | Posted by 서비 2008/11/10 20:16

OWL 웹 온톨로지 언어의 개요

번역자 서문

본 문서는 OWL Web Ontology Language Overview( http://www.w3.org/TR/2004/REC-owl-features-20040210/)의 한글 번역입니다. 이 문서에는 번역 상의 오류가 있을 수 있습니다. 내용에 대한 보증은 하지 않으므로 반드시 W3C의 원본 문서 참조하기 바랍니다. 번역자 이메일 주소로 번역 오류 및 정정 의견 등을 보내 주시면 문서에 반영토록 하겠습니다. 번역할 때 용어 한글화가 어려웠습니다. 용어 한글화 목록을 참조하시고, 의견주세요.
This is a Korean translation of "OWL Web Ontology Language Overview W3C Recommendation 10 February 2004", which may contain some translation errors. The only authoritative version of the document is the english version which is available at http://www.w3.org/TR/2004/REC-owl-features-20040210/.
-- 2004년 2월 21일 장민수m i n s u at e t r i dot r e dot k r



W3C

OWL 웹 온톨로지 언어
개요

W3C 권고안 2004년 2월 10일

본 판본(영문판):
http://www.w3.org/TR/2004/REC-owl-features-20040210/
최신판본(영문판):
http://www.w3.org/TR/owl-features/
이전판본(영문판):
http://www.w3.org/TR/2003/PR-owl-features-20031215/
편집한 사람:
Deborah L. McGuinness (Knowledge Systems Laboratory, Stanford University) d l m at k s l dot stanford dot edu
Frank van Harmelen (Vrije Universiteit, Amsterdam) Frank.van.Harmelen@cs.vu.nl
번역한 사람:
장민수 (한국전자통신연구원) m i n s u at e t r i dot r e dot k r
번역본 최종 수정일:
2004년 2월 25일
본 번역본:
http://mknows.etri.re.kr/translations/REC-owl-features-20040210-ko-v01.html

본 문서에 대한 오류수정목록에 주요 내용 정정 사항들이 기록되어 있으니 참조 바랍니다.

또한 본 문서의 번역본들도 참조하세요.


요약

OWL 웹 온톨로지 언어는 단지 사람에게 정보를 표시하는데 그치지 않고 정보의 내용을 직접 처리할 수 있는 어플리케이션을 구현하는데 활용될 수 있도록 설계된 언어이다. OWL은 풍부한 어휘(vocabulary)와 형식적 의미론(formal semantics)을 포함하고 있기 때문에 기계 해석이 가능한 웹 컨텐트를 저작하는데 있어 XML, RDF 및 RDF 스키마(RDF-S)보다 뛰어나다. OWL은 표현력이 서로 다른 세 개의 하위 언어 - OWL Lite, OWL DL, OWL Full - 로 구성되어 있다. 후자로 갈수록 표현력이 더 크다.

이 문서는 OWL을 처음 접하는 독자들을 위해 작성되었다. 본 문서는 OWL의 각 하위 언어 별로 구성 어휘에 대해 간략한 설명을 제공함으로써 OWL에 대한 전반적인 소개를 대신한다. 필수적이지는 않으나 RDF 스키마에 대한 사전 지식을 지니고 있으면 본 문서를 이해하는데 도움이 된다. 이 문서를 읽고 OWL에 대해 더 큰 관심을 갖게 된 독자는 OWL 가이드를 읽으면 된다. OWL 가이드는 OWL의 표현력에 대한 상세한 설명과 함께 다양한 예제를 포함하고 있다. OWL의 형식적 정의는 OWL 의미론과 추상 문법 명세서에 제시되어 있다.

본 문서의 위상

이 문서는 W3C 회원과 관련 단체 및 관계자들의 검토를 거쳤고, 임원의 승인을 받아 W3C 권고안으로 제정되었다. 권고안 제정을 통해 W3C는 권고안이 된 기술 명세에 대한 관심을 불러 일으키고 널리 보급하는 역할을 수행한다. 이를 통해 웹의 기능성과 상호 통용성을 강화한다.

이 문서는 웹 온톨로지 언어인 OWL과 관련된 6개의 W3C 권고안 중 하나이다. 이 문서는 W3C 시맨틱 웹 활동의 일환으로 웹 온톨로지 워킹 그룹에 의해 개발되었으며(시맨틱 웹 활동 성명, 그룹 강령), 2004년 2월 10일 발표되었다.

본 문서의 이전 버전 문서들을 통해 기술된 OWL의 설계안은 광범위하게 검토되었으며, 이제 워킹 그룹의 기술적 요구사항을 만족시키게 되었다. 웹 온톨로지 워킹 그룹은 접수된 모든 정정 요구 및 조언들을 고려하였으며, 필요한 경우 반영하였다. 추천 권고안 발표 이후 수정된 사항들은 변경 이력 란에 자세히 기술하였다.

본 문서에 대한 의견은 public-webont-comments@w3.org (아카이브)로 보내면 되고, 기술적 토의 사항은 www-rdf-logic@w3.org (아카이브)로 보내면 된다.

OWL 구현 시스템 목록은 여기에서 볼 수 있다.

W3C는 본 문서와 관련한 특허 존재 여부 목록을 유지하고 있다.

본 장은 발표 시점에 있어 본 문서의 위상이 어떤한지 설명한다. 본 문서는 다른 문서에 의해 대체될 수 있다. W3C의 모든 발표 문서 및 최신 개정판 목록은 http://www.w3.org/TR/에 위치한 W3C 기술 문서 목록에서 볼 수 있다.


목차

  1. 소개
    1. 문서 로드맵
    2. 왜 OWL인가?
    3. OWL의 세 하위 언어
    4. 본 문서의 구성
  2. 언어 개요
    1. OWL Lite 개요
    2. OWL DL 및 OWL Full 개요
  3. OWL Lite 해설
    1. OWL Lite: RDF 스키마 어휘
    2. OWL Lite: 동치성 및 비동치성
    3. OWL Lite: 속성의 특성
    4. OWL Lite: 속성 제약
    5. OWL Lite: 제한된 관계차수
    6. OWL Lite: 클래스 교차
    7. OWL 데이터타입
    8. OWL Lite 헤더 정보
    9. OWL Lite 주석 속성
    10. OWL Lite 버전 관리
  4. OWL DL과 OWL Full에 추가된 어휘들
  5. 요약

  6. 참고 문헌
  7. 감사의 글
  8. 변경 이력

1. 소개

본 문서는 OWL 웹 온톨로지 언어에 대한 설명을 담고 있다. OWL은 문서에 포함된 정보를 어플리케이션을 이용하여 자동 처리하고자 할 때 활용하는 언어이다. OWL을 이용하면 임의의 어휘를 구성하는 용어(term)의 의미와 용어들 간의 관계를 명시적으로 표현할 수 있다. 이와 같이 용어와 용어들 간의 관계를 표현한 것을 온톨로지(Ontology)라 한다. OWL은 XML, RDF, RDF-S 보다 더 많은 의미 표현 수단을 제공하므로, 웹 상에서 기계가 해석할 수 있는 컨텐트를 작성하는데 있어 이들 언어보다 뛰어나다. OWL은 DAML+OIL 웹 온톨로지 언어로부터 파생된 언어이다. OWL에는 DAML+OIL의 설계 및 활용 경험으로부터 습득된 지식이 반영되어 있다.

1.1 문서 로드맵

OWL 언어는 여러 문서를 통해 기술되어 있다. 각 문서는 서로 다른 목적을 위해 작성되었으며 대상 독자도 다르다. 다음은 OWL 관련 문서 각각에 대한 간단한 소개이다.

위 목록의 첫 네 문서는 제시된 순서대로 읽으면 좋다. 기술적으로 점점 난이도가 높아지는 순서이기 때문이다.

1.2 왜 OWL인가?

시맨틱 웹은 웹의 미래에 대한 비전이다. 시맨틱 웹에서 정보는 명시적인 의미를 부여받게 되는데, 이를 통해 기계는 좀 더 쉽게 웹 상에 존재하는 정보들을 자동으로 처리하고 통합할 수 있다. 시맨틱 웹은 사용자 정의 태그 스키마를 정의할 수 있는 XML과 유연하게 데이터를 표현할 수 있는 RDF를 바탕으로 구축된다. 시맨틱 웹의 구현에 있어 RDF 바로 윗 계층에 필요한 것이 웹 문서에 포함된 용어의 의미를 형식적으로 기술할 수 있는 온톨로지 언어이다. 기계를 이용하여 웹 문서를 대상으로 유용한 추론 기능을 수행하려면 RDF 스키마가 제공하는 기초적인 의미 표현력을 뛰어넘는 언어가 필요하다. OWL 용례 및 요구 사항 명세서온톨로지에 대한 좀 더 상세한 설명과 함께 웹 온톨로지 언어의 필요성을 제시하는 여섯개의 용례를 제시하고 있고, OWL의 설계 목표, 요구 사항목적을 포함하고 있다.

OWL은 웹 온톨로지 언어에 대한 이와 같은 요구 사항을 만족시키기 위해 설계되었다. OWL은 W3C의 시맨틱 웹 관련 권고안들 중 하나다.

  • XML은 문서를 구조적으로 기술할 수 있는 문법을 제공한다. 그러나, 문서의 의미를 제한할 수 있는 수단을 제공하지는 않는다.

  • XML 스키마는 XML 문서의 구조를 기술할 수 있는 언어이다. 또한 XML 스키마는 XML에 데이터타입을 추가한다.

  • RDF는 객체("자원") 및 객체 사이의 관계를 표현하는 데이터 모델이다. RDF는 이 데이터 모델에 대한 간단한 의미론(semantics)을 제공한다. 또한, 이 데이터 모델은 XML 구문으로 표현될 수 있다.

  • RDF 스키마는 RDF 자원의 속성(property)과 클래스(class)를 표현할 수 있는 어휘로서, 속성과 클래스의 일반화 계층 구조(Generalization-Hierarchies)에 대한 의미론을 제공한다.

  • OWL은 속성과 클래스에 대하여 기술할 수 있는 더 많은 어휘를 제공한다. 예를 들면, 클래스 간의 관계 (예: 비접합성(Disjointness)), 관계차수( 예: 1), 동치성(Equality), 풍부한 속성 타입, 속성의 특성(예: 대칭성(Symmetry)), 열거형 클래스 등을 기술할 수 있다.

1.3 OWL의 세 하위 언어

OWL은 아래와 같이 표현력이 서로 다른 세 개의 하위 언어로 구성된다. 각 하위 언어는 서로 다른 개발자 및 사용자층을 대상으로 한다.

  • OWL Lite는 클래스 분류 계층과 간단한 제약 사항 표현을 필요로 하는 사용자들을 위한 언어이다. 예를 들면, OWL Lite는 관계차수 제약 사항의 표현을 지원하지만, 차수의 값으로 0 또는 1만 사용할 수 있도록 제한한다. OWL Lite를 지원하는 도구를 제작하는 것은 다른 하위 언어를 지원하는 도구를 제작하는 것 보다 상대적으로 쉽다. OWL Lite는 유의어 사전이나 여타 분류 체계의 표현 언어를 빠르고 손쉽게 OWL화하기 위한 용도로 적합하다. OWL Lite는 OWL DL보다 이론적 복잡도가 낮다. 이와 관련한 더 자세한 사항은 OWL 참고서의 OWL Lite 설명 부분에 제공되어 있다.
  • OWL DL은 계산학적 완전성(Computational Completeness)과 결정가능성(Decidability)을 유지하면서 최대의 표현력을 활용하고자 하는 사용자에게 적합하다. 완전성은 모든 결론이 계산될 수 있다는 특성이고, 결정가능성은 모든 계산이 유한한 시간 안에 끝난다는 특성이다. OWL DL은 OWL의 모든 어휘를 포함하고 있다. 그러나, 어휘의 사용에 있어 정해진 제약 사항을 준수해야 한다. 제약 사항의 한 예를 들어 보면, 클래스는 다른 클래스들의 하위 클래스가 될 수 있지만 다른 클래스의 인스턴스가 될 수는 없다. OWL DL은 그 이름으로 짐작할 수 있듯이 기술 논리(Description Logic)에 상당한다. 기술 논리는 OWL의 형식적 기반이 된 논리학의 한 분야이다.

  • OWL Full은 계산학적인 어떤 보장 없이 최대의 표현력과 RDF의 유연한 문법을 모두 활용하고자 하는 사용자에게 적합하다. 예를 들면, OWL Full에서 클래스는 개체(Individual)의 집합인 동시에 그 자체가 하나의 개체가 될 수도 있다. OWL Full은 사전 정의된 (RDF 또는 OWL) 어휘의 의미를 확장하는 온톨로지를 작성하도록 허용한다. OWL Full의 모든 기능에 대하여 완전한 추론을 지원하는 추론 소프트웨어는 만들 수 없을 것으로 보인다.

올바른 표현의 범위 및 타당한 결론의 영역에 있어서 OWL DL은 OWL Lite의 확장이고 OWL Full은 OWL DL의 확장이다. 각 하위 언어 간에는 다음과 같은 관계들이 성립된다. 각 관계의 역은 성립되지 않는다.

  • 모든 올바른(legal) OWL Lite 온톨로지는 올바른 OWL DL 온톨로지이다.
  • 모든 올바른(legal) OWL DL 온톨로지는 올바른 OWL Full 온톨로지이다.
  • 모든 타당한(valid) OWL Lite 결론은 타당한 OWL DL 결론이다.
  • 모든 타당한(valid) OWL DL 결론은 타당한 OWL Full 결론이다.

OWL을 이용하려면 먼저 어떤 OWL 하위 언어가 주어진 요구 사항에 최적인지 결정해야 한다. OWL Lite와 OWL DL 중 어떤 언어를 사용할 지 판단하는 기준은 OWL Lite보다 풍부한 OWL DL의 표현력을 필요로 하는가의 여부이다. OWL DL과 OWL Full 사이의 판단 기준은 RDF 스키마가 제공하는 메타 모델 구축 기능(예를 들어, 클래스의 클래스를 정의하거나 클래스에 속성을 매다는 등)을 필요로 하는가의 여부이다. OWL Full을 이용하면 (OWL DL과 달리) 추론 기능 지원을 보장 받을 수 없다. 아직까지 OWL Full을 완전하게 지원하는 추론 시스템은 구현된 바가 없기 때문이다.

OWL Full은 RDF의 확장으로 볼 수 있으나 OWL Lite와 OWL DL은 RDF의 제한적인 확장이라 할 수 있다. 모든 OWL 문서는 RDF 문서이고, 모든 RDF 문서는 OWL Full 문서이다. 그러나, RDF 문서 중 일부분만이 올바른 OWL Lite 또는 OWL DL 문서이다. 이 때문에 RDF 문서를 OWL 문서화하려면 주의를 기울여야 한다. OWL Lite 또는 OWL DL의 구성 어휘로 표현 가능하더라도 원본 RDF 문서에 OWL DL과 OWL Lite에 부여된 추가적 제약 사항들을 위배하는 내용이 없는지 잘 확인해야 한다. 특히, 클래스 이름으로 사용된 URI는 문서 내에서 명시적으로 owl:Class 타입으로 선언되어 있어야 한다. 이것은 속성의 경우에도 마찬가지다. 또한 모든 개체(Individual)는 적어도 한 개의 클래스에 속하는 것으로 선언되어 있어야 하며, 클래스, 속성, 개체를 가리키는 URI들은 서로 혼용되지 않아야 한다. 즉, 클래스의 URI가 속성이나 개체의 URI로 사용되면 안된다. 이 외에 OWL DL과 OWL Lite에 부여된 제약 사항들은 OWL 참고서의 부록 E에 상세히 기술되어 있다.

1.4 본 문서의 구성

먼저 OWL Lite의 어휘 및 사양을 설명한 다음, OWL DL과 OWL Full에 추가된 요소들을 설명한다. (OWL DL과 OWL Full은 동일한 어휘로 구성되어 있으나, OWL Full의 경우 좀 더 자유롭게 어휘를 조합하여 사용할 수 있다.)

2. 언어 개요

본 장에서는 OWL Lite, OWL DL 및 OWL Full의 모든 구문 요소에 대해 일목 요연한 목록을 제시한다.

OWL 어휘들은 이탤릭체로 적었다. 아래 어휘들 중 RDF 및 RDF 스키마에 정의되어 있는 어휘에 대해서는 각각 접두사인 rdf: 및 rdfs:를 달아 두었다. 접두사가 붙어 있지 않은 어휘는 새로 정의된 OWL 자체 어휘이다. 즉, rdfs:subPropertyOf는 subPropertyOf가 RDFS 어휘임을 가리킨다. 반면, Class는 OWL의 어휘이며 더 정확하게 표현하면 owl:Class가 된다.

2.1 OWL Lite 개요

OWL Lite 언어를 구성하는 어휘들은 아래와 같다.

RDF 스키마 어휘: (비)동치성: 속성 특성:
속성 제약사항: 제한된 관계차수: 헤더 정보:
클래스 교차: 버전 정보: 주석 관련 속성:
데이터타입

2.2 OWL DL 및 OWL Full 개요

OWL DL과 OWL Full 언어의 어휘 목록은 아래 목록에 보이는 바와 같다. OWL DL과 OWL Full은 아래 나열된 어휘들 외에 OWL Lite의 모든 어휘를 포함한다.

클래스 공리: 클래스 표현식의 부울 조합:
임의의 관계 차수: 속성값 정보:

3. OWL Lite 해설

이 장에서는 OWL Lite 언어의 구문 및 기능에 대하여 간략히 설명한다. 여기서는 각 구문의 구체적인 문법을 다루지는 않는다.(각 구문 정의는 OWL 참고서에 제시되어 있다.) 각 언어 구문에 대한 자세한 용례 및 설명을 참조해 볼 수 있도록 각 구문 요소마다 OWL 가이드 문서의 해당 위치로 연결되는 링크를 걸어 두었다.

OWL Lite는 OWL 언어 전체 어휘 중 일부분만을 포함하고 있으며, OWL DL 및 OWL Full보다 어휘의 사용에 있어 많은 제약을 받는다. 예를 들면, 명명된 상위 클래스(named superclass)를 통해서만 OWL Lite 클래스를 정의할 수 있으며(임의의 클래스 표현식(class expression)은 상위 클래스가 될 수 없다.), 제한된 형태의 클래스 제약(class restrictions)만 사용할 수 있다. 또한, 클래스 간 동치성과 클래스 간 계층 관계는 명명된 클래스 간에만 선언할 수 있으며 임의의 클래스 표현식 간에는 선언할 수 없다. 마찬가지로 제약(restriction)은 명명된 클래스만 포함할 수 있다. 관계차수(cardinality)에 있어서도 제한이 있어 관계차수의 값은 오직 0 또는 1만 설정될 수 있다.

3.1 OWL Lite: RDF 스키마 어휘

아래의 OWL Lite 어휘들은 RDF 스키마와 관련된 어휘들이다.

  • Class: 클래스는 동일한 속성을 지니고 있어 하나의 부류로 모아지는 개체들의 군(, group)을 정의한다. 예를 들어, Deborah와 Frank는 둘 다 사람이므로 Person 클래스에 속한다. 클래스들은 subClassOf를 통해 특성화 계층(specialization-hierarchy)으로 구조화될 수 있다. OWL에는 사전 정의된 클래스로서 Thing과 Nothing이 있다. Thing은 계층 구조 상 가장 일반화된 클래스로서 모든 OWL 클래스의 상위 클래스(superclass)이고, 모든 개체(individual)를 멤버로 가진다. 반대로 Nothing은 모든 OWL 클래스의 하위 클래스(subclass)이고, 멤버를 가지지 않는다.
  • rdfs:subClassOf: 임의의 클래스가 다른 클래스의 하위클래스임을 선언하는 문장을 기술함으로써 클래스 계층 구조를 구축할 수 있다. 예를 들어, Person 클래스를 Mammal 클래스의 하위클래스로 선언할 수 있다. 이를 바탕으로 추론기는 어떤 개체가 Person 클래스에 속하면, 그 개체가 Mammal 클래스에도 속한다는 사실을 유추해 낼 수 있다.
  • rdf:Property: 속성은 개체 간의 관계 및 개체와 데이터 값 사이의 관계를 표현한다. hasChild, hasRelative, hasSibling, hasAge 등은 속성의 몇 가지 예이다. 처음 세 속성은 Person 클래스 인스턴스 간의 관계를 표현하기 위해 사용할 수 있으며(이와 같은 속성을 ObjectProperty라 한다.), 마지막 속성(hasAge)은 Person 클래스의 인스턴스와 정수 데이터 값 사이의 관계를 표현하기 위해 사용할 수 있다(이와 같은 속성을 DatatypeProperty라 한다.). owl:ObjectProperty와 owl:DatatypeProperty는 모두 RDF 클래스인 rdf:Property의 하위 클래스이다.
  • rdfs:subPropertyOf: 임의의 속성이 한 개 또는 여러 속성의 하위속성임을 선언하는 문장을 기술함으로써 속성 계층 구조를 구축할 수 있다. 예를 들어, hasSibling 속성을 hasRelative 속성의 하위속성으로 선언할 수 있다. 이로 부터, 추론기는 임의의 두 개체가 hasSibling으로 관계되어 있으면 두 개체 사이에 hasRelative 관계도 존재함을 유추해 낼 수 있다.
  • rdfs:domain: 속성의 정의역(Domain)은 속성을 적용할 수 있는 개체의 집합을 제한한다. 한 개체가 어떤 속성을 통해 또 하나의 개체와 관련되어 있다면, 그 개체는 속성의 정의역으로 선언된 클래스에 속해야 한다. 예를 들어, Mammal 클래스가 hasChild 속성의 정의역으로 선언되어 있고 "Frank hasChild Anna"라는 관계 선언이 주어지면, 추론기는 Frank가 Mammal 클래스에 속한다는 사실을 유추할 수 있다. 여기서 주의할 점은 rdfs:domain이 전역적인 제약 사항을 기술한다는 점이다. 왜냐 하면, 정의역 선언은 특정 클래스에 연계하여 속성에 대해 기술하는 것이 아니라 속성 자체의 특성으로 선언하기 때문이다. 제약 사항의 범위에 대하여는 아래의 속성 제약 관련 어휘들을 참조한다.
  • rdfs:range: 속성이 값으로 가질 수 있는 개체의 집합을 제한한다. 한 개체가 어떤 속성을 통해 또 하나의 개체와 관계되어 있다면, 후자 개체는 속성의 공역(range)으로 선언된 클래스에 속해야 한다. 예를 들어, Mammal 클래스가 hasChild 속성의 공역으로 선언되어 있고 "Louise hasChild Deborah"라는 관계 선언이 주어지면, 추론기는 Deborah가 Mammal 클래스에 속한다는 사실을 유추할 수 있다. rdfs:domain과 마찬가지로 rdfs:range는 전역 제약 사항이다. 제약 사항의 범위에 대하여는 아래 제시된 AllValuesFrom 등의 지역 제약 사항(local restriction)들을 참조한다.
  • Individual : 개체는 클래스의 인스턴스이며, 개체들은 속성을 통해 상호 관계를 맺는다. 예를 들면, Person 클래스의 인스턴스로서 Deborah라고 명명된 개체를 생성하고 hasEmployer 속성을 이용하여 StanfordUniversity 개체와 관계를 선언할 수 있다.

3.2 OWL: 동치성 및 비동치성

아래 OWL Lite 어휘들은 동치성과 비동치성을 표현하는데 사용된다.
  • equivalentClass : 두 클래스가 동치임을 표현한다. 동치인 클래스들은 동일한 인스턴스들의 집합으로 구성된다. 동치성 선언을 이용하여 동일한 의미를 지니는 서로 다른 여러 클래스들을 생성할 수 있다. 예를 들면, Car 클래스는 Automobile 클래스와 동치라고 선언할 수 있다. 이를 바탕으로 추론기는 어떤 개체가 Car 클래스에 속하면 Automobile 클래스에도 속한다는 사실을 유추할 수 있다.
  • equivalentProperty: 두 속성이 동치임을 표현한다. 동치인 속성들은 서로 동일한 개체들의 관계를 기술한다. 동치성 선언을 이용하여 동일한 의미를 지니는 서로 다른 여러 속성들을 생성할 수 있다. 예를 들면, hasLeader 속성은 hasHead 속성과 동치라고 선언할 수 있다. 이를 바탕으로 추론기는 X와 Y 간에 hasLeader 관계가 존재하면 둘 간에 hasHead 관계도 존재함을 유추할 수 있다. 또한 hasLeader와 hasHead 간에 상호 하위속성 관계가 존재함을 유추할 수 있다.(즉, hasHead rdfs:subPropertyOf hasLeader and hasLeader rdfs:subPropertyOf hasHead)
  • sameAs: 두 개체가 동일함을 표현한다. 이 구문을 이용하여 동일한 개체를 가리키는 서로 다른 여러 이름들을 생성할 수 있다. 예를 들면, Deborah 개체는 DeborahMcGuiness 개체와 동일하다고 선언할 수 있다.
  • differentFrom: 두 개체가 서로 다르다는 사실을 표현한다. 예를 들면, Frank 개체가 Deborah 및 Jim 개체와 다른 개체라고 기술할 수 있다. 만약 Frank와 Deborah가 모두 함수 특성(functional property)을 가진 어떤 속성의 값으로 선언되어 있다면 이는 모순이다. 왜냐 하면, 함수 특성을 가진 속성은 한 개의 유일한 속성값만 가질 수 있기 때문이다. OWL 및 RDF와 같이 하나의 개체에 서로 다른 여러 이름을 붙일 수 있는 언어에서는 개체가 서로 다르다는 사실을 기술해 주는 것이 매우 중요하다. 추가적인 정보가 주어지지 않는 한 추론기는 Frank와 Deborah가 서로 다른 개체라는 사실을 유추할 수 없기 때문이다.
  • AllDifferent: 하나의 AllDifferent 문장으로 여러 개의 개체가 서로 다르다는 사실을 한번에 기술할 수 있다. 예를 들면, Frank, Deborah, Jim이 상호 간에 다른 개체라는 사실을 AllDifferent 구문을 한번 사용하여 기술할 수 있다. 위에 보인 differentFrom의 예에서는 Frank와 Deborah, Frank와 Jim이 서로 다르다는 사실만 선언되지만, AllDifferent를 사용하면 Jim과 Deborah가 서로 다르다는 사실도 선언된다. AllDifferent 구문은 서로 다른 개체들에 대해 유일명 가정(Unique Names Assumption)을 강제하고자 하는 경우에 유용하게 사용될 수 있다. AllDifferent 구문은 distinctMembers 구문과 결합하여 목록 안에 포함된 모든 개체들이 상호 간에 서로 다르다는 사실을 기술하는데 사용한다.

3.3 OWL Lite: 속성의 특성

OWL Lite는 속성과 속성의 값에 관한 정보를 표현할 수 있는 어휘들을 포함하고 있다. ObjectProperty와 DatatypeProperty의 차이점에 대해서는 위에서 rdfs:Property 구문의 설명을 통해 언급하였다.
  • inverseOf: 두 속성이 서로 역관계임을 표현한다. P1 속성과 P2 속성이 역관계로 선언되고 X가 P2 속성을 통해 Y와 관계되어 있다면, Y는 X와 P1 속성으로 관계된다. 예를 들어, hasChild와 hasParent를 역관계로 선언하고 "Deborah hasParent Louise"라고 선언하면, 추론기는 "Louise hasChild Deborah"라는 사실을 유추해 낼 수 있다.
  • TransitiveProperty: 속성이 이행적임을 표현한다. P 속성이 이행적이고 (x,y) 쌍과 (y,z) 쌍이 P 속성의 인스턴스이면, (x,z)도 P의 인스턴스가 된다. 예를 들면, 조상(ancestor) 관계를 이행 속성으로 선언할 수 있다. 이 때, Sara가 Louise의 조상이고 (즉 (Sara,Louise)는 ancestor 속성의 인스턴스), Louise가 Deborah의 조상(즉 (Louise,Deborah)는 ancestor 속성의 인스턴스)이라는 사실이 주어지면, 추론기는 Sara가 Deborah의 조상(즉 (Sara,Deborah)가 ancestor 속성의 인스턴스)이라는 사실을 유추해낼 수 있다. OWL Lite는 이행적 속성과 그 상위 속성들에 대해 maxCardinality 1 제약 사항을 기술할 수 없도록 하고 있다. 이는 OWL DL의 경우에도 동일하게 적용되는데, 이와 같은 제한이 없으면 OWL Lite와 OWL DL은 결정 가능한(decidable) 언어가 될 수 없다. 이와 관련한 더 자세한 사항은 OWL 의미론 및 추상 문법 명세서에 제공되어 있다.
  • SymmetricProperty: 속성이 대칭적임을 표현한다. P 속성이 대칭적이고 (x,y) 쌍이 P 속성의 인스턴스이면, (y,x)도 P 속성의 인스턴스가 된다. 예를 들면, 친구(friend) 관계를 대칭 속성으로 선언할 수 있다. 이 때, Frank가 Deborah의 친구라는 사실이 주어지면, 추론기는 Deborah가 Frank의 친구라는 사실을 유추해 낼 수 있다.
  • FunctionalProperty : 속성이 유일한 하나의 값을 가진다는 사실을 표현한다. 어떤 속성이 FunctionalProperty로 선언되면, 각 개체는 그 속성에 대해 0또는 1개의 값만 가질 수 있다. 이 특성은 유일값 속성(unique property)으로 불리기도 한다. FunctionalProperty는 속성의 최소 관계차수가 0이고 최대 관계차수가 1이라는 선언의 요약된 표현이다. 예를 들어, hasPrimaryEmployer(주고용주) 속성이 FunctionalProperty로 선언되어 있다면, 추론기는 어떤 개체도 주고용주를 둘 이상 가질 수 없음을 유추할 수 있다. 이는 모든 개체가 최소 한 개의 주고용주를 가져야 한다는 사실을 함의하지는 않는다.
  • InverseFunctionalProperty: 속성이 역함수적 특성을 지님을 표현한다. 속성이 역함수적 특성을 지니면, 그 속성의 역은 함수적 특성을 지닌다. 따라서 그 속성의 역은 각 개체에 대하여 최대 한 개의 값만 가질 수 있다. 이 특성은 명백 속성(unambiguous property)으로 불리기도 한다. 예를 들어, hasUSSocialSecurityNumber(미국 거주자 개개인에게 부여되는 유일한 번호) 속성을 역함수적 속성으로 선언하면, 이 속성의 역(isTheSocialSecurityNumberFor로 명명할 수 있을 것이다.)은 각 개체에 대하여 최대 한 개의 값만 가질 수 있다. 따라서, 각 사람의 사회 보장 번호는 그 사람의 isTheSocialSecurityNumberFor 속성의 유일한 값이 된다. 이로부터 추론기는 Person 클래스의 서로 다른 두 인스턴스가 동일한 미국 사회 보장 번호를 가질 수 없음을 유추해 낼 수 있다. 또한, 추론기는 두 Person 클래스 인스턴스가 동일한 사회 보장 번호를 가지고 있으면, 그 두 인스턴스가 동일한 인물을 가리킨다는 사실을 알아낼 수 있다.

3.4 OWL Lite: 속성 제약

OWL Lite는 클래스 인스턴스마다 속성을 다른 방식으로 사용할 수 있도록 하는 제약(restriction) 관련 어휘를 제공한다. 본 절과 다음 절에서 소개되는 제약 관련 구문들은 owl:Restriction 내에 기술되는 어휘들이다. owl:onProperty는 제약 대상 속성을 지시하는데 사용한다. 다음의 두 제약은 속성의 값을 제한할 때 사용하고, 다음 절에 소개되는 제약은 속성 값의 개수를 제한할 때 사용한다.
  • allValuesFrom: allValuesFrom 제약은 임의의 클래스와 연계하여 속성에 대해 기술한다. 이 구문은 모 클래스의 모 속성은 지역적 공역 제한(local range restriction)을 받는다는 사실을 표현한다. 따라서, 한 개체가 또 한 개체와 allValuesFrom에 의해 제약된 속성으로 관계되면 후자 개체는 그 속성의 공역으로 선언된 클래스에 속한다는 사실을 알아낼 수 있다. 예를 들면, Person 클래스에 대해 hasDaughter 속성의 공역을 Woman 클래스로 제한할 수 있다. 이 때, Person 클래스의 인스턴스인 Louise 개체가 Deborah 개체와 hasDaughter 관계를 가지면, 추론기는 Deborah가 Woman 클래스에 속한다는 사실을 유추해 낼 수 있다. 이 제약은 특정 클래스에 대하여 선언되므로 hasDaugher 속성이 Cat 클래스와 같은 다른 클래스에 적용되는 경우 그에 적합한 공역을 설정할 수 있다. 즉, Cat 클래스에 대한 hasDaughter 속성의 공역은 Cat 클래스로 설정하고, Person 클래스에 대한 hasDaugher 속성의 공역은 Person 클래스로 설정할 수 있다. allValuesFrom 제 약은 제약 대상 속성의 값이 적어도 한 개 존재해야 한다는 사실을 함의하지는 않는다.
  • someValuesFrom: someValuesFrom 제약은 임의의 클래스와 연계하여 속성에 대해 기술한다. 이 구문은 모 클래스의 모 속성에 대해 그 속성의 값 중 적어도 한 개의 값은 정해진 클래스에 속해야 한다는 사실을 표현한다. 예를 들면, someValuesFrom 제약을 이용하여 SemanticWebPaper 클래스의 hasKeyword 속성에 대해 이 속성의 값 중 몇 개는 반드시 SemanticWebTopic 클래스에 속해야만 한다는 제약 사항을 선언할 수 있다. 이 때, 선택적으로 SemanticWebPaper 인스턴스의 hasKeyword 속성 값을 여러 개 설정할 수 있으며, 설정된 값들 중 SemanticWebTopic 클래스의 인스턴스가 한 개 이상 존재하면 된다. allValuesFrom과 달리 someValuesFrom은 속성의 모든 값이 특정 클래스에 속해야 한다는 의미를 담고 있지 않다. 만약 myPaper 개체가 SemanticWebPaper 클래스의 인스턴스이면, myPaper는 hasKeyword 속성을 통해 적어도 한 개의 SemanticWebTopic 클래스 인스턴스와 관계한다. 예의 someValuesFrom 선언이 hasKeyword 속성의 모든 값이 SemanticWebTopic 클래스의 인스턴스라는 사실을 함의하지는 않는다.

3.5 OWL Lite: 제한된 관계차수

OWL Lite는 제한된 범위에서 관계차수 제약 사항을 기술할 수 있는 어휘를 포함한다. OWL(OWL Lite를 포함)의 관계차수 제약은 특정 클래스의 특정 속성에 대해 기술되기 때문에 지역 제약 사항(local restriction)이다. 다시 설명하면, 관계차수 제약은 특정 클래스의 인스턴스에 대하여 그 인스턴스가 특정 속성의 값을 몇 개 가질 수 있는지를 제한한다. OWL Lite에서 관계차수 값은 0과 1로 제한된다. (OWL DL과 OWL Full 처럼 임의의 관계차수 값을 설정할 수 없다.)

  • minCardinality: 최소 관계차수는 특정 클래스의 특정 속성에 대해 기술한다. 모 클래스의 모 속성에 대해 minCardinality를 1로 설정하면, 그 클래스의 모든 인스턴스는 해당 속성을 통해 최소 한 개 이상의 개체와 연결된다. 즉, 그 클래스의 모든 인스턴스는 반드시 해당 속성의 값을 한 개 이상 가져야 한다는 의미이다. 예를 들어 보자. 모든 사람에게 자식이 있지는 않으므로 Person 클래스의 hasOffspring 속성에 대해 최소 관계차수 제약을 기술할 필요는 없다. 그러나, Parent 클래스라면 hasOffspring 속성에 대해 최소 관계차수로 1을 설정할 수 있을 것이다. Louise가 Person 클래스의 인스턴스라는 사실은 Louise 개체의 hasOffspring 속성 값에 대한 아무런 새로운 사실도 함의하지 않는다. 그러나, Louise가 Parent 클래스의 인스턴스라는 사실은 Louise 개체가 hasOffspring 속성을 통해 적어도 한 개의 개체와 연결되어 있다는 사실을 함의한다. 이는 그러나, Louise 개체가 hasOffspring을 통해 최대 몇 개의 개체와 연결될 수 있는지에 대한 정보를 제공하지는 않는다. OWL Lite에서 사용 가능한 관계차수 값은 0 또는 1 뿐이다. 최소 관계차수의 값을 0으로 설정하면 (추가적인 관련 정보가 없다는 가정 하에) 대상 클래스의 인스턴스들이 해당 속성의 값을 반드시 가지지 않아도 된다. 예를 들어, Person 클래스의 hasOffspring 속성에 대해 최소 관계차수를 0으로 설정할 수 있을 것이다. (반면 Parent 클래스에 대해서는 최소 관계차수를 1로 설정하여 정보를 명확하게 해야 한다.)
  • maxCardinality: 최대 관계차수는 특정 클래스의 특정 속성에 대해 기술한다. 모 클래스의 모 속성에 대해 maxCardinality를 1로 설정하면, 그 클래스의 모든 인스턴스는 해당 속성을 통해 최대 한 개의 개체와 연결된다. 최대 관계차수를 1로 설정한 제약은 함수(functional) 또는 유일(unique) 속성으로 불리기도 한다. 예를 들어 보자. 미국 시민은 오직 한 개의 주에서만 투표할 수 있으므로 UnitedStatesCitizens 클래스의 hasRegisteredVotingState 속성에 대해 최대 관계차수를 1로 설정한다. 이는 UnitedStatesCitizens 클래스의 모든 인스턴스들이 hasRegisteredVotingState 속성을 통해 두 개 이상의 서로 다른 개체와 연결될 수 없다는 사실을 함의한다. 그러나, maxCardinality 1이 minCardinality 1을 함의하지는 않는다. 특정 클래스가 특정 속성의 값을 가질 수 없다는 사실을 기술하려면 최대 관계차수를 0으로 설정하면 된다. 예를 들어, UnmarriedPerson 클래스의 모든 인스턴스는 hasSpouse의 값을 가질 수 없다. 이같은 사실을 표현하려면 UnmarriedPerson 클래스의 hasSpouse 속성에 대해 최대 관계차수를 0으로 설정하면 된다.
  • cardinality: 이 제약은 어떤 클래스에 대해 특정 속성의 최대 및 최소 관계차수가 각각 0 또는 1이라는 사실(즉, minCardinality 0과 maxCardinality 0, 또는 minCardinality 1과 maxCardinality 1)을 기술하기 위한 구문이다. 예를 들어, Person 클래스는 hasBirthMother 속성의 값을 정확히 한 개 가진다. 이는 Person 클래스의 모든 인스턴스가 hasBirthMother의 값으로 서로 다른 Mother 개체를 가질 수 없다는 사실을 함의한다.
이상 설명한 제한된 형태의 각 관계차수 제약에 좀 더 직관적인 이름을 부여하자는 논의가 있었으나, 현재 정의된 이름을 그대로 유지하되 필요하면 OWL을 활용하는 시스템의 전반부에서 그러한 이름을 사용할 수 있도록 하자고 결정하였다. 이와 관련된 자세한 사항은 webont 공개 메일링리스트의 아카이브에서 열람할 수 있다. 가장 관련성이 높은 메시지는 http://lists.w3.org/Archives/Public/www-webont-wg/2002Oct/0063.html 이다.

3.6 OWL Lite: 클래스 교차

OWL Lite에는 교차 구문이 포함되어 있으나 사용상에 제한이 있다.
  • intersectionOf: OWL Lite는 명명된 클래스 또는 제약(restriction)의 교차를 허용한다. 예를 들어, EmployedPerson 클래스는 Person 클래스와 EmployedThings 클래스의 교차(intersectionOf)로 정의할 수 있다. EmployedThings 클래스에 대하여 hasEmployer 속성에 minCardinality 1이 설정되어 있다면, 추론기는 EmployedPerson 클래스의 모든 인스턴스가 최소 한 개의 고용주(employer)를 갖는다는 사실을 유추할 수 있다.

3.7 OWL 데이터타입

OWL은 RDF의 데이터 값 처리 방식을 따른다. OWL 가이드의 데이터타입 관련 부분을 참조하면 대부분 XML 스키마 데이터타입으로부터 차용된 OWL의 내장 데이터타입들에 대해 자세한 설명을 볼 수 있다.

3.8 OWL Lite 헤더 정보

OWL Lite는 온톨로지의 삽입(inclusion), 온톨로지 간의 관계 기술 및 온톨로지 설명 정보 첨부 기능을 지원한다. 이와 관련한 자세한 설명 및 사용예는 각각 OWL 참고서OWL 가이드를 참고하도록 한다.

3.9 OWL Lite 주석 관련 속성

OWL Lite는 클래스, 속성, 개체 및 온톨로지 헤더에 주석을 달 수 있는 구문을 제공한다. 주석 관련 구문의 사용에는 몇 가지 제약 사항이 따른다. 자세한 사항은 OWL 참고서의 주석 관련 부분을 참조하도록 한다.

3.10 OWL Lite 버전 관리

RDF는 자체적으로 버전 정보를 기술할 수 있는 소규모 어휘를 제공한다. OWL은 그 어휘를 크게 확장하고 있다. 더 상세한 내용은 OWL 참고서를 참조하도록 한다.

4. OWL DL과 OWL Full에 추가된 어휘들

OWL DL과 OWL Full은 동일한 어휘로 구성되어 있으나, OWL DL은 어휘의 사용에 있어 몇 가지 제한 사항을 포함한다. 대표적인 OWL DL의 제한 사항은 타입 간 분리이다. 클래스는 개체나 속성이 될 수 없고, 속성은 개체나 클래스가 될 수 없다. 따라서 OWL 자체 구문에 대해서는 제약을 설정할 수 없다. (OWL Full에서는 허용된다.) 또한, OWL DL의 속성은 ObjectProperty이거나 DatatypeProperty이어야 한다. DatatypeProperty는 클래스의 인스턴스 및 RDF 리터럴(literal)과 XML 스키마 데이터타입 간의 관계를 표현하고, ObjectProperty는 두 클래스의 개체 간의 관계를 표현한다. OWL 의미론과 추상 문법 명세서에 이들 제한 사항들에 대한 상세한 설명이 제시되어 있다. 아래에 OWL DL과 OWL Full의 구문을 설명한다. 여기서는 OWL Lite에 없는 새로운 어휘들과 OWL Lite의 어휘 중 확장된 어휘들만 설명하였다.
  • oneOf: (열거형 클래스): 본 구문은 클래스를 구성하는 개체들을 일일이 열거함으로써 클래스를 정의할 때 사용한다. 클래스의 구성 개체들은 정확히 클래스 정의를 위해 열거된 개체들의 집합과 일치한다. 예를 들면, 일곱 개의 개체 - Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday - 를 나열함으로써 daysOfTheWeek 클래스를 정의할 수 있다. 만약 allValuesFrom 제약의 공역으로 daysOfTheWeek 클래스가 설정된 속성이 있다면, 추론기는 그 속성의 최대 관계차수가 7임을 유추할 수 있다.
  • hasValue: (속성값): 본 구문은 어떤 속성의 값을 특정한 개체로 제한할 때 사용한다. 예를 들면, dutchCitizens 클래스의 모든 인스턴스들은 소속 국가(nationality) 속성의 값으로 theNetherlands를 갖는다는 사실을 표현할 수 있다. (여기서 theNetherlands는 Nationalities 클래스의 인스턴스이다.)
  • disjointWith: 클래스들이 서로 간에 교차하지 않는다는 사실을 표현한다. 예를 들면, disjointWith 구문을 이용하여 Man 클래스와 Woman 클래스가 교차하지 않는다고 선언할 수 있다. 이 때 어떤 개체가 두 클래스에 모두 속한다는 선언이 발견되면 그 선언에는 모순이 있음을 유추할 수 있다. 마찬가지로 A가 Man의 인스턴스이면, A는 Woman의 인스턴스가 아니라는 사실도 유추할 수 있다.
  • unionOf, complementOf, intersectionOf (부울 조합): OWL DL과 OWL Full은 unionOf, complementOf 및 intersectionOf를 이용한 임의의 부울 조합을 통해 클래스 및 제약을 결합할 수 있도록 허용한다. 예를 들면, unionOf를 이용하여 USCitizens 또는 DutchCitizens에 속하는 개체들을 모두 포괄하는 새로운 클래스를 정의할 수 있다. complementOf를 이용하면 어린이들은 SeniorCitizens에 속하지 않는다는 사실을 기술할 수 있다. (즉, Children 클래스는 SeniorCitizens 클래스의 여집합(complement)에 해당하는 클래스의 하위 클래스로 정의된다.) 유럽 연합의 시민권은 유럽 연합을 구성하는 각 국가의 시민권의 합(union)으로 표현할 수 있다.
  • minCardinality, maxCardinality, cardinality (완전한 관계차수): OWL Lite에서 관계차수의 값은 오직 0 또는 1만 사용할 수 있으나, OWL DL 및 OWL Full에서는 0을 포함한 임의의 양의 정수 값을 사용할 수 있다. 예를 들면, DINK("Dual Income, No Kids") 클래스의 hasIncome 속성에 대해 최소 관계차수를 2로 설정할 수 있다. (반면, hasChild 속성의 관계차수는 0으로 설정할 것이다.)
  • 복잡한 클래스 정의 : OWL Lite의 대부분 구문에서는 클래스 이름을 하나만 사용할 수 있다. 예를 들면 subClassOfequivalentClass 문장에 명명된 클래스 하나만 기술할 수 있다. OWL Full은 이와 같은 구문에 열거형 클래스 선언, 속성 제약(property restriction), 부울 조합 등 복잡한 클래스 표현식을 사용할 수 있도록 허용한다. 또한 OWL Full에서는 클래스를 인스턴스로 사용할 수 있다.(이는 OWL DL 및 OWL Lite에서는 금지된 사항이다.) 이와 관련한 사항은 OWL 가이드Design for Use 절에 상세히 설명되어 있다.

5. 요약

이 문서는 웹 온톨로지가 왜 필요한지 그리고 OWL이 W3C가 정의한 관련 언어들과 어떤 관계에 있는지 간략히 소개함으로써 OWL에 대한 개요을 제공한다. 또한 본 문서는 OWL의 세 하위 언어인 OWL Lite, OWL DL 및 OWL Full에 대해 설명하고 각 언어의 어휘를 개괄적으로 소개한다. 이 문서는 기능 개요 명세서(Feature Synopsis Document)의 개정판이다. 기능 개요 명세서는 간단한 예제와 함께 각 구문에 대한 간단한 설명을 제공한다. 이 문서는 더 상세한 사항을 제시하기 위해 OWL 참고서, OWL 가이드 및 OWL 의미론 및 추상 문법 명세서를 참조 인용한다. 이 문서의 이전 버전들(December 15, 2003, September 5, 2003, August 18, 2003, July 30, 2003, May 1, 2003, March 20, 2003, January 2, 2003, July 29, 2002, July 8, 2002, June 23, 2002, May 26, 2002, 및 May 15, 2002)을 통해 OWL Lite의 변화 과정과 여타 논의되었던 사항들을 참조해 볼 수 있다.

참고 문헌

[OWL Guide]
OWL Web Ontology Language Guide, Michael K. Smith, Chris Welty, and Deborah L. McGuinness, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-owl-guide-20040210/ . 최신판은 http://www.w3.org/TR/owl-guide/ 에 있다.
[OWL Reference]
OWL Web Ontology Language Reference, Mike Dean and Guus Schreiber, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-owl-ref-20040210/ . 최신판은 http://www.w3.org/TR/owl-ref/ 에 있다.
[OWL Abstract Syntax and Semantics]
OWL Web Ontology Language Semantics and Abstract Syntax, Peter F. Patel-Schneider, Pat Hayes, and Ian Horrocks, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-owl-semantics-20040210/ . 최신판은 http://www.w3.org/TR/owl-semantics/ 에 있다.
[OWL Test]
OWL Web Ontology Language Test Cases, Jeremy J. Carroll and Jos De Roo, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-owl-test-20040210/ . 최신판은 http://www.w3.org/TR/owl-test/ 에 있다.
[OWL Requirements]
OWL Web Ontology Language Use Cases and Requirements, Jeff Heflin, Editor, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-webont-req-20040210/ . 최신판은 http://www.w3.org/TR/webont-req/ 에 있다.
[OWL Issues]
Web Ontology Issue Status. Michael K. Smith, ed. 1 November 2003.
[DAML+OIL Reference]
DAML+OIL Reference Description . Dan Connolly, Frank van Harmelen, Ian Horrocks, Deborah L. McGuinness, Peter F. Patel-Schneider, and Lynn Andrea Stein. W3C Note 18 December 2001.
[XML]
Extensible Markup Language (XML).
[XML Schema]
XML Schema .
[XML-SCHEMA2]
XML Schema Part 2: Datatypes - W3C Recommendation, World Wide Web Consortium, 2 May 2001.
[RDF/XML Syntax]
RDF/XML Syntax Specification (Revised), Dave Beckett, Editor, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/ . 최신판은 http://www.w3.org/TR/rdf-syntax-grammar/ 에 있다.
[RDF Concepts]
Resource Description Framework (RDF): Concepts and Abstract Syntax, Graham Klyne and Jeremy J. Carroll, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-concepts-20040210/ . 최신판은 http://www.w3.org/TR/rdf-concepts/ 에 있다.
[RDF Schema]
RDF Vocabulary Description Language 1.0: RDF Schema, Dan Brickley and R. V. Guha, Editors, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-schema-20040210/ . 최신판은 http://www.w3.org/TR/rdf-schema/ 에 있다.
[RDF Semantics]
RDF Semantics, Patrick Hayes, Editor, W3C Recommendation, 10 February 2004, http://www.w3.org/TR/2004/REC-rdf-mt-20040210/ . 최신판은 http://www.w3.org/TR/rdf-mt/ 에 있다.
[Description Logics]
The Description Logic Handbook. Franz Baader, Diego Calvanese, Deborah McGuinness, Daniele Nardi, Peter Patel-Schneider, editors. Cambridge University Press, 2003; and Description Logics Home Page.

감사의 말

이 문서는 웹 온톨로지 워킹 그룹 구성원들의 광범위한 토론의 산물이다. 웹 온톨로지 워킹 그룹의 구성원은 다음과 같다: Yasser alSafadi, Jean-François Baget, James Barnette, Sean Bechhofer, Jonathan Borden, Frederik Brysse, Stephen Buswell, Jeremy Carroll, Dan Connolly, Peter Crowther, Jonathan Dale, Jos De Roo, David De Roure, Mike Dean, Larry Eshelman, Jérôme Euzenat, Tim Finin, Nicholas Gibbins, Sandro Hawke, Patrick Hayes, Jeff Heflin, Ziv Hellman, James Hendler, Bernard Horan, Masahiro Hori, Ian Horrocks, Jane Hunter, Francesco Iannuzzelli, Rüdiger Klein, Natasha Kravtsova, Ora Lassila, Massimo Marchiori, Deborah McGuinness, Enrico Motta, Leo Obrst, Mehrdad Omidvari, Martin Pike, Marwan Sabbouh, Guus Schreiber, Noboru Shimizu, Michael Sintek, Michael K. Smith, John Stanton, Lynn Andrea Stein, Herman ter Horst, David Trastour, Frank van Harmelen, Bernard Vatant, Raphael Volz, Evan Wallace, Christopher Welty, Charles White, and John Yanosy

최종검토본 발표 이후의 변경 이력

  • OWL Lite에 owl:Nothing 추가
  • 최종본의 제목 아래에 포인터 추가
  • owl-absyn 명세서로 걸린 모든 링크를 owl-semantics 명세서로 변경
  • 2003년 4월 21일에 public-webont-comments 메일링리스트를 통해 접수된 Lee Lacy의 문법 정정 사항 반영
  • Lee Lacy의 기타 정정 사항 반영: 주석 속성, 버전 속성, 2.2절에서 누락된 태그들 (결과적으로 2.2절을 재구성하였음)
  • hasOffspring 예제를 hasDaughter 예제로 변경 (Morten Frederiksen의 요청에 의함)
  • Lassilla의 모든 정정 사항 반영. "기계 가독성(machine readability)"을 "기계 해석 가능성(machine interpretability)"으로 변경하고 기타 철자 오류 수정.
  • Jim Hendler의 제안에 따라 OWL Lite의 낮은 복잡도를 갖는 클래스에 대한 문장 추가
  • Sandro Hawke의 제안에 따라 1장의 첫 문장 추가
  • 스타일 파일에 대한 링크 복원
  • 테스트 문서 및 5월 1일 버전으로 가는 링크 추가
  • 참고 문헌 장 추가
  • 각 장의 상대적 참조자를 사용하도록 복귀
  • 이전 버전에 사용하던 http://www.w3.org/TR/2003/CR-xx-20030818/ 링크를 http://www.w3.org/TR/xx로 변경

후보 권고안 발표 이후의 변경 이력

  • 후보 권고안 발표 이후의 변경 이력 추가
  • 모든 행의 끝에 있던 Ctrl-M을 삭제
  • Jeff Rafter의 정정사항 반영
  • PR 이 메일의 내용에 따라 문서의 상태 설명, 문서 링크들, 발표 날짜 등 수정.

추천 권고안 발표 이후의 변경 이력

  • 깨졌던 두 개의 링크를 정정함. W3C 아이콘 및 email 이미지로 가는 링크.
  • 새로운 버전으로 이행하면서 매 행의 끝에 삽입된 Ctrl-M을 삭제.
  • 2003년 12월판 이전 버전 문서로 가는 링크 추가
  • 2004년 1월 12일에 접수된 Lee Lacy의 정정 사항을 반영. (대부분 편집 상의 작은 정정 사항들임. 테이블의 셀 간 간격을 30에서 27로 변경 등등)
  • Benjamin Nowack이 지적한 편집 상 오류 정정 사항 반영.
  • 참고 문헌 형식 개정
1
Code Library/Win32 API | Posted by 서비 2007/04/27 10:53

UTF8 Encode


int MultibyteToUTF8(const char* src,int nbyte,char** dest)
{
    unsigned short* unicode=NULL;
    int strlen = UNICODE_encode(src,nbyte,&unicode);
    int ret = UTF8_encode(unicode,strlen,dest);
    delete[] unicode;
    return ret;
}

int UNICODE_encode(const char* src,int bytelen,unsigned short** unicode)
{
    if(src == NULL || bytelen == 0 || IsBadReadPtr(src,bytelen) == TRUE) 
    {
        *unicode = NULL;
        return 0;   
    }
    int nLen = MultiByteToWideChar(CP_ACP,0,src,bytelen,NULL,NULL);
    
    if(nLen == 0) 
    {
        *unicode = NULL;
        return 0;
    }

    *unicode = new unsigned short[nLen+1];
    if(*unicode == NULL || IsBadWritePtr(*unicode,(nLen+1)*sizeof(unsigned short)) == TRUE) 
    {
        *unicode = NULL;
        return 0;
    }

    ZeroMemory(*unicode,nLen*sizeof(unsigned short)+2);
    MultiByteToWideChar(CP_ACP,0,src,bytelen,*unicode,nLen);
    return nLen;
}

int UTF8_encode(const unsigned short* src,int srclen,char** multibyte)
{
    if(src == NULL || srclen == 0 || IsBadReadPtr(src,srclen*sizeof(unsigned short)) == TRUE) 
    {
        *multibyte = NULL;
        return 0;   
    }

    int nLen = WideCharToMultiByte(CP_UTF8,0,src,srclen,*multibyte,0,NULL,NULL);
    
    if(nLen == 0) 
    {
        *multibyte = NULL;
        return 0;
    }

    *multibyte = new char[nLen+1];

    if(*multibyte == NULL || IsBadWritePtr(*multibyte,nLen+1) == TRUE) 
    {
        *multibyte = NULL;
        return 0;
    }

    ZeroMemory(*multibyte,nLen+1);
    WideCharToMultiByte(CP_UTF8,0,src,srclen,*multibyte,nLen,NULL,NULL);
    return nLen;
}


int UTF8ToMultibyte(const char* src,int nbyte,char** dest)
{
    unsigned short* unicode=NULL;
    int strlen = UTF8_decode(src,nbyte,&unicode);
    int ret = UNICODE_decode(unicode,strlen,dest);
    delete[] unicode;
    return ret;
}


int UNICODE_decode(const unsigned short* src,int srclen,char** multibyte)
{
    if(src == NULL || srclen == 0 || IsBadReadPtr(src,srclen*sizeof(unsigned short)) == TRUE) 
    {
        *multibyte = NULL;
        return 0;   
    }
    
    int nLen = WideCharToMultiByte(CP_ACP,0,src,srclen,*multibyte,0,NULL,NULL);

    if(nLen == 0) 
    {
        *multibyte = NULL;
        return 0;
    }

    *multibyte = new char[nLen+1];

    if(*multibyte == NULL || IsBadWritePtr(*multibyte,nLen+1) == TRUE) 
    {
        *multibyte = NULL;
        return 0;
    }

    ZeroMemory(*multibyte,nLen+1);
    WideCharToMultiByte(CP_ACP,0,src,srclen,*multibyte,nLen,NULL,NULL);
    return nLen;
}


int UTF8_decode(const char* src,int bytelen,unsigned short** unicode)
{
    
    if(src == NULL || bytelen == 0 || IsBadReadPtr(src,bytelen) == TRUE) 
    {
        *unicode = NULL;
        return 0;   
    }

    int nLen = MultiByteToWideChar(CP_UTF8,0,src,bytelen,NULL,NULL);

    if(nLen == 0) 
    {
        *unicode = NULL;
        return 0;
    }

    *unicode = new unsigned short[nLen+1];

    if(*unicode == NULL || IsBadWritePtr(*unicode,(nLen+1)*sizeof(unsigned short)) == TRUE) 
    {
        *unicode = NULL;
        return 0;
    }

    ZeroMemory(*unicode,nLen*sizeof(unsigned short)+2);
    MultiByteToWideChar(CP_UTF8,0,src,bytelen,*unicode,nLen);
    return nLen;
}