2016년 12월 27일 화요일

[Links] OOP, OOAD 참고 링크, 책들.

설명을 해줘야 하는데 자료 만들기는 좀 그렇고 링크로 대체함.

객체 지향 개념


객체-지향 프로그래밍 이란 무엇인가? (OOP)
 : http://vandbt.tistory.com/10

객체-지향 프로그래밍 이란 무엇인가? : 다섯개의 기반 개념
 : http://vandbt.tistory.com/39

객체지향 개념 (쫌 아는체 하기)
 : http://www.slideshare.net/plusjune/ss-46109239

Object Oriented Analysis & Design Tutorial
 : http://www.tutorialspoint.com/object_oriented_analysis_design/index.htm

사실 책은 뭘 봐야 할지 모르겠지만
C++, Java, C# 책 중에서 객체지향에 대해서 자세히 언급하는 책을 찾아서 보면 도움이 될 듯함.

이 책이 눈에 뛰던데 대체로 중급정도 서적으로 보이고 평이 좋더라..

객체지향의 사실과 오해 : 역할, 책임, 협력 관점에서 본 객체지향 
조영호 저 | 위키북스
http://www.yes24.com/24/goods/18249021
다만 개념서라서 코드는 전혀 없다. 객체지향에 대한 기초부터 차근차근 설면하고 있지만 글이 너무 많다. 인문계생을 위한 객체지향 서적 같다 ㅎ

그리고 대충 언어에 대한 기본 문법이 익숙해지고 프로그램을 몇번 짜고 나면
언어의 고급 feature에 대해서 논하는 책을 꼭 읽어보는게 좋더라.

나는 C/C++ 기반의 프로그램을 주로 짰었기 때문에 아래 책이 큰 도움이 되었고
C++의 중급문법에 눈을 뜨게 되었었다. 다른 언어에 대해서도 비슷한 책들이 있으니 꼭 참고하는 것이 언어 이해 및 고급 문법을 활용하는데 필수 적이다.

Effective C++ 이펙티브 C++ 3판 
스콧 마이어스 저/곽용재 역 | 프로텍미디어
 : http://www.yes24.com/24/goods/17525589

Effective Modern 이펙티브 모던 C++ 
스콧 마이어스 저/류광 역 | 인사이트(insight)
 : http://www.yes24.com/24/goods/20288684
(이건 보지는 않았는데.. 뭐 믿고 보는 마이어스 아저씨 책이라...)

고급 객체지향 프로그래밍http://m.yes24.com/Goods/Detail/23308041?acode=101
서점에거 살짝 봤는데 교재로 쓰면 좋을 것 같다. 초중급 난이도로 두루두루 내용을 다루고 있어 읽어두면 좋을 책.

UML & Design Pattern


OOP 개념 소개 되면 자연스레 Design pattern도 함께 소개 되어야 할 것 같은데..
워낙 유명한 GoF 책은 언어도 언어고 중급 이상이라..
한글로 된 다른 책들을 읽는게 도움이 될 듯하다.

먼저 대충 UML에 대한 이해는 아래 고전?만 보고 필요할때 찾아 보면 문제가 없는 듯 하다.

UML 실전에서는 이것만 쓴다 : Java 프로그래머를 위한 UML 개정판 
로버트 C. 마틴 저/이용원,정지호 공역 | 인사이트(insight) | 원제 : UML for Java Programmers (2003)
http://www.yes24.com/24/Goods/4492519

Design pattern은 레퍼런스 하기에는 아래 책이 괜찮았던 것 같다.
Java로 소개되어 있지만 어차피 언어는 비슷비슷해서...

Java 언어로 배우는 디자인 패턴 입문 개정판 
Yuki Hiroshi 저/이규흥 역 | 영진닷컴
 : http://www.yes24.com/24/goods/2918928

이 책은 뭐.. 호불호가 많이 갈려서 나도 사실은 읽지는 않았음.

Head First Design Patterns : 스토리가 있는 패턴 학습법  강력추천 
에릭 프리먼 등저 / 서환수 역 | 한빛미디어
 : http://www.yes24.com/24/goods/1778966

