'프로그래밍기초'에 해당되는 글 23건
- 2020.04.14 :: [SQL] 연산 논리 (기초 배우기 )
- 2020.04.14 :: [PHP] PHP 문자 N 문자를 연결해보자!
- 2020.04.14 :: [PHP] PHP 함수 생성 및 호출
- 2020.04.14 :: [Objective-C] 기초배우기 (4)
- 2020.04.14 :: [Objective-C] 기초배우기 (3)
- 2020.04.13 :: [Python] 간편 로그인 소스
- 2020.04.13 :: [Perl] Epoch Time 구해기 (Uxix Time)
- 2020.04.13 :: [Perl] 펄이란 무엇일까? 기초알아보자!
DISTINCT 연산자
SELECT 문의 결과 값에서 특정 컬럼만 출력할 경우 중복된 값들이 나오는 경우에 이를 제거해서 표시하는 기능
SELECT DISTINCT 컬럼명 1, 컬럼명 2, ... FROM 테이블명
예제
- 국가코드가 'KOR' 인 도시들의 국가코드를 표시하시오.
- 국가코드가 'KOR' 인 도시들의 국가코드를 중복제거해서 표시하시오.
결과 확인
- SELECT CountryCode FROM city WHERE CountryCode = 'KOR';
- SELECT DISTINCT CountryCode FROM city WHERE CountryCode = 'KOR';
논리연산자 (AND, OR, NOT)
SELECT 문의 조건절에 논리 조건 적용해서 적용할 수 있는 연산자
SELECT * FROM 테이블명 WHERE (NOT) 조건 1 AND/OR (NOT) 조건 2 .....
예제
- 국가코드가 'KOR' 이면서 인구가 100만 이상인 도시를 찾으시오
- 국가코드가 'KOR', 'CNN', 'JPN' 인 도시를 찾으시오
- 국가코드가 'KOR' 이 아니면서 인구가 100만 이상인 도시를 찾으시오.
결과 확인
- SELECT * FROM city WHERE CountryCode = 'KOR' AND Population > 1000000
- SELECT * FROM city WHERE CountryCode = 'KOR' OR CountryCode = 'CNN' OR CountryCode = 'JPN'
- (위와 같은 코드) SELECT * FROM city WHERE CountryCode in ('KOR', 'CNN', 'JPN')
- SELECT * FROM city WHERE CountryCOde != 'KOR' AND Population > 1000000
'SQL' 카테고리의 다른 글
[SQL] JOIN VIEW,별명알아보자 (0) | 2020.04.14 |
---|---|
[SQL] 일부결과 및 집합함수 (0) | 2020.04.14 |
[SQL] SQL 이란 무엇일까? (기초배우기 정의,종류) (0) | 2020.04.14 |
[SQL] 설치하기 / 다운로드 (0) | 2020.04.11 |
[PHP]문자와 문자를 연결하기
php에서는 문자와 문자를 연결시 + 대신에 .를 사용한다.
-입력
<?php
echo "*"."아이유";
?>
-출력
아이유
html을 포함한 경우
-줄바꿈이 가능하다.
-입력
<?php
echo "*"."아이"."</br>"."유2";
?>
-출력
결과
아이유
입력1
<?
$test = "너 ";
$test.= "랑";
$test.= "나";
print $test;
?>
결과
너 랑 나
'PHP' 카테고리의 다른 글
[PHP] PHP 함수의 인수 배우보자!!! (0) | 2020.04.14 |
---|---|
[PHP] PHP 함수 생성 및 호출 (0) | 2020.04.14 |
[PHP] PHP 다운로드 (0) | 2020.04.14 |
[PHP] 시작,종류,태그,변수,저장확정자 (0) | 2020.04.11 |
[PHP]함수 생성 및 호출
다음은 모두 같은 의미이다.
- 작은 프로그램의 모음
- 서브루틴
- 사용자 정의 함수
사용자 정의 함수를 사용하면 같은 내용을 여러 번 사용할 때 간단히 함수를 불러오면 되서 편리하다.
정의
- function 함수명() {
처리 내용;
}
사용
- 함수명();
* 함수의 정의와 함수의 사용 순서는 상관없다.
예
<?php
function copyright() {
print "<font size=7>";
print "copyright all right reserved";
print "</font>";
}
copyright();
?>
<?php
fuction test()(
echo 1;
)
test();
?>
함수 실행 예1
<?php
test($x)(
echo $x;
)
test('hello world');
?>
함수 실행 예2
<?php
test($x)(
echo $x;
)
test('hello world');
test('hello jeju');
?>
함수 실행 예3
<?php
test($x)(
echo $x;
)
test('hello');
test('mr my);
test('yesterday);
?>
'PHP' 카테고리의 다른 글
[PHP] PHP 함수의 인수 배우보자!!! (0) | 2020.04.14 |
---|---|
[PHP] PHP 문자 N 문자를 연결해보자! (0) | 2020.04.14 |
[PHP] PHP 다운로드 (0) | 2020.04.14 |
[PHP] 시작,종류,태그,변수,저장확정자 (0) | 2020.04.11 |
9.파운데이션 프레임워크
9-1.루트 클래스
NSObject는 Objective-C의 클래스가 가져야 할 가장 기본적인 기능(메모리 관리, 객체 식별 등)을 제공하며,모든 클래스는 NSObject를 직접 혹은 간접적으로 상속함으로써 그 기능들을 사용할 수 있게된다. 사용자가 직접 구현하는 클래스도 이를 위해 NSObject를 상속하는 것을 절대 잊지말아야한다.
9-2.문자열 관련 클래스
9-2-1.NSString
유니코드 방식으로 문자열을 다루는 기능을 제공하는 클래스,. 파운데이션 프레임워크에서 가장 많이 사용되는 클래스
-기본사용방법 : 문자열 앞에 항상 '@'를 붙여주어야한다. NSString *string = @"string test";
-포맷표현 방식 : 다른언어의 %s가 아니라 %@사용한다. 나머지 타입은 같다(%d,%f,%u)
NSString *string1 = [[NSString alloc]initWithFormat:@"%@",@"string"];
NSStirng *string2 =[NSString stringWithString:@"string"];
-생성 메소드 : 클래스 메소드는 alloc 또는 copy로 시작하는 이름을 갖지 않으므로 사용이 끝난 후 release할 필요없다.
인스턴스 메소드들은 alloc 메소드를 이용하여 생성되므로, 사용이 끝난 후에는 반드시 release를 호출해야한다.
//빈 문자열을 가지는 객체를 생성하여 반환
+(id)string
//주어진 문자열을 가지는 객체를 생성하여 반환
+(id)stringWithFormat:(NSString *)format, …
+(id)stringWithString:(NSString *)aString;
//위 메소드들의 인스턴스 메소드 형태, 기능은 동일
-(id)initWithFormat:(NSString *)format …
-(id)initWithString:(NSString *)aString
//사용예
NSString *string1 = [NSString string];
NSString *string2 = [NSString stringWithFormat:@"String: %@", @"Test"];
NSString *string3 = [NSString stringWithString:@"String"];
NSString *string4 = [[NSString alloc] initWithFormat:@"String : %@",@"Test"];
NSString *string5 = [[NSString alloc] initWithString:@"String"];
-결합메소드
//현재 문자열과 주어진 문자열을 결합하여 반환
-(NSString *)stringByAppendingFormat:(NSSting *)format …
-(NSString *)stringByAppendingString:(NSString *)aString
//사용예
NSString *string1 = @"Hello"
NSString *string2 = [stirng1 stringByAppendingFormat:@"%@",@"World"];
NSString *string3 = [stirng1 stringByAppendingString:@" World"];
-분리 메소드
//현재 문자열을 검사하여 주어진 문자열이 나타낼 때마다 문자열 분리
-(NSArray *)componentsSeparatedByString:(NSString *)separator
//현재 문자열의 주어진 위치 이후 문자열 반환
-(NSString *)substringFromIndex:(NSUInteger)anIndex
//현재 문자열의 주어진 위치까지의 문자열 반환
-(NSString *)substringToIndex:(NSUInteger)anIndex
//사용예
NSString *string1 = @"String1, String2, String3";
NSArray *iterms =[string1 componentsSeparatedByString:@". "];
//ite는 :{@"String1", @"String2", @"String2"}
NSString *string2 =@"String";
NSString *string3 =[string2 substringFromIndex:3];
NSString *string4 =[string2 substringToIndex:3];
//string 2: @"ing" string 4:@"str"
-값 변환 메소드
//현재 문자열에 해당하는 정수값 반환
-(int)intValue
//현재 문자열에 해당하는 실수값 반환
-(float)floatValue
-(double)doubleValue
//사용예
NSString *string1 =@"5";
int intValue =[string1 intValue]; //intValue : 5
NSString *string2 =@"2.34";
float floatValue = [string2 floatValue]; //2.34
double double Value = [string2 doubleValue]; //2.34
-비교 메소드
//현재 문자열이 주어진 문자열로 시작하는지 검사
-(BOOL)hasPrefix:(NSString *)aString
//현재 문자열이 주어진 문자열로 끝나는지 검사
-(BOOL)hasSuffix:(NSString *)aString
//현재의 문자열이 주어진 문자열과 동일하지 검사
-(BOOL)isEqualToString:(NSString *)aString
//사용예
NSString *string1 = @"Hello World!";
BOOL value1 = [string1 hasPrefix:@"Hel"];
BOOL value2 = [string1 hasSuffix:@"orld"]; //value1,value2 :YES
BOOL value3 = [string1 isEaualToString:@"Hello World!"]; //value3 :YES
-기타 메소드
//문자열의 길이를 반환
-(NSUInteger)length
//문자열읮 ㅜ어진 위치에 해당하는 문자를 반환
-(unichar)characterAtIndexLNSUInteger)index
//사용예
NSString *string = @"String";
int length = [string length]; //length :6
unichar value = [string characterAtIndex:3]; //value : i
9-2-2.NSMutableString
NSString 클래스를 상속하는 자식 클래스, 문자열을 한번 할당하면 변경할 수 없는 NSString과는 달리 수정할 수 있다는 것이 장점, 참고로 파운데이션 프레임워크 클래스 중에서 이름에 Nutable이 포함된 클래스 (NSMutableArray, NSMutableDictionary 등)는 값을 수정할 수 있는 클래스다,.
//주어진 문자열을 현재의 문자열과 결합
-(void)appendFormat:(NSString *)format ..
-(void)appendFormat:(NSString *)aString
//주어진 문자열을 현재 문자열의 주어진 위치에 사입
-(void)insertString:(NSString *)aString atIndex:(NSUInteger)anIndex;
//현재의 문자열을 주어진 문자열로 대체
-(void)setString:(NSString *)aString
//사용예
NSMutableString *string. = [NSmutableString stringWithString:@"Hello"]; //String :@"Hello"
[string appendFormat:@"%@",@"Wor"]; //String :@"Hellowor"
[string appendString:@"ld!"] //string: @"Helloworld!"
[string insertString:@" " atIndex:5]; //string: @"Hello world!"
[string setString:@"Bye World!"]; //string: @"Bye World!"
9-3.객체 집합 관련 클래스
NSArray : 순서가 있는 객체 리스트를 관리
NSDictionary : 키 – 값 형태의 객체 리스트를 관리
NSSet : 순서가 없는 객체 리스트를 관리
위는 할당된 내용을 수정할 수 없는 클래스지만. 이들 클래스 이름에 Mutable이 들어간 MSMutableArray, NSMutableDictionary, NSMutableSet는 수정할수 있는 클래스이다.
9-3-1.NSArray
-생성메소드
//사용예
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";
// +(id)arrayWithObjects : 주어진 객체들을 포함하는 객체를 생성하여 반환
NSArray *array1 = [NSArray arrayWithObjects:aData, avalue, aString, nil]; //마지막은 반드시 nil을 전달
// -(id)initWithObjects : arrayWithObjects의 인스턴스 메소드 형태, 기능은 동일
NSArray *array2 = [[NSArray alloc]initWithObjects:aData, aValue, aString, nil]; //마지막은 반드시 nil을 전달
//+(id)arrayWithArray: 주어진 배열 내의 인자들을 포함하는 객체를 생성하여 반환
NSArray *array3 = [NSArray arrayWithArray: array1];
//-(id) initWithArray : +arrayWithArray의 인스턴스 메소드 형태 기능은 동일
NSArray *array4 = [[NSArray alloc] initWithArray: array1];
주요메소드
NSString *item1 = @"1", *item2 = @"2", *item3=@"3";
NSArray *array = [NSArray arrayWithObjects: item1, item2, item3, nil]; //array :{item1, item2, item3}
//주어진 배열 내의 인자의 수를 반환
int cout : [array count]; //count :3
//주어진 인덱스의 객체를 반환
NSString *string = [array objectAtIndex:1]; //string :@"2"
//주어진 객체의 배열 내의 인덱스를 반환
NSUInteger index = [array indexOfbject :item3]; //index:2
9-3-2.NSMutabelArray
NSString *item1 = @"1", *item2 = @"2", *item3=@"3", *item4=@"4";
NSMutableArray *array =[NSMutableArray arrayWithObjects: item1, item2, item3, nil]; //array :{item1, item2, item3}
//주어진 인자를 지정된 위치에 삽입한다.
[array insertObject:item4 atIndex:2]; ////array :{item1, item2,item4, item3}
//지정된 위치의 인자를 삭제한다.
[array removeObjectAtIndex:3]; ////array :{item1, item2,item4}
//주어진 인자를 배열 끝에 추가한다.
[array addObject:item3]; // array :{item1, item2,item4,item3}
//마지막 인자를 삭제한다.
[array removeLastObject]; // array :{item1, item2,item4}
//현재 배열의 지정된 위치의 객체를 주어진 객체로 대체한다.
[array replaceObjectAtIndex:2, withObject:item3]; // array :{item1, item2,item3}
9-3-3.NSDictionary –stl의 map
-생성메소드
//+(id) dictionaryWithObjectsAndKeys: 주어진 객체, 키 값으로부터 객체를 생성반환
NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2",nil];
//-(id) initWithdictionaryWithObjectsAndKeys:+(id) dictionaryWithObjectsAndKeys의 인스턴스 메소드 형태
NSDictionary *dict2 = [[NSDictionary alloc] initWithdictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2",nil];
-주요메소드
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Chris", @"name", @"programmer", @"job",nil]; //dirct :{@"job" : @"programmer", @"name :@"Chris"}
//dictionary에 있는 객체의 수를 반환
NSUInteger count = [dict count]; //count :2;
//dictionary에 있는 모든 키 값들을 반환
NSArray *keys= [dict allKeys]; //Keys:{@"job",@"name"};
//dictionary에 있는 모든 객체들을 반환
NSArray *values = [dict allValues]; values :{@"programmer",@"Chris"}
//주어진 키 값을 갖는 객체를 반환
NSString *string = [dict objectForKey:@"name"]; //string : @"Chris"
9-3-4.NSMutableDictionary
NSMutableDictionary *dict =[NSMutableDictionary dictionary]; //Dict: { }
//주어진 객체와 키 조합을 추가한다.
[dict setObject:@"Chris" forKey:@"name"]; //dict:{@name: @"chris"}
[dict setObject:@"programmer" forKey:@"job"]; //dict: {@"job": @"programmer", @"name" : @"Chris"}
//주어진 객체와 키 조합을 삭제
[dict removeObjectForKey:@"name"]; //dict : {@"job" : "programmer"};
//모든 객체-키 조합 삭제
[dict removeAllObjects];//dict:{ }
9-3-5.NSSet –NSArray와 달리 순서가 없다.
-생성메소드
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *aString = @"a string";
//주어진 객체들을 포함하는 객체를 생성하여 반환
NSSet "mySet =[NSSet setWithObjects:aDate, aValue, aString, nil];
// NSSet "mySet =[[NSSet alloc]initWithObjects:aDate, aValue, aString, nil];
-주요메소드
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *name = @"Chris";
NSSet *mySet =[NSSet setWithObjects: date, value, name, nil]; //mySet :{value, name, date}
//NSSet 에 들어있는 오브젝트 객체 개수
NSUInteger count =[mySet count]; //count :3
//NSSet에 들어있는 모든 오브젝트 객체 반환
NSArray *array1 = [mySet allObjects]; // array1 : {value, name, date;
//NSSet 내에 주어진 객체가 존재하는지 검사하여 결과 반환
BOOL result = [mySet containsObject:@"Chris"]; //result :YES
9-3-6 NSMutableSet
NSDate *aDate = [NSDate distantFuture];
NSValue *aValue = [NSNumber numberWithInt:5];
NSString *name = @"Chris", *job = @"programmer";
NSMutableSet *mySet =[NSMutableSet setWithObjects: date, value, name, nil]; //mySet :{value, name, date}
//set에 주어진 객체를 추가
[mySet addObject:job]; //mySet :{job, value, name, date}
//set에 주어진 객체 삭제
[mySet removeObject:@"Chris"]; //mySet :{job, date,value}
//set의 모든 객체 삭제
[mySet removeAllObjects]; //mySet: {}
9-3-7 객체 탐색
-객체를 탐색하는 예
NSArray *array = [NSArray arrayWithObjects:@"One",@"Two", @"Three", @"Four", nil];
NSString *item = nil;
for( item in array){
if([item isEqualToString:@"Three"]){
break;
}
}
-NSEnumerator를 사용하는 방법
NSArray *array = [NSArray arrayWithObjects:@"One", @"Two", @Three", @"Four", @nil];
NSString *item = nil;
NSEnumerator *enumerator = [array objectEnumerator];
while(item = [enumerator nextObject]){
if( [item isEqualToString:@"Three"]){
break;
}
}
NSEnumerator 사용하면 좋은예
NSArray의 경우 reverseEnumerator 메소드를 이용하여 객체를 역순으로 탐색 할수 있다.
objectEnumerator 대신에 reverseEnumerator 메소드를 호출하면 된다.
NSDictionary의 경우 NSEnumerator를 이용하면 키 값뿐 아니라 객체도 탐색할 수 있다. 키 값을 탐색할때는 KeyEnumerator 메소드, 객체 값을 탐색할때는 objectEnumerator를 이용하면 된다
9-4. 값(정수 및 실수)표현 관련 클래스
9-4-1.NSNumber
NSValue 클래스를 상속하는 자식 클래스, BOOL, char, int, float와 double 등 각종 값을 설정하고 반환하는 기능을 수행한다.
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
NSNumber *intNumber = [NSNumber numberWithInt:23];
NSNumber *doubleNumber = [NSNumber numberWithDouble:23.46];
BOOL value1 = [boolNumber boolValue];
int value2 = [intNumber intValue];
double value3 = [doubleNumber doubleValue];
//값비교
NSNumber *intNumber = [NSNumber numberWithInt:23];
NSNumber *floatNumber = [NSNumber numberWithFloat:3.45];
NSString *string1 = [intNumber stringValue]; //string1 : 23
if(NSOrderedAscending == [intNumber compare:floatNumber]{
…
}
BOOL equality = [intNumber isEqualToNumber:floatNumber];
//compare:메소드는 kemdarhk 같은 반환값을 가지게된다.
NSOrderedAscending :현재 값보다 주어진 값이 클경우
NSOrderedDescending :현재 값보다 주어진 값이 작은경우
NSOrderedSame :현재 값과 주어진 값이 같은
'Objective_C' 카테고리의 다른 글
[Objective-C] 기초배우기 (3) (0) | 2020.04.14 |
---|---|
[Objective-C] 기초배우기 (2) (0) | 2020.04.14 |
[Obejective-C] 기초배우기 (1) (0) | 2020.04.13 |
7.프로토콜
특정 객체에 변화가 일어나면 혹은 어떤 특별한 의미를 가지는 시점에 도달하면 해당 객체로부터 이에 대한 알림 서비스를 받고 싶을경우 '프로토콜'를 사용한다.
프로토콜을 사용하면 객체로부터 콜백 메소드의 형태로 알림 서비스를 받을 수 있다.
1.프로토콜을 선언하는 brush 클래스가 구현되는 방식
//헤더파일
@protocol 프로토콜 이름; //(1) 프로토콜을 선언하는 부분
@interface 클래스 이름: 부모 클래스 이름{
id<프로토콜 이름> delegate; //(2)프로토콜을 사용하고자 하는 클래스 인스턴스의 포인터
…
}
@property (nonatomic, retain) id<프로토콜 이름> delegate;
//프로토콜을 사용하는 메소드 //(3) 프로토콜을 사용하는 메소드를 선언한다.
@end
@protocol 프로토콜 이름 <타 프로토콜 이름> //(4)@protocol에서 @end까지 프로토콜을 정의하는 부분
@required //(5)required에는 반드시 정의해야하는 메소드(기본)
메소드 선언 리스트
@optional //(5)optional에는 반드시 정의할 필요는 없는 메소드를 선언
메소드 선언 리스트
@end
//소스파일
#import "헤더 파일"
@implementation
@synthesize delegate;
...
프로토콜에서 선언된 메소드를 호출하는 메소드 정의 //(6) 프로토콜에서 선언된 메소드를 정의한다.
…
@end
(2)프로토콜을 사용하고자 하는 클래스 인스턴스의 포인터를 저장하는 부분, 이 값을 정의하지 않으면 프로토콜 메소드를 호출할 방법이 없으므로 프로토콜을 사용하는 클래스 인스턴스에서 반드시 설정해야한다.
(3) 프로토콜을 사용하는 메소드를 선언한다. 당연한 이야기지만 어느 메소드가 프로토콜 내의 어느 메소드를 호출해야 한다는 내용은 정해져 있지 않다. 인터페이스 내의 어떠한 메소드라도 프로토콜 내에 선언되어 있는 메소드를 호출할 수 있다. 즉, 적절한 메소드에서 필요한 시점에 호출해주면되는 것이다.
(4)@protocol에서 @end까지 프로토콜을 정의하는 부분.'<타 프로토콜 이름>'을 지정하게 되면 해당 프로토콜의 내용을 가져와 현재 프로토콜에 포함한다.
ex)프로토콜을 선언하는 brush 클래스가 구현되는 방식
//Brush.h
#import <Foundation/Foundation.h>
@protocol BrushDelegate; //(1)
@interface Brush : NSObject {
id<BrushDelegate> deleage; //(2)
}
@property (nonatomic, retain) id<BrushDelegate> delegate;
-(void)changeColor; //(3)
@end
@protocol BrushDelegate<NSObject> //(4)
@optional //(5)
-(void)brush(Brush *)brush WillStartChangingColor:(UIColor *)color;
-(void)brush(Brush *)brush didStartChangingColor:(UIColor *)color;
-(void)brush(Brush *)brush willFinishChangingColor:(UIColor *)color;
-(void)brush(Brush *)brush didFinishChangingColor:(UIColor *)color;
@end
//Brush.m
#import "Brush.h"
@implementation Brush
@synthesize delegate;
-(void)ChangeColor { //(6)
UIColor *color = [UIColor blackColor];
if([self.delegate respondsToSelector:@selector(brush:willStartChangingColor;)]) {
[self.delegate brush:self WillStartChangingColor:color];
}
…..
}
@end
respondsToSelector 는 메소드를 호출하는 것에 주목하자. 이 메소드는 NSObject에 선언된 것인데, 호출하고 있는 객체 내에 어떠한 메소드가 정의되어 있는지 검사한다.
2. 프로토콜(BrushDelegate )을 사용하고자 하는 클래스의 구조
//헤더 파일
#import "프로토콜을 선언한 헤더파일" //(1)프로토콜을 선언한 헤더 파일을 추가
…
@interface 클래스이름 : 부모클래스이름 <사용하려고하는 프로토콜이름>{ //(2) 사용하려는 프로토콜이름 명시
프로토콜을 선언하고 있는 클래스 타입 인스턴스 변수 //(3)프로토콜클래스의 인스턴스변수 선언
}
…
@end
//소스파일
#import "헤더 파일"
@implementation
@synthesize (3)에서 선언된 인스턴스 변수
….
인스턴스 변수(3)에게 프로토콜을 사용하고자 하는 현재 클래스 인스턴스의 주소값을 넘겨줌 //(4)
프로토콜 내에 선언된 메소드 정의 //(5)
…
@end
(4)현재 클래스 인스턴스의 주소값을 넘겨줌(5)에서 정의하고 있는 메소드가 정상적으로 호출되도록 한다.
(5) 프로토콜을 선언하여 정의하고 있는 클래스에서는 메소드를 선언만 하고 있을 뿐 구현은 하지 않고 있다. 이는 전적으로 프로토콜을 사용하는 클래스의 몫으로 남겨져 있다. 그러므로 해당 메소드에 대한 구현 부분이 반드시 이곳을 존배해야한다.
ex)BrushDelegate를 사용한 Rectangle 클래스
//Rectangle.h
#import <Foundation/Foundation.h>
#import "Shape.h"
#import "Brush.h"
@class Circle;
@interface Rectangle : shape <BrushDelegate> {
@protected
Brush *brush;
NSString *name;
NSInteget width;
NSInteget height;
}
@property (nonatomic, retain)Brush *brush;
@property (nonatomic, retain)NSString *name;
@property (nonatomic, retain)NSInteger width;
@property (nonatomic, retain)NSInteger height;;
-(id) initWithWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(NSString *)description;
-(void)draw;
@end
//Rectangle.m
@import "Rectangle.h"
@implementation Rectangle
@synthesize brush;
@synthesize name;
@synthesize width;
@synthesize height;
-(id)init{
return [self initWithWidth:10 height:20];
}
-(id) initWihWidth:(NSInteger)myWidth height:(NSInteger)myHeight{
if(self =[super init]){
brush =[[Brush alloc] init];
brush.delegate = self;
name = nil;
width = myWidth;
height = myHeight;
}
return self;
}
-(void)brush(Brush *)brush WillStartChangingColor:(UIColor *)color
{…}
-(void)brush(Brush *)brush didStartChangingColor:(UIColor *)color
{…}
-(void)brush(Brush *)brush willFinishChangingColor:(UIColor *)color
{…}
-(void)brush(Brush *)brush didFinishChangingColor:(UIColor *)color
{…}
-(NSString *)description{
NSString *text =nil;
Text = [[NSString alloc] initWithString:@"Test";
[text autorelease];
return text;
}
-(void)draw{
[super draw];
}
-(void)dealloc{
[name release];
[super dealloc];
}
@end
프로토콜 내에는 하나 또는 그 이상의 메소드를 선언할 수 있으며, 이들은 이후 이 프로토콜을 사용하고자 하는 클래스의 소스파일에서 정의한다. 그리고 이 프로토콜을 이용하는 클래스가 있어야한다. 당연한 이야기이겠지만 프로토콜을 이용하는 클래스의 수와 종류에는 제한이 없다. 어느 클래스라도 프로토콜을 선언하고 있는 클래스를 자신의 멤버 변수로 포함하고 이용하면 되는 것이다.
실제로 파운데이션 프레임워크 내의 많은 클래스도 이처럼 프로토콜을 이용할 수 있도록 구현되어 있다.
다양한 프로토콜 메소드를 이용하는 대표적인 예로 테이블뷰(UITableView)를 들수 있다.
8.카테고리와 클래스 확장
카테고리는 특정 클래스의 소스를 가지고 있지 않더라도 해당 클래스에 새로운 메소드를 추가하는 것을 상속 없이 가능케한다.
8-1클래스에 메소드 추가하기
//헤더파일
#import "클래스 이름" //(1)카테고리를 이용해서 메소드를 추가하고자 하는 클래스의 헤더 파일을 추가한다.
@interface 클래스 이름 (카테고리 이름) //(2)클래스 이름 괄호안에 카테고리 이름을 지정
//메소드 선언 //(3)클래스에 추가하는 메소드를 선언 인스턴스변수는 추가할 수 없다.
@end
//소스 파일
#import "헤더 파일" //(4)헤더 파일을 추가한다. 일반적으로 파일의 이름은"클래스이름+카테고리이름'으로 지정
@implementation 클래스 이름 (카테고리 이름)
//메소드 정의 //(5) 클래스에 추가 선언한 메소드를 정의한다.
@end
ex)카테고리 예
//Rectangle+Display.h
#import <Foundation/Foundation.h>
#import "Rectangle.h"
@interface Rectangle (Display)
-(void)displayDetail;
@end
//Rectangle+Display.m
#import "Rectangle+Display.h"
@implementation Rectangle(Display)
-(void)displayDetail{
…
}
@end
8-2 카테고리의 장점과 단점
-장점
*유사한 메소드를 한곳으로 모아 관리할수 있다.
*여러 개발자가 동시에 하나의 큰 클래스를 설계하고 구현할 때 카테고리로 나눠 작업 할 수 있다.
*큰 클래스를 여러 카테고리로 분리해놓으면 컴파일 할 때 전체를 빌드하지 않고 일부만 컴파일 할수 있다.
-단점
*부모 클래스의 메소드를 재정의(오버라이딩)하고 있는 클래스 메소드를 카테고리에서 또다시 재정의하면 문제가 발생한다. 카테고리에서 부모 클래스의 메소드는 super 지시어를 이용하여 접근할 수 있으나, 클래스에서 이전에 재정의한 메소드는 호출할 방법이 없기 때문이다.
*클래스의 메소드는 둘 이상의 카테고리에서 재정의하면 문제가 발생한다. 두 메소드중 어느 것이 우선권을 가지는지 알수 없기때문이다.
*기존 메소드를 재정의 하는 것 이외에도 문제가 생길 수 있다.
8-3.루트 클래스의 카테고리
루트 클래스인 NSObject에 카테고리를 이용하여 메소드를 추가하면 프로젝트의 모든 코드에서 이를 사용할 수 있게 되므로 매우 위험하다. 또한 루트 클래스에는 부모 클래스가 없으므로 루트 클래스에 메소드를 추가할 때 super지시어를 사용해서는 안된다.
그리고 루트 클래스는 다른 클래스와 달리 클래스 객체(인스턴스 변수가 아닌 클래스 이름 자체를 사용하는 경우)에서도 클래스 메소드 뿐 아니라 인스턴스 메소드를 호출할 수 있다는 사실을 기억해두자
8-4.클래스 확장
클래스 확장은 카테고리와 거의 유사하다. 다른 점은 카테고리 이름을 사용하지 않으며, 메소드를 구현하는 부분이 확장하려는 클래스의 구현 부분에 반드시 존재해야한다는 것이다.
ex)
//Rectangle.h
#import <Foundation/Foundation.h>
#import "Shape.h"
#import "Brush.h"
@class Circle;
@interface Rectangle :Shape <BrushDelegate>{
@protected
Brush *brush;
NSString *name;
NSInteger width;
NSInteger height;
}
@property (nonatomic, retain) Brush *brush;
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSInteger width;
@property (nonatomic, retain) NSInteger height;
-(id) initWithWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(NSString *)description;
-(void)draw;
@end
@interface Rectangle()
-(void)displayDetailEx;
@end
//Rectangle.m
#import "Rectangle.h"
@implementation Rectangle
@synthesize brush;
@synthesize name;
@synthesize width;
@synthesize height;
…..
-(void)displayDetailEx{
..
}
…
@end
'Objective_C' 카테고리의 다른 글
[Objective-C] 기초배우기 (4) (0) | 2020.04.14 |
---|---|
[Objective-C] 기초배우기 (2) (0) | 2020.04.14 |
[Obejective-C] 기초배우기 (1) (0) | 2020.04.13 |
Type "help", "copyright", "credits" or :license" for more information.
>>> import naverlogin
>>> from naverlogin import naversession
>>> from getpass import getpass
>>> id = 'fallazzgng'
>>> pw = getpass ()
Password:
>>> nsession = Naversession()
>>> nsession.login(id,pw)
True
>>> import re
>>> resp = nsession.get('주소)
>>> print re.search(ur'<strong>(.+)</strong> 님', resp.text).group(1)
(닉네임)
'Python' 카테고리의 다른 글
[Python] 파이썬 다운받기 (0) | 2020.04.11 |
---|
Perl에서 시간을 Unix time (Epoch Time)으로 전환하는 방법입니다.
Epoch Time은 1970-01-01 00:00:00 UTC 시간 이후로 지나간 second(초)를 계산한 것을 말합니다.
Perl에서는 이 시간으로 전환하고 다시 일반 date로 전환하는 방법이 간혹 필요합니다.
또한 RRD 데이터베이스에서는 이 Epoch Time으로 저장이 되므로, 반드시 필요합니다.
Linux나 AIX에서는커맨드라인에서 date 명령어 수행시 %s 옵션을 이용하여
Epoch Time을 구할 수 있습니다.(HP-UX에서는 없음)
How to convert epoch / UNIX timestamps to normal readable date/time using Perl.
Getting current epoch time in Perl
Time returns an integer with the current epoch:
time
Converting from epoch to normal date in Perl
Using the internal localtime or gmtime functions, localtime and gmtime return an array:
my $time = time; # or any other epoch timestamp
my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
my ($sec, $min, $hour, $day,$month,$year) = (localtime($time))[0,1,2,3,4,5];
# You can use 'gmtime' for GMT/UTC dates instead of 'localtime'
print "Unix time ".$time." converts to ".$months[$month]." ".$day.", ".($year+1900);
print " ".$hour.":".$min.":".$sec."\n";
But you can also use the scalar function to display your date with far less code:
print scalar localtime(946684800);returns Sat Jan 1 01:00:00 2000 (in my timezone).
For more advanced date manipulation, try using the DateTime module:
use DateTime;
$dt = DateTime->from_epoch( epoch => $epoch );
$year = $dt->year;
$month = $dt->month; # 1-12 - you can also use '$dt->mon'
$day = $dt->day; # 1-31 - also 'day_of_month', 'mday'
$dow = $dt->day_of_week; # 1-7 (Monday is 1) - also 'dow', 'wday'
$hour = $dt->hour; # 0-23
$minute = $dt->minute; # 0-59 - also 'min'
$second = $dt->second; # 0-61 (leap seconds!) - also 'sec'
$doy = $dt->day_of_year; # 1-366 (leap years) - also 'doy'
$doq = $dt->day_of_quarter; # 1.. - also 'doq'
$qtr = $dt->quarter; # 1-4
$ymd = $dt->ymd; # 1974-11-30
$ymd = $dt->ymd('/'); # 1974/11/30 - also 'date'
$hms = $dt->hms; # 13:30:00
$hms = $dt->hms('|'); # 13|30|00 - also 'time'
Converting from normal date to epoch in Perl
Using the Time::Local module:
use Time::Local;
my $time = timelocal($sec,$min,$hours,$day,$month,$year);
# replace 'timelocal' with 'timegm' if your input date is GMT/UTC
Using the DateTime module:
use DateTime;
$dt = DateTime->new( year => 1974, month => 11, day => 30, hour => 13, minute => 30,
second => 0, nanosecond => 500000000, time_zone => 'Asia/Taipei' );
$epoch_time = $dt->epoch;
Find more detailed information on CPAN: Time::Local,DateTime. You can also use Date::Manip if you need more advanced date manipulation routines.
Using the Date::Parse module (thanks to ericblue76):
use Date::Parse;
print str2time("02/25/2011 11:50AM");
The Perl Cookbook, Second Editiongives detailed information on manipulating dates and times in chapter 3 (pages 90-110).
**************************************************************************************************************
Epoch Time을 구하는 방법에는 여러가지 방법이 존재하는데, 아래는 그 예제들입니다.
Note that the month starts out as 0 for some inscrutable reason, so you'll have use
timelocal($sec,$min,$hours,$day,$month-1,$year); to get this to work.
'Perl' 카테고리의 다른 글
[Perl] 펄이란 무엇일까? 기초알아보자! (0) | 2020.04.13 |
---|
Perl의 세계에 온 것을 환영합니다.
Perl은 스크립팅 언어의 Swiss Army chainsaw(스위스 군용 전기 톱)이라고 합니다: 강력하고 이식성이 뛰어나기 때문입니다. Perl은 1980년대 후반 NASA에서 시스템 관리자로 일하던 언어학자인 Larry Wall에 의해, 보고서 처리를 보다 쉽게 하기 위해, 처음 개발되었습니다. 그 이후로 Perl은 아주 많은 역할을 하게 되었습니다: 다른 컴퓨터 시스템들 사이를 연결하여 시스템 관리를 자동화할 뿐만 아니라, 물론 웹 상에서 CGI 프로그래밍에 대해 가장 인기있는 언어의 하나가 되었습니다.
왜 Perl이 Web과 함께하며 그렇게 인기있게 되었을까요? 거기엔 2가지 이유가 있습니다: 첫째로 웹 상에서 수행되는 대부분의 것들은 text 형태로 일어나고, text 처리를 위해 고안된 언어에서 가장 잘 수행되기 때문입니다. 보다 중요하게, Perl은 사람들이 이용할 어떤 것이 필요할 때 다른 선택사항들보다 눈에 띄게 좋았습니다. C는 복잡하고 보안 문제를 일으킬 수 있었고 (특히 신뢰되지 않는 데이터일 경우), Tcl은 불편할 수 있고 Python은 정말 기반이 없었습니다.
또한 Perl은 사용하기 쉬운 친절한 언어이기 때문에 당신을 고통스럽게 하지는 않습니다. 당신의 개인적인 프로그래밍 스타일과 잘 어울릴 것입니다. Perl의 슬로건은 "그것을 하는데 하나 이상의 방법이 있다," 이며, 크고 작은 문제 모두 똑같이 유용할 것입니다.
연재의 첫번 째 부분에서, Perl에 대한 몇 가지 기본 사항을 배우고, 작은 샘플 프로그램을 볼 수 있습니다.
- Operating System에 대해
이 연재에서, Unix 시스템을 사용하고 Perl interpreter가 /usr/local/bin/perl에 위치하고 있다고 가정하겠습니다.
Windows를 구동해도 괜찮습니다: 대부분의 Perl 코드는 플랫폼과 무관합니다.
- 첫번째 Perl Program
아래 텍스트 내용으로 first.pl을 만드십시오:
#!/usr/local/bin/perl
print "Hi there!\n";
(전통적으로, 첫 프로그램은 Hello world! 라고 말하는게 일반적입니다^^)
이제, Perl 인터프리터로 실행하세요. 커맨드 라인에서, 파일이 있는 디렉토리로 가서 perl first.pl을 실행하면 아래와 같이 보게 될 것입니다.
Hi there!
\n은 newline 문자를 나타냅니다: 그것이 없다면, Perl은 스스로 텍스트의 new line으로 넘어갈 수 없습니다.
- 함수와 문장 (Functions and Statements)
Perl은 많은 함수 라이브러리를 갖고 있습니다. 그들은 인터프리터가 수행하는 명령들, Perl의 동사들입니다. perlfunc man 페이지에서 모든 내장 함수들의 목록을 확인할 수 있습니다. 거의 모든 함수들은 일련의 파라미터를 받을 수 있고, 그것들은 컴마에 의해 구분이 됩니다.
print 함수는 Perl의 가장 자주 사용되는 부분 중의 하나입니다. 스크린에 표시하거나 또는 파일에 정보를 보내기 위해 사용합니다. print 함수는 출력하기 위한 일련의 것들을 그것의 파라미터로서 가집니다.
print "This is a single statement.";
print "Look, ", "a ", "list!";
Perl 프로그램은 세미콜론으로 끝나는 문장들로 이루어져 있습니다. 문장들은 분리된 라인들일 필요는 없습니다; 하나의 줄에 다수의 문장들이 있거나 하나의 문장이 다수의 라인들에 분리되어 있을 수도 있습니다.
print "This is "; print "two statements.\n"; print "But this ",
"is only one statement.\n";
- 숫자, 문자열, 쌍따옴표 (Numbers, Strings and Quotes)
Perl에는 2개의 기본적인 데이터 형태가 있습니다: 숫자와 문자열
숫자는 쉽습니다; 우리는 그것들을 모두 다뤄왔습니다. 알아야 하는 것은 Perl에서 숫자 속에 컴마(,)나 스페이스를 넣으면 안된다는 것입니다. 10,000 또는 10 000이 아닌 10000이라고 항상 쓰세요.
문자열들은 보다 조금 복잡합니다. 문자열은 작은 따옴표 또는 큰 따옴표에 있는 문자들의 집합입니다:
'This is a test.'
"Hi there!\n"
작은 따옴표와 큰 따옴표의 차이는 큰 따옴표는 그 내용이 해석되어야(interpreted) 하는 것을 의미하는 반면, 작은 따옴표는 그 내용이 문자 그대로 받아들여져야 하는 것을 의미합니다.
예를 들면, 문자 시퀀스 \n은 큰 따옴표를 가진 문자열에서 나타나면 newline 문자이지만,
작은 따옴표에서 나타나면 문자 그대로 2개의 문자, 백슬래쉬와 n입니다.
print "This string\nshows up on two lines.";
print 'This string \n shows up on only one.';
(2개의 유용한 백슬래쉬 시퀀스는 탭 문자를 입력하는 \t 와, 큰 따옴표 안에 백슬래쉬를 입력하기 위한 \\입니다.)
- 변수(Variables)
함수들이 Perl의 동사라면, 변수들은 명사입니다. Perl은 3개 형식의 변수를 가지고 있습니다: 스칼라, 배열, 해쉬. 그것들을 "물건" "목록", "사전"이라고 생각하세요. Perl에서 모든 변수 이름들은 문자 또는 밑줄(_), 그리고 하나 이상의 영숫자 문자이거나 또는 밑줄들로 된 구두점 문자이다.
스칼라는 하나의 것들입니다. 숫자 또는 문자열일 수 있습니다. $abacus처럼 스칼라의 이름은 $ 표시로 시작합니다. 다음과 같이 = 기호를 사용하여 스칼라에 값을 할당할 수 있습니다:
$i = 5;
$pie_flavor = 'apple';
$constitution1776 = "We the People, etc.";
스칼라가 숫자인지 문자열인지 지정할 필요가 없습니다. Perl이 문자열로 처리해야 할 필요가 있을 때 그렇게 하고; 숫자로 처리해야 할 필요가 있을 때 그렇게 하기 때문에 문제가 되지 않습니다. 변환은 자동으로 일어납니다. (이것은 문자열들과 숫자들이 구별되는 데이터 형식인 다른 많은 언어들과는 다릅니다.)
큰 따옴표 문자열을 사용하는 경우, Perl은 문자열에 당신이 이름지은 스칼라 변수들의 값을 삽입할 것입니다. 이것은 문자열을 직접 채우는데 자주 사용한다:
$apple_count = 5;
$count_report = "There are $apple_count apples.";
print "The report is: $count_report\n";
이 코드의 마지막 출력은 The report is: There are 5 apples 입니다.
Perl의 숫자는 일반적인 수학적 연산으로 조작할 수 있습니다: 덧셈, 곱셈, 나눗셈과 뺄셈. (곱하기와 나누기는 Perl에서 *와 / 로 표시됩니다.)
$a = 5;
$b = $a + 10; # $b is now equal to 15.
$c = $b * 10; # $c is now equal to 150.
$a = $a - 1; # $a is now 4, and algebra teachers are cringing.
또한 ++, --, +=, -=, /=, *= 같은 특수 연산자를 사용할 수 있습니다. 이것들은 방정식의 2가지 요소를 필요로 하지 않고 스칼라의 값을 조작할 수 있습니다. 어떤 이들은 그것들을 좋아하고, 어떤 이들은 좋아하지 않습니다. 저는 그것들이 코드를 보다 명확하게 만들 수 있다는 사실을 좋아합니다.
$a = 5;
$a++; # $a is now 6; we added 1 to it.
$a += 10; # Now it's 16; we added 10.
$a /= 2; # And divided it by 2, so it's 8.
Perl의 문자열은 많은 유연성을 가지고 있지는 않습니다. 문자열에서 사용할 수 있는 유일한 기본 연산자는, "함께 합치다"고 말하는, 연결입니다. 연결 연산자는 마침표입니다. 연결과 더하기는 별개의 것입니다.
$a = "8"; # Note the quotes. $a is a string.
$b = $a + "1"; # "1" is a string too.
$c = $a . "1"; # But $b and $c have different values!
Perl은 필요할 때 숫자를 문자열로 변환한다는 것을 기억하세요, $b의 값을 얻기 위해서 Perl 인터프리터는 2개의 문자열 "8"과 "1"을 숫자로 변환하고, 그것들을 더합니다.
$b의 값은 숫자 9입니다. 하지만, $c는 연결을 사용했기 때문에, 그것의 값은 문자열 "81"입니다.
+ 표시는 숫자를 더하고 마침표(.)는 문자열들을 함께 합진다는 것을 꼭 기억하세요.
배열은 스칼라의 나열입니다. 배열 이름은 @로 시작합니다. 컴마(,)로 구분지어, 괄호() 안에 내용들을 나열함으로서 배열을 정의할 수 있습니다:
@lotto_numbers = (1, 2, 3, 4, 5, 6); # Hey, it could happen.
@months = ("July", "August", "September");
배열의 내용들은 0부터 시작하여 인덱싱됩니다. 배열의 요소들을 검색하려면, @ 표시를 $ 표시로 바꾸어야 합니다, 그리고 원하는 요소의 인덱스 위치를 가지고 따르면 됩니다. (스칼라 값을 얻는 것이기 때문에 $표시로 시작합니다.). 또한 다른 스칼라처럼, 위치에 있는 값을 수정할 수도 있습니다.
@months = ("July", "August", "September");
print $months[0]; # This prints "July".
$months[2] = "Smarch"; # We just renamed September!
그런데, 만일 배열이 존재하지 않을 경우, 그것의 요소중 하나에 값을 할당하려고 할 때 그 배열이 생성될 것입니다.
$winter_months[0] = "December"; # This implicitly creates @winter_months.
배열들은 같은 순서로 그것의 내용을 반환합니다; @months를 처음부터 끝까지 조사하면, 몇 번을 하더라도, July, August, September 순서대로 돌려받을 것입니다. 배열의 길이를 찾아내고 싶다면 $#array_name 값을 이용하세요. 이 값은 배열의 요소의 숫자보다 하나 작은 값입니다. 만일 그저 배열이 존재하지 않거나 비어있다면, $#array_name은 -1 입니다. 만일 배열의 크기를 조정하고 싶다면 그저 $#array_name의 값을 조정하면 됩니다.
@months = ("July", "August", "September");
print $#months; # This prints 2.
$a1 = $#autumn_months; # We don't have an @autumn_months, so this is -1.
$#months = 0; # Now @months only contains "July".
해시는 몇몇 프로그래밍 언어에서는 "사전"이라고 불립니다, 그리고 그들은 용어와 정의, 또는 보다 정확한 말로 키와 값입니다. 해시에서 각 키는 하나의 유일한 매치되는 값을 갖고 있습니다. %parents처럼 해시의 이름은 %표시로 시작합니다. 다음과 같이 컴마로 구분된 키와 값의 쌍에 의해 해시를 정의할 수 있습니다:
%days_in_summer = ( "July" => 31, "August" => 31, "September" => 30 );
'Perl' 카테고리의 다른 글
[Perl] Epoch Time 구해기 (Uxix Time) (0) | 2020.04.13 |
---|