C샵 2020. 4. 16. 23:59

C# 데이타 타입 

C#을 포함한 모든 .NET 프로그래밍 언어는 .NET의 Common Type System에 정의된 .NET 데이타 타입을 사용한다. C#은 int, double, string 과 같은 C# 키워드로 데이타 타입을 표현할 수 있으며, 또한 System.Int32, System.Double, System.String 과 같은 .NET 데이타 클래스로 데이타 타입을 표현할 수도 있다. 내부적으로는 C# 컴파일러는 C# 키워드로 된 데이타 타입을 컴파일 후 .NET 데이타 타입으로 변경하게 된다. 

C# 데이타 타입.NET 데이타 타입설명

bool System.Boolean True or False
byte System.Byte 8비트 unsigned integer
sbyte System.SByte 8비트 signed integer
short System.Int16 16비트 signed integer
int System.Int32 32비트 signed integer
long System.Int64 64비트 signed integer
ushort System.UInt16 16비트 unsigned integer
uint System.UInt32 32비트 unsigned integer
ulong System.UInt64 64비트 unsigned integer
float System.Single 32비트 single precision 부동소수점 숫자
double System.Double 64비트 double precision 부동소수점 숫자
decimal System.Decimal 128비트 Decimal
char System.Char 16비트 유니코드 문자
string System.String 유니코드 문자열
System.DateTime 날짜와 시간, 별도의 C# 키워드가 없음
object System.Object 모든 타입의 기본 클래스로 모든 유형을 포함할 수 있음

C# 리터럴 데이타 

C# 코드에서 123, true, "ABC"와 같이 값을 직접 써줄 수 있는데, 이를 리터럴(Literal)이라 한다. C#에서 리터럴 데이타를 사용할 때, 별도의 접미어 표시(Suffix)가 없는 경우 C# 컴파일러는 int, double, char, string, bool 데이타 타입에 기본적으로 그 값을 할당한다. 따라서, 특정 데이타 타입을 지정하고 싶으면, 리터럴 데이타 뒤에 1~2자의 타입 지정 접미어(Suffix)를 추가해야 한다. Suffix는 대소문자 구분이 없다. 즉 decimal을 나타내는 접미어 M은 1024M 이나 1024m처럼 사용가능하다. 아래는 디폴트 리터럴 타입과 각 데이타 타입별 Suffix에 대한 예제이다. 

디폴트 리터럴 타입

123    // int 리터럴 12.3   // double 리터럴 "A"    // string 리터럴 'a'    // char 리터럴 true   // bool 리터럴



C# 리터럴 데이타 타입 Suffix (대소문자 모두 가능) 예제
long L 1024L
uint U 1024U
ulong UL 1024UL
float F 10.24F
double D 10.24D 또는 10.24
decimal M 10.24M

C# 데이타 타입 예제 

예제

// Bool bool b = true; // Numeric short sh = -32768;    int i = 2147483647;   long l = 1234L;      // L suffix float f = 123.45F;   // F suffix double d1 = 123.45;  double d2 = 123.45D; // D suffix decimal d = 123.45M; // M suffix // Char/String char c = 'A'; string s = "Hello"; // DateTime  2011-10-30 12:35 DateTime dt = new DateTime(2011, 10, 30, 12, 35, 0);

  • float 데이타 타입은 숫자 뒤에 123.45F와 같이 F를 붙여 double이 아닌 float 타입임을 나타낸다.
  • double 데이타 타입은 숫자 뒤에 123.45D과 같이 D를 붙이거나 혹은 아무것도 붙이지 않음으로 해서 double 타입임을 나타낸다.
  • decimal 데이타 타입은 숫자 뒤에 123.45M과 같이 M를 붙여 decimal 타입임을 나타낸다.
  • char 데이타 타입은 작은따옴표 ' (single quotation)을 사용하여 한 문자를 할당한다.
  • string 데이타 타입은 큰따옴표 " (double quotation)을 사용하여 문자열을 할당한다.

최대값, 최소값? 