이책은 도서관에서 잠깐 봤는데 구성이나 설명이 깔끔하진 않지만 Design pattern부터 리팩토링 까지 고루 다루고 있어서 초중급자에게 적당하지 않을까 생각함.
당연히 언급되는 책들은 다 찾아봐야함.

개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴 
최범균 저 | 인투북스
 : http://www.yes24.com/24/goods/9179120


Refactoring


그리고 이책은 두고두고 봐도 좋은 책 같다.

리팩토링 : 코드 품질을 개선하는 객체지향 사고법 
마틴 파울러 저/김지원 역 | 한빛미디어 | 원서 : Refactoring (Addison-Wesley Professional; 1 edition, 1999)
 : http://www.yes24.com/24/goods/7951038


소프트웨어 악취를 제거하는 리팩토링 : 구조적 설계 문제를 풀어내는 최선의 실천법!
: http://m.yes24.com/Goods/Detail/23502724
이런 책도 있음. 안봐서 모르지만 책이 작아서 후루룩 볼만한 내용. 다만 생각하느라 머리는 터질듯


마지막으로 프로그래머 추천 도서 라고 구글링을 해보면
많은 링크들이 나오는데 그것들을 참고해서 하나씩 보는 것도 괜찮다.
특히나 프로그래밍, 알고리즘 등 기술 도메인에 관련 된 책 말고
전반적인 CS/SE 관련 책을 보는 것도 나중에 큰 도움이 되더라.

다음의 링크에서 나열된 책들이 내 의견과 대부분 맞아 권함.
http://m.blog.naver.com/kkpa1002/20116446240

2016년 12월 17일 토요일

[Link] 후위 표기법(postfix) 및 계산

후위 표기법을 사용할 일이 있어서 찾다 보니 아래 사이트를 참고하게 됨. 

주로 참고한 사이트
http://interactivepython.org/runestone/static/pythonds/BasicDS/InfixPrefixandPostfixExpressions.html

설명이 영어고 예제가 python이지만
설명이 자세하고 코드가 정말 깔끔해서 참고하기 좋음.

보관을 위해 코드를 퍼오면 다음과 같음.
일단 트리를 사용해서 구현한 코드는 아님.

infix => postfix

from pythonds.basic.stack import Stack
def infixToPostfix(infixexpr):
    prec = {}
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    opStack = Stack()
    postfixList = []
    tokenList = infixexpr.split()
    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" or token in "0123456789":
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
               (prec[opStack.peek()] >= prec[token]):
                  postfixList.append(opStack.pop())
            opStack.push(token)
    while not opStack.isEmpty():
        postfixList.append(opStack.pop())
    return " ".join(postfixList)
print(infixToPostfix("A * B + C * D"))
print(infixToPostfix("( A + B ) * C - ( D - E ) * ( F + G )"))

postfix 계산

from pythonds.basic.stack import Stack
def postfixEval(postfixExpr):
    operandStack = Stack()
    tokenList = postfixExpr.split()
    for token in tokenList:
        if token in "0123456789":
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token,operand1,operand2)
            operandStack.push(result)
    return operandStack.pop()
def doMath(op, op1, op2):
    if op == "*":
        return op1 * op2
    elif op == "/":
        return op1 / op2
    elif op == "+":
        return op1 + op2
    else:
        return op1 - op2
print(postfixEval('7 8 + 3 2 + /'))

대충 C#으로 옮겨본 코드.. 뭐 만들다 만거라 문제는 많음.
https://github.com/hallower/dumbCalculator/blob/master/CalculatorImpl/CalculatorImpl/CalculatorImpl.cs


그리고 한글로 전반적인 내용과
C++로 구현된 예제가 괜찮은 사이트 이고
트리를 사용하여 구현한 코드임.
http://ehclub.co.kr/1258

2016년 12월 13일 화요일

C# 인덱서(Indexer)

그냥 개인적으로 reference 하기 위해 copy & paste 한 내용입니다. 자세한 내용은 아래 링크를 참고하세요.
: https://msdn.microsoft.com/ko-KR/library/6x16t2tx.aspx


