Java 개발자의 C#공부

Class

확장 메소드

확장 메소드는 기존 클래스의 기능을 확장하는 기법이다. 예를들어 이미 만들어서 배포가 되는 string 클래스에 내가 커스텀해서 만든 메소드를 추가 할수 있다는 것이다.

public static class 클래스이름{
    public static 반환형식 메소드이름(this 대상형식 식별자, 매개변수목록){
        ...
    }
}

일단 규칙은 다음과 같이 메소드를 static으로 선언을 해주어야한다.

public class Test{
    public static string stringTest(this string test){
        ...
    }
}
using Test;

...

string name="강성문";
name=name.stringTest();

...

이처럼 사용이 가능하다.

구조체

구조체는 c언어를 공부를 하고 자바를 공부했으면 대부분 아는 내용이어서 여기에서는 간단히 설명을 하고 넘어 가겠다. 일단 구조체는 struct명령어를 사용하며, c#에서의 구조체는 class와 거의 같다. 틀린점은 다음과 같다

특징 클래스 구조체
키워드 class struct
형식 참조형식 값형식
복사 얕은복사 깊은복사
인스턴스생성 new 연산자와 생성자 선언만으로 생성
생성자 매개변수 없는 생성자가능 매개변수가 필수
상속 가능 모든 구조체는 System.ValueType을 직접상속받음

프로퍼티

프로퍼티는 우리가 클래스를 만들때 기본적으로 대부분의 필드를 private로 선언을 하여 필드의 오염을 최소화 하고, get메소드나 set메소드를 통해서 필드에 접근을 하는것을 간편하게 해주기 위해 존재한다. 예제는 다음과 같다.

class 클래스이름{
    데이터 형식 필드이름;
    접근한정자 데이터형식 프로퍼티이름{
        get{
            return 필드이름;
        }
        set{
            필드이름=value;
        }
    }
}
...

클래스이름 test=new 클래스이름();
test.프로퍼티이름="aaa";
Console.WriteLine(test.프로퍼티이름);

...

다음과 같이 사용이 가능하다. 물론 저런 동작을 간소화한 자동구현 프로퍼티도 있다

class 클래스이름{
    접근한정자 데이터형식 프로퍼티이름{
        get; set;
    }
}

프로퍼티와 생성자

클래스이름 인스턴스 = new 클래스이름(){
    프로퍼티1=값,
    프로퍼티2=값,
    프로퍼티3=값
}

무명형식 프로퍼티

var 인스턴스 = new {Name=값, Age=값}

배열

System.Array

이름 설명
Sort() 배열을 정렬한다
BinarySearch< T >() 이진탐색을 수행합니다
IndexOf() 배열에서 찾고자하는 요소의 인덱스 반환
TrueForAll< T >() 배열의 모든 요소가 조건에 부합하는지의 여부반환
FindIndex< T >() 배열에서 지정한 조건에 맞는 첫번째 요소 반환
Resize< T >() 배열의 크기 재조정
Clear() 배열의 모든 요소 초기화
ForEach< T >() 배열의 모든 요소에 대해 동일한 작업 실행
GetLength() 배열에서 지정한 차원의 길이를 반환하다(인스턴스메소드)
Length 배열의 길이를 반환합니다(프로퍼티)
Rank 배열의 차원를 반환합니다(프로퍼티)

2차원 배열

2차원배열의 선언은 다음과 같이 한다.

데이터 형식[,] 배열이름 = new 데이터형식[2차원 길이, 1차원 길이];

참고로 자바와는 다르게 2차원 배열에서 1개의 차원만 분리를해서 인자값으로 넘겨주지는 못한다.

가변 배열

가변배열의 선언은 다음과 같이 한다.

데이터 형식[][] 배열이름 = new 데이터형식[가변배열의 용량][];

배열이름= new int[5]{1, 2, 3, 4, 5};

델리게이트(CallBackFunction)

델리게이트는 흔히 말하는 콜백함수를 뜻하며, 인자를 값대신에 함수를 보내는 것을 말한다. 이를 좀더 전문적인 말로 하면 메소드의 주소값을 참조하여 인자값으로 보낸다고 하면 될것같다.

한정자 delegate 반환형식 델리게이트이름(매개변수 목록);

사용예제

namespace Test{
    delegate int MyDelegate(int a, int b);
    class Calculator{
        public int Plus(int a,int b){
            return a+b;
        }
        public static int Minus(int a, int b){
            return a-b;
        }
    }
    class MainApp{
        static void Main(string[] args){
            Calculator cla = new Calculator();
            MyDelegate del;

            del=new MyDelegate(cla.Plus);
            Console.WriteLine(del(3,4));

            del=new MyDelegate(Calculator.Minus);
            Console.WriteLine(del(7,4));
        }
    }
}

델리게이트체인

델리게이트 체인이란 하나의 델리게이트가 여러개의 메소드를 동시에 가깝게 참조를 하는것으로 먼저 호출한 메소드부터 순서대로 실행이 되는것이다.

//1번째 방법
MyDelegate del = new MyDelegate(cla.Plus)+new MyDelegate(Calculator.Minus);

//2번째 방법
MyDelegate del = new MyDelegate(cla.Plus);
del+=new MyDelegate(Calculator.Minus);

//3번째 방법
MyDelegate del = (MyDelegate)Delegete.Combine(new MyDelegate(cla.Plus), new MyDelegate(Calculator.Minus));

후기

이번에 부분에서는 Java보다 C#이 좀더 편리한 점에 대해 많이 알게 된것 같다.

results matching ""

    No results matching ""