숫자형 데이타 타입의 최대값 혹은 최소값을 알아내기 위해서는 .NET 데이타 타입 클래스들의 MaxValue, MinValue 프로퍼티를 사용한다. C# 데이타 타입 키워드 뒤에서도 이러한 프로퍼티를 직접 호출할 수 있다. 즉, int.MaxValue 혹은 Int32.MaxValue 처럼 사용할 수 있다. 

 




NULL 

어떤 변수가 메모리 상에 어떤 데이타도 가지고 있지 않다는 의미로서 NULL을 사용하는데, NULL을 표현하기 위하여 C# 에서는 소문자 null 이라는 키워드를 사용한다.

모든 데이타 타입이 NULL을 가질 수 있는 것은 아니며, 사실 데이타 타입은 NULL을 가질 수 있는 타입 (Reference 타입)과 가질 수 없는 타입 (Value 타입)으로 구분될 수 있다.

아래는 NULL을 가질 수 있는 문자열(string) 타입의 변수 s 에 null 을 할당하는 예이다. 


 




Nullable Type 

정수(int)나 날짜(DateTime)와 같은 Value Type은 일반적으로 NULL을 가질 수 없다. C# 2.0에서부터 이러한 타입들에 NULL을 가질 수 있게 하였는데, 이를 Nullable Type 이라 부른다.

C#에서 물음표(?)를 int나 DateTime 타입명 뒤에 붙이면 즉, int? 혹은 DateTime? 같이 하면 Nullable Type이 된다. 이는 컴파일하면 .NET의 Nullable<T> 타입으로 변환된다. Nullable Type (예: int?) 을 일반 Value Type (예: int)으로 변경하기 위해서는 Nullable의 .Value 속성을 사용한다.
 

예제

// Nullable 타입 int? i = null; i = 101;              bool? b = null; //int? 를 int로 할당 Nullable<int> j = null; j = 10; int k = j.Value;

'C샵' 카테고리의 다른 글