용도가 뭘까 궁금해서 찾아봄.
그냥 배열 같이 사용하고 싶은 stroage class에 적용해서 사용하면 편할 듯.


 인덱서에서는 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있습니다. 인덱서는 해당 접근자가 매개 변수를 사용한다는 점을 제외하면 속성과 유사합니다.


인덱서는 클라이언트 응용 프로그램에서 배열과 마찬가지 방식으로 액세스할 수 있는 클래스, 구조체 또는 인터페이스를 만들 수 있게 해 주는 편리한 구문입니다. 인덱서는 주로 내부 컬렉션 또는 배열을 캡슐화하기 위한 형식에서 가장 많이 구현됩니다. 예를 들어 24시간 동안 10번 기록되는 온도를 화씨로 나타내는 TempRecord라는 클래스가 있다고 가정합니다. 클래스에는 온도를 나타내는 float 형식의 "temps"라는 배열과 온도를 기록한 날짜를 나타내는 DateTime이 들어 있습니다. 이 경우 인덱서를 구현하면 클라이언트는 float temp = tr.temps[4] 대신 float temp = tr[4]로 TempRecord 인스턴스의 온도에 액세스할 수 있습니다. 인덱서 표기법은 클라이언트 응용 프로그램의 구문을 단순하게 할 뿐 아니라 클래스와 해당 클래스의 용도를 다른 개발자가 쉽게 이해할 수 있도록 합니다.
클래스나 구조체에 대한 인덱서를 선언하려면 다음 예제에서와 같이 this 키워드를 사용합니다.
public int this[int index]    // Indexer declaration  
{  
    // get and set accessors  
}  
  

그나마 그럴듯한 예제.

class TempRecord
{
    // Array of temperature values
    private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 
                                            61.3F, 65.9F, 62.1F, 59.2F, 57.5F };

    // To enable client code to validate input 
    // when accessing your indexer.
    public int Length
    {
        get { return temps.Length; }
    }
    // Indexer declaration.
    // If index is out of range, the temps array will throw the exception.
    public float this[int index]
    {
        get
        {
            return temps[index];
        }

        set
        {
            temps[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        TempRecord tempRecord = new TempRecord();
        // Use the indexer's set accessor
        tempRecord[3] = 58.3F;
        tempRecord[5] = 60.1F;

        // Use the indexer's get accessor
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, tempRecord[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();

    }
}
/* Output:
        Element #0 = 56.2
        Element #1 = 56.7
        Element #2 = 56.5
        Element #3 = 58.3
        Element #4 = 58.8
        Element #5 = 60.1
        Element #6 = 65.9
        Element #7 = 62.1
        Element #8 = 59.2
        Element #9 = 57.5
    */

 이렇도 사용 가능.

public Customer this[long id] => store.LookupCustomer(id);  
  


interface에서 인덱서를 선언할 수 있습니다. 인터페이스 인덱서의 접근자와 클래스 인덱서의 접근자는 다음과 같은 차이점이 있습니다.
  • 인터페이스 접근자는 한정자를 사용하지 않습니다.
  • 인터페이스 접근자에는 본문이 없습니다.
따라서 접근자의 목적은 인덱서가 읽기/쓰기, 읽기 전용 또는 쓰기 전용인지 여부를 나타내는 것입니다.


public interface ISomeInterface
{
    //...

    // Indexer declaration:
    string this[int index]
    {
        get;
        set;
    }
}


인덱서 특징은

  • 인덱서를 사용하면 배열과 유사한 방식으로 개체를 인덱싱할 수 있습니다.
  • get 접근자는 값을 반환합니다. set 접근자는 값을 할당합니다.
  • this 키워드는 인덱서를 정의하는 데 사용됩니다.
  • value 키워드는 set 인덱서에서 할당하는 값을 정의하는 데 사용됩니다.
  • 인덱서는 정수 값으로 인덱싱될 필요가 없으며, 특정 조회 메커니즘을 정의하는 방법을 결정해야 합니다.
  • 인덱서는 오버로드될 수 있습니다.
  • 예를 들어 인덱서는 2차원 배열에 액세스하는 경우 둘 이상의 정식 매개 변수를 사용할 수 있습니다.


인덱서는 속성과 비슷합니다. 다음 표에 나와 있는 차이점을 제외하면 접근자에 정의된 모든 규칙이 인덱서 접근자에도 적용됩니다.
Property인덱서
공용 데이터 멤버인 것처럼 메서드를 호출할 수 있습니다.개체 자체의 배열 표기법을 사용하여 개체의 내부 컬렉션 요소에 액세스할 수 있습니다.
단순한 이름을 통해 액세스할 수 있습니다.인덱스를 통해 액세스할 수 있습니다.
정적 또는 인스턴스 멤버가 될 수 있습니다.인스턴스 멤버여야 합니다.
속성의 get 접근자에는 매개 변수가 없습니다.인덱서의 get 접근자는 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
속성의 set 접근자에는 명시적인 value 매개 변수가 포함됩니다.인덱서의 set 접근자는 value 매개 변수 외에도 인덱서와 동일한 정식 매개 변수 목록을 가집니다.
자동으로 구현된 속성이 있는 약식 구문을 지원합니다.약식 구문을 지원하지 않습니다.

2016년 12월 11일 일요일

Xamarin Android 개발 시 에러(Method 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' not found.) 발생 시

Xamarin.form으로 Android app 개발 시 아래 exception이 발생 되면

 System.MissingMethodException: Method 'Android.Support.V4.Widget.DrawerLayout.AddDrawerListener' not found.

1. Nuget manager에서 업데이트가 필요한 package가 있다면 업데이트

모두 업데이트 해보고 clean & build 후 설치된 기존 앱을 지우고 다시 설치해보고
excpetion이 다시 발생한다면 2번 방법을 사용

2. 이미 모두 업데이트 되어 있다면 아래 링크의 방법을 사용해서 특정 버전으로 설치

: https://forums.xamarin.com/discussion/77924/missingmethodexception-android-support-v4-widget-drawerlayout-adddrawerlistener-not-found

임시 방편인것 같지만 일단 사용하니 정상 동작함. 답변만 첨부하자면


JamesMontemagnoJamesMontemagnoJames Montemagno ANSWER ✓
So I just reproduced your issue and I am sorry that you and other ran into this. It looks like there was an issue in the templates and I am working with the team to quickly resolve this.
To fix:
  • Simply right click on the android project and select "Manage Nuget Packages"
  • Go to Updates
  • Find Xamarin.Android.Support.v7.AppCompat
  • Select version 23.3.0 from the version picker and hit Install
  • You additionally will need to install the RecyclerView 23.3.0 NuGet Package. Go to Browse and search for: Xamarin.Android.Support.v7.RecyclerView and make sure to pick 23.3.0 to install for the correct version
  • Now do a full clean/rebuild and it should work
  • This should install the correct versions of everything you need for Android
 
3. 설치된 앱을 삭제하고 재 설치

답변에서 빠진게 있었는데 기존 설치되었다면 해당 app을 지우고 다시 설치해야 한다.
안그러면 다른 exception이 발생된다.


2016년 12월 6일 화요일

대리자(Delegate), 무명 메서드(Anonymous Method), 람다식(Lambda)

개인적으로 대충 정리한 내용입니다. 자세한 내용은 MSDN 링크를 참고하세요.

대리자(Delegate)

: https://msdn.microsoft.com/ko-kr/library/ms173171.aspx

대리자는 특정 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조를 나타내는 형식입니다.
 
    public delegate int PerformCalculation(int x, int y);


  • 대리자는 C++의 함수 포인터와 유사하지만 형식이 안전합니다.
  • 대리자를 통해 메서드를 매개 변수로 전달할 수 있습니다.
  • 대리자를 사용하여 콜백 메서드를 정의할 수 있습니다.
  • 여러 대리자를 연결할 수 있습니다. 예를 들어 단일 이벤트에 대해 여러 메서드를 호출할 수 있습니다.
  • 메서드와 대리자 형식이 정확히 일치할 필요는 없습니다. 자세한 내용은 대리자의 가변성 사용을 참조하십시오.
  • C# 버전 2.0에는 별도로 정의된 메서드 대신 코드 블록을 매개 변수로 전달할 수 있도록 하는 무명 메서드라는 개념이 도입되었습니다. C# 3.0에는 인라인 코드 블록을 더 간단하게 작성할 수 있는 람다 식이 도입되었습니다. 특정 컨텍스트에서는 무명 메서드와 람다 식 모두 대리자 형식으로 컴파일됩니다. 이 두 기능을 익명 함수라고 합니다. 람다 식에 대한 자세한 내용은 익명 함수를 참조하십시오.
대리자 조합(멀티캐스트 대리자)
: https://msdn.microsoft.com/ko-kr/library/ms173175.aspx

이 예제에서는 멀티캐스트 대리자를 만드는 방법에 대해 설명합니다. 대리자 개체에는 + 연산자를 사용하여 대리자 인스턴스에 여러 개체를 할당할 수 있는 유용한 특성이 있습니다. 멀티캐스트 대리자에는 할당된 대리자 목록이 포함됩니다. 멀티캐스트 대리자를 호출하면 목록에 있는 대리자가 순서대로 호출됩니다. 같은 형식의 대리자만 조합할 수 있습니다.
- 연산자를 사용하면 멀티캐스트 대리자에서 구성 요소 대리자를 제거할 수 있습니다.

using System;

        // Define a custom delegate that has a string parameter and returns void.
        delegate void CustomDel(string s);

        class TestClass
        {
            // Define two methods that have the same signature as CustomDel.
            static void Hello(string s)
            {
                System.Console.WriteLine("  Hello, {0}!", s);
            }

            static void Goodbye(string s)
            {
                System.Console.WriteLine("  Goodbye, {0}!", s);
            }

            static void Main()
            {
                // Declare instances of the custom delegate.
                CustomDel hiDel, byeDel, multiDel, multiMinusHiDel;

                // In this example, you can omit the custom delegate if you 
                // want to and use Action<string> instead.
                //Action<string> hiDel, byeDel, multiDel, multiMinusHiDel;

                // Create the delegate object hiDel that references the
                // method Hello.
                hiDel = Hello;

                // Create the delegate object byeDel that references the
                // method Goodbye.
                byeDel = Goodbye;

                // The two delegates, hiDel and byeDel, are combined to 
                // form multiDel. 
                multiDel = hiDel + byeDel;

                // Remove hiDel from the multicast delegate, leaving byeDel,
                // which calls only the method Goodbye.
                multiMinusHiDel = multiDel - hiDel;

                Console.WriteLine("Invoking delegate hiDel:");
                hiDel("A");
                Console.WriteLine("Invoking delegate byeDel:");
                byeDel("B");
                Console.WriteLine("Invoking delegate multiDel:");
                multiDel("C");
                Console.WriteLine("Invoking delegate multiMinusHiDel:");
                multiMinusHiDel("D");
            }
        }
        /* Output:
        Invoking delegate hiDel:
          Hello, A!
        Invoking delegate byeDel:
          Goodbye, B!
        Invoking delegate multiDel:
          Hello, C!
          Goodbye, C!
        Invoking delegate multiMinusHiDel:
          Goodbye, D!
        */

대리자 사용
: https://msdn.microsoft.com/ko-kr/library/ms173172.aspx

C# 1.0 이상에서는 다음 예제와 같이 대리자를 선언할 수 있습니다.
    // Declare a delegate.
    delegate void Del(string str);

    // Declare a method with the same signature as the delegate.
    static void Notify(string name)
    {
        Console.WriteLine("Notification received for: {0}", name);
    }
    // Create an instance of the delegate.
    Del del1 = new Del(Notify); 

C# 2.0에서는 비슷한 방법을 통해 다음 예제에서와 같이 이전 예제의 선언을 작성할 수 있습니다.
        // C# 2.0 provides a simpler way to declare an instance of Del.
        Del del2 = Notify;
C# 2.0 이상에서는 다음 예제에서와 같이 무명 메서드를 사용하여 대리자를 선언하고 초기화할 수도 있습니다.
        // Instantiate Del by using an anonymous method.
        Del del3 = delegate(string name)
            { Console.WriteLine("Notification received for: {0}", name); };
C# 3.0 이상에서는 다음 예제에서와 같이 람다 식을 사용하여 대리자를 선언하고 인스턴스화할 수도 있습니다.
        // Instantiate Del by using a lambda expression.
        Del del4 = name =>  { Console.WriteLine("Notification received for: {0}", name); };


무명 메서드(Anonymous Method)

: https://msdn.microsoft.com/ko-kr/library/0yw3tz5k.aspx

2.0보다 이전 버전의 C#에서는 명명된 메서드를 사용하는 방법으로만 대리자를 선언할 수 있었습니다. C# 2.0에는 무명 메서드가 도입되었고 C# 3.0 이상에서는 무명 메서드 대신 람다 식을 사용하여 인라인 코드를 작성하는 방법이 더 선호됩니다.
무명 메서드에는 람다 식에 없는 기능이 한 가지 있습니다. 무명 메서드를 사용하면 매개 변수 목록을 생략할 수 있으며, 이는 무명 메서드가 여러 시그니처를 가진 대리자로 변환될 수 있음을 의미합니다. 람다 식을 사용해서는 이렇게 할 수 없습니다. 람다 식에 대한 자세한 내용은 람다 식을 참조하십시오.

        // Create a handler for a click event.
        button1.Click += delegate(System.Object o, System.EventArgs e)
                           { System.Windows.Forms.MessageBox.Show("Click!"); };
    // Create a delegate.
    delegate void Del(int x);

    // Instantiate the delegate using an anonymous method.
    Del d = delegate(int k) { /* ... */ };
무명 메서드를 사용하면 별도의 메서드를 만들 필요가 없으므로 대리자를 인스턴스화하는 데 따르는 코딩 오버헤드를 줄일 수 있습니다.

무명 메서드의 매개 변수 범위는 무명 메서드 블록입니다.
무명 메서드 블록 안에서 블록 밖을 대상으로 goto, break 또는 continue와 같은 점프 문을 사용하면 오류가 발생합니다. 무명 메서드 블록 밖에서 블록 안을 대상으로 goto, break 또는 continue와 같은 점프 문을 사용해도 오류가 발생합니다.
지역 변수 및 매개 변수의 범위에 무명 메서드 선언이 포함되는 경우 이러한 변수를 무명 메서드의 외부 변수라고 합니다. 예를 들어, 다음 코드 단편에서 n은 외부 변수입니다.
        int n = 0;
        Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };

람다식(Lambda)

: https://msdn.microsoft.com/ko-kr/library/bb397687.aspx

람다 식은 대리자 또는 식 트리 형식을 만드는 데 사용할 수 있는 익명 함수입니다. 람다 식을 사용하여 인수로 전달되거나 함수 호출 값으로 반환되는 로컬 함수를 쓸 수 있습니다. 람다 식은 LINQ 쿼리 식을 작성하는 데 특히 유용합니다.

람다 식을 만들려면 람다 연산자 => 왼쪽에 입력 매개 변수를 지정하고(있는 경우) 다른 쪽에 식이나 문 블록을 삽입합니다. 예를 들어 람다 식 x => x * x는 이름이 x인 매개 변수를 지정하고 x 제곱 값을 반환합니다. 다음 예제와 같이 대리자 형식에 이 식을 할당할 수도 있습니다.
delegate int del(int i);  
static void Main(string[] args)  
{  
    del myDelegate = x => x * x;  
    int j = myDelegate(5); //j = 25  
}  

식 트리 형식을 만들려면
using System.Linq.Expressions;  
  
namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Expression<del> myET = x => x * x;  
        }  
    }  
}  

=> 연산자는 할당(=)과 우선 순위가 같고 오른쪽 결합성이 있습니다(연산자 문서의 "결합성" 단원 참조).
 무명 메서드에 적용되는 모든 제한은 람다 식에도 적용됩니다. 자세한 내용은 무명 메서드을 참조하세요.

Lambda는 내용이 많아서 생략..