[C#] C#의 버전 알아보자  (0) 2020.04.16
[C#] C#이란 무엇일까? 기초알아보기 (1)  (0) 2020.04.16
[C#] TXT 불러오기 소스  (0) 2020.04.13
[C#] 네이버 카페 인증소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
C샵 2020. 4. 16. 20:32

 

C#은 .NET Framework 버전 및 Visual Studio 버전과 밀접한 관련이 있으며, 다음 도표에서 각 버젼별 연관성을 살펴 볼 수 있다.

 

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가
  • 6행 선택6행 다음에 행 추가
  • 7행 선택7행 다음에 행 추가
  • 8행 선택8행 다음에 행 추가
  • 9행 선택9행 다음에 행 추가
  • 10행 선택10행 다음에 행 추가
  • 11행 선택11행 다음에 행 추가
  • 12행 선택12행 다음에 행 추가
  • 13행 선택13행 다음에 행 추가

열 너비 조절

행 높이 조절

.NET 버전

C# 버전

Visual Studio

.NET 1.0

C# 1.0

Visual Studio .NET

.NET 1.1

C# 1.1

Visual Studio .NET 2003

.NET 2.0

C# 2.0

Visual Studio 2005

.NET 3.0

C# 2.0

Visual Studio 2005 Extensions

.NET 3.5

C# 3.0

Visual Studio 2008

.NET 4.0

C# 4.0

Visual Studio 2010

.NET 4.5

C# 5.0

Visual Studio 2012

Visual Studio 2013

.NET 4.6

C# 6.0

Visual Studio 2015

.NET 4.6.2

C# 7.0

Visual Studio 2017

.NET 4.7

C# 7.1

Visual Studio 2017 Update 15.3

.NET 4.7.1

C# 7.2

Visual Studio 2017 Update 15.5

.NET 4.7.2

C# 7.3

Visual Studio 2017 Update 15.7

.NET Core 3.0

C# 8.0

Visual Studio 2019 Update 16.3 + .NET Core 3.0

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

Visual Studio 2010은 .NET 4.0 뿐만 아니라 .NET 2.0, .NET 3.0, .NET 3.5도 지원한다.

Visual Studio 2008은 .NET 3.5 뿐만 아니라 .NET 2.0, .NET 3.0도 지원한다.

C# 7.1, C# 7.2, C# 7.3은 Minor 버전으로 자동으로 Enable되지 않으며, VS에서 C# 프로젝트 속성창 => Build 탭 => Advanced 버튼 => Language Version 콤보박스에서 해당 버전을 선택해야 한다.

C# 8.0을 사용하기 위해서는 VS 2019를 Update 16.3 이상으로 업데이트하고 .NET Core 3.0 을 설치한 후 사용한다. C# 8.0은 .NET Framework 4.8에서 사용할 수 없다.

 

 


C# 버전별 주요 기능

 

다음은 C# 버전별로 새로 추가된 주요 기능들을 요약한 것이다.

 

셀 전체 선택

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
  • 1행 선택1행 다음에 행 추가
  • 2행 선택2행 다음에 행 추가
  • 3행 선택3행 다음에 행 추가
  • 4행 선택4행 다음에 행 추가
  • 5행 선택5행 다음에 행 추가
  • 6행 선택6행 다음에 행 추가
  • 7행 선택7행 다음에 행 추가

열 너비 조절

행 높이 조절

C# 버전

주요 기능

C# 2.0

C# Generics

Anonymous Method (무명 메서드)

Nullable Type

Partial Type

C# yield 키워드

Delegate에 대한 Covariance / Contravariance

C# 3.0

Lambda Expression (람다식)

Anonymous Type (익명 타입)

Extension Method (확장 메서드)

C# var 키워드 (implicit type)

LINQ

Expression Tree

C# 4.0

C# dynamic (Late binding)

Named Argument

Optional Argument

Indexed Property

보다 쉬운 Office COM API 지원

C# 5.0

C# async / await

Caller Information

C# 6.0

널 조건 연산자 (Null-conditional operator)

문자열 내삽(內揷) 기능 (String Interpolation)

Dictionary Initializer

nameof 연산자

using static 문

catch/finally 블럭에서 await 사용

Exception Filter 지원

자동 속성 초기자 (Auto-Property Initializer)

읽기전용 자동 속성 (Getter only)

Expression-bodied member 사용

C# 7.0

C# 7.0: 패턴 매칭

C# 7.0: 튜플 (Tuple)

C# 7.0: 로컬 함수 (Local Function)

C# 7.0: out 파라미터

C# 7.0: 자리수 분리자와 이진 리터럴

C# 7.0: Deconstructor

C# 7.0: ref local 과 ref return

C# 7.0: async 커스텀 리턴 타입

C# 7.0: 향상된 Expression-bodied 표현

C# 7.0: throw expression

C# 8.0

C# 8.0: 디폴트 인터페이스 멤버 (Default Inteface Members)

C# 8.0: 향상된 패턴 매칭 기능 (Pattern Matching)

C# 8.0: Nullable Reference Type

C# 8.0: 인덱싱과 슬라이싱 (Indexing / Slicing)

C# 8.0: 비동기 스트림 (Async Stream)

C# 8.0: using 선언

C# 8.0: 널 병합 할당 연산자 (Null-coalescing assignment)

C# 8.0: 구조체(struct) 읽기 전용 멤버

C# 8.0: 기타 기능들

  • 셀 병합
  • 행 분할
  • 열 분할
  • 너비 맞춤
  • 삭제

 

posted by 핵커 커뮤니티
:
C샵 2020. 4. 16. 20:29

C# 프로그래밍 언어 

C#은 마이크로소프트에서 개발된 객체 지향 프로그래밍 언어로서 Java 나 C++와 비슷한 면들을 많이 가지고 있다. C#을 이야기 하면 자연스럽게 .NET Framework을 함께 이야기 해야할 정도로 C#은 .NET Framework을 이용하여 프로그래밍하는 대표적인 언어이다. C#은 윈도우 프로그래밍, 웹 프로그래밍, 게임 및 모바일 프로그래밍 등 모든 영역에서 사용되는 범용 프로그래밍 언어이다 


C# 프로그램 소스코드 

C# 프로그램은 .cs 라는 확장자를 사용한다.
   예) test.cs, test.aspx.cs, test.xaml.cs 
C++와 다르게 C#은 *.h과 같은 별도의 헤더 파일이 없다.

C# 프로그램으로부터 실행 파일을 만들기 위해서는 (1) Visual Studio를 사용하는 경우 C# 프로젝트를 빌드하여 실행파일을 생성하며 (2) Visual Studio 없이 .NET Framework에서 제공되는 C# 컴파일러인 csc.exe를 이용하여 실행파일을 생성할 수 있다. 


 

 

 

 


아주 간단한 C# 프로그램 

다음은 아주 간단한 C# 프로그램 예제로서 Hello World 라는 텍스트를 콘솔 화면에 출력하는 프로그램이다. 

예제

namespace Intro_Ex1 {     class Program     {         static void Main(string[] args)         {             System.Console.WriteLine("Hello World...");         }     } }

  • 모든 C# 프로그램은 Main()이라는 시작 함수(메서드)를 가져야 한다. Main() 메소드는 임의의 클래스 안에서 존재하며, 프로그램 상에 단 1개만 있어야 한다.
  • Main()는 static으로 선언되며, 메소드 인자는 string[] 문자열이다.
  • System.Console은 .NET Framework 클래스이며, WriteLine은 화면에 데이타를 Console클래스의 출력하는 메서드이다.

C# 코멘트 

C# 에서 코멘트를 사용하기 위해서는 (1) 한 라인에 대해 코멘트할 경우 // 을 사용하고 (2) 복수 라인에 대해 코멘트를 할 경우는 /* */ 를 사용한다. 

예제

namespace Intro_Ex2 {         class Program     {         static void Main(string[] args)         {             // 코멘트: 한 라인 코멘트는 두개의 슬래시 사용함                    int a = 1;             int b = 1;  // 코멘트: 하나의 문장 뒤에 코멘트를 달 수 있음             /*                복수 라인에 대한 코멘트                int c;                int d;              */         }     } }

'C샵' 카테고리의 다른 글

[C#] C# 데이터 타입 배워보기 (종류)  (1) 2020.04.16
[C#] C#의 버전 알아보자  (0) 2020.04.16
[C#] TXT 불러오기 소스  (0) 2020.04.13
[C#] 네이버 카페 인증소스  (0) 2020.04.13
posted by 핵커 커뮤니티
:
자료실 2020. 4. 15. 08:46

컴포넌트.zip
0.03MB

 

posted by 핵커 커뮤니티
:
SQL 2020. 4. 14. 19:21

결과값 일부 조회 (ROWNUM, TOP)

SQL 쿼리 결과 중 상위 몇 개만 보여주는 쿼리

SELECT 컬럼명 1, 컬럼명 2, ... FROM 테이블명 WHERE 조건절 LIMIT 숫자

대표적인 비표준기능 (DBMS 종류마다 다름)

예제

- 국가코드가 'KOR' 인 도시들 중 인구수 많은 순서로 상위 10개만 표시하시오

결과 확인

- SELECT CountryCode FROM city WHERE CountryCode = 'KOR' ORDER BY Population DESC LIMIT 10;

집합함수 (Aggregation Function)

테이블의 전체 레코드를 대상으로 특정 컬럼을 적용해서 한 개의 값을 리턴하는 함수

COUNT(), AVG(), SUM(), MIN(), MAX(), FIRST(), LAST(), ....

     - COUNT()   ->  레코드의 개수를 리턴하는 함수

     - SUM() / AVG()   ->   컬럼값의 합/평균을 리턴

     - MIN() / MAX()   ->   컬럼값의 최소/최대값을 리턴

사용법 : SELECT aggregation_function(컬럼명) FROM 테이블명 WHERE 조건절

예제

- City 테이블에서 국가코드가 'KOR' 인 도시의 수를 표시하시오

- City 테이블에서 국가코드가 'KOR' 인 도시들의 인구수 총합 / 평균을 구하시오

- City 테이블에서 국가코드가 'KOR' 인 도시들의 인구수 중 최대값 / 최소값을 구하시오

결과 확인

- SELECT COUNT(*) FROM city WHERE CountryCode = 'KOR'

- SELECT SUM(Population) FROM city WHERE CountryCode = 'KOR'

- SELECT AVG(Population) FROM city WHERE CountryCode = 'KOR'

- SELECT MIN(Population) FROM city WHERE CountryCode = 'KOR'

- SELECT MAX(Population) FROM city WHERE CountryCode = 'KOR'

유용한 함수들

LENGTH() - 레코드의 문자열 컬럼의 글자수를 리턴한다.

MID() - 문자열의 중간부분을 리턴한다.

UPPER() / LOWER() - 문자열을 대문자/소문자로 리턴한다.

ROUND() - 레코드의 숫자 컬럼값을 반올림

posted by 핵커 커뮤니티
:
PHP 2020. 4. 14. 19:07

[PHP]함수의 인수

함수 안에서 사용하는 값을 함수 밖에서 전달할 수 있는데 이 값을 인수라고 한다.

-예

<?php

function check($age) {

$result = (20 <= $age)?"프로":"그래밍";

print $result."입니다.";

}

check(19);

?>

-결과

​프로그래밍

 

인수가 지정되지 않은 경우(에러가 발생한다.)

- 예

<?php

function check($age) {

$result = (20 <= $age)?"프로":"그래밍";

print $result."입니다.";

}

check();

?>

- 결과(에러 발생)

Fatal error: Uncaught ArgumentCountError: Too fewargumenC:/ xampp/hydocs/for:php:

2 Stack trace: #0 C:xampp/hidocs/for

인수에 값이 없는 경우 에러가 발생하므로 인수의 기본값을 사용한다.

-예

<?php

function check($age=19) {

$result = (20 <= $age)?"프로":"그래밍";

print $result."입니다.";

}

check();

?>

 

- 결과(에러가 발생하지 않았다.)

프로그래밍

 

<?php

function test($x1, $x2)(

echo '*'.$x1.$x2.'*';

)

test('핵','커');

?>

결과는 *핵커*

'PHP' 카테고리의 다른 글

[PHP] PHP 문자 N 문자를 연결해보자!  (0) 2020.04.14
[PHP] PHP 함수 생성 및 호출  (0) 2020.04.14
[PHP] PHP 다운로드  (0) 2020.04.14
[PHP] 시작,종류,태그,변수,저장확정자  (0) 2020.04.11
posted by 핵커 커뮤니티
:
Objective_C 2020. 4. 14. 18:50

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
posted by 핵커 커뮤니티
:
Arduino 2020. 4. 13. 19:15

SerialPort port;//시리얼 포트 만들기 using System.IO.Ports; 를 맨 위에 써주자. port = new SerialPort("COM3", 9600);//이런 식으로 하면 COM3에 9600의 속도로 연결함.

using System;
using System.IO.Ports;
using System.Windows.Forms;
namespace Arduino_SerialTest
{
public partial class Form1 : Form
{
public string setPort;
public int setSpeed;
public SerialPort port;
public Form1()
{
InitializeComponent();
}
//세팅 버튼
private void btnSet_Click(object sender, EventArgs e)
{
try
{
setPort = txtPort.Text;
setSpeed = Convert.ToInt16(txtSpeed.Text);
port = new SerialPort(setPort, setSpeed);
port.Open();//포트 열기
btnSend.Enabled = true;//전송 버튼 활성화
}
catch
{ MessageBox.Show("올바른 값을 입력하거나 연결이 잘 되었는지 확인하세요.";
}
}
//전송 버튼
private void btnSend_Click(object sender, EventArgs e)
{
string sendSirial = txtSend.Text;
port.Write(sendSirial);
txtSend.Text = "";
}
}
}

'Arduino' 카테고리의 다른 글

[Arduino] Blink 소스예제  (0) 2020.04.13
posted by 핵커 커뮤니티
: