식 (expression) 문장에서값을계산하는데사용식은연산자 (operator) 와피연자 (operand) 로구성식의값에따라 산술식, 관계식, 논리식으로구분 연산자 (operator) 식의의미를결정피연산자가어떻게계산될지를나타내는기호 C# 언어스펙 48개의연산자정의
연산자종류 산술연산자 : + - * / % 단항 + 단항 - 관계연산자 : > >= < <= ==!= 논리연산자 : &&! 증감연산자 : 전위 ++ 전위 후위 ++ 후위-- 비트연산자 : & ^ ~ << >> 조건연산자 :? : C# 언어의연산자 배정연산자 : = += -= *= /= %= &= = ^= <<= >>= 캐스트연산자 : ( 자료형 ) 형검사연산자 : is as 배열연산자 : [] 메소드연산자 : () 멤버접근연산자 :. 지정어연산자 : new typeof checked unchecked
의미 수치연산을나타내는연산자 연산자종류 단항산술연산자 : +, - 이항산술연산자 : +, -, *, /, % x = -5 ; // 음수 5 x = -(-5) ; // 양수 5 x = -(3-5) ; // 양수 2 % : 나머지연산자 (remainder operator) x % y = x - (x / y) * y
의미 두개의값을비교하는이항연산자연산결과 : true or false 관계연산자가포함된식 : 관계식 for, while, do-while 의조건식 연산자우선순위 관계연산자는산술연산자보다우선순위가낮다. 관계연산자우선순위 연산자 우선순위 비교연산자 > >= < <= ( 높음 ) 항등연산자 ==!= ( 낮음 ) b == x < y ===> b == (x < y) a > b + c ===> a > (b + c)
의미 두피연산자의논리관계를나타내는연산자 연산자종류 논리곱 (&&), 논리합 ( ), 논리부정 (!) 연산자우선순위 논리연산자는산술연산자나관계연산자보다연산순위가낮다. 논리연산자 연산의미 연산자 우선순위 형태 논리부정! ( 높음 )!x 논리곱 && x && y 논리합 ( 낮음 ) x y x == y x > y && y > z 3 1 2 4 5
[ 예제 2.18 LogicalOperatorApp.cs] using System; class LogicalOperatorApp { public static void Main() { int x=3, y=5, z=7; bool b; b = x < y && y < z; Console.WriteLine("Result = " + b); b = x == y x < y && y > z; Console.WriteLine("Result = " + b); 실행결과 : Result = True Result = False
의미 정수형변수의값을하나증가시키거나감소시키는연산자 연산자기호 ++, -- 변수가아닌식에는사용못함 : (a+b)++ 실수형적용안됨 : f++ // error: f is float 연산자종류 전위연산자 (prefix operator) n = 1; x = ++n; // x=2, n=2 후위연산자 (postfix operator) n = 1; x = n++; // x=1, n=2 // error
의미 비트단위로연산을수행하는연산자 피연산자는반드시정수형 연산자종류 비트논리곱 (&), 비트논리합 ( ), 비트배타적논리합 (^), 왼쪽이동 (<<), 오른쪽이동 (>>), 1 의보수 (~) 연산자우선순위 논리연산자 연산의미 연산자 우선순위 사용예 비트논리곱 & ( 높음 ) x & y 비트논리합 x y 비트배타적논리합 (exclusive OR) ^ x ^ y 왼쪽이동 (left shift) << x << y 오른쪽이동 (right shift) >> x >> y 1의보수 (one's complement) ~ ( 낮음 ) ~x
[ 예제 2.20 BitOperatorApp.cs] using System; class BitOperatorApp { public static void Main() { int x=9, y=3; Console.WriteLine(x + " & " + y + " = " + (x&y)); Console.WriteLine(x + " " + y + " = " + (x y)); Console.WriteLine(x + " ^ " + y + " = " + (x^y)); Console.WriteLine("~10 = " + (~10)); 실행결과 : 9 & 3 = 1 9 3 = 11 9 ^ 3 = 10 ~10 = -11
의미 의미가 if 문장과같은삼항연산자 형태식 1? 식 2 : 식 3 if (x > y) max = x; else max = y; max = x > y? x : y ;
[ 예제 2.22 ConditionalOperatorApp.cs] using System; class ConditionalOperatorApp { public static void Main() { int a, b, c; int m; Console.Write("Enter three numbers : "); a = Console.Read() - '0'; b = Console.Read() - '0'; c = Console.Read() - '0'; m = (a > b)? a : b; m = (m > c)? m : c; Console.WriteLine("The largest number = " + m); 입력데이터 : Enter three numbers : 526 실행결과 : The largest number = 6
의미 이항연산자와배정연산자가결합하여이루어진연산자 식 1 = 식 1 op 식 2 식 1 op= 식 2 op: - 산술연산자 : + - * / % - 비트연산자 : & ^ << >> 복합배정연산자사용예 sum += i ; sum = sum + i ; x *= y + 1 ; x = x * y + 1 ; x = x * (y+1)
의미 자료형변환연산자 형태 ( 자료형 ) 식 캐스트연산자사용예 (int) 3.75 ===> 3 (float) 3 ===> 3.0 (float) (1 / 2) ===> 0.0 (float) 1 / 2 ===> 0.5
연산자종류 데이터타입이지정한타입과호환가능한지검사 : is obj is <type> 주어진값을지정한타입으로변환 : as obj as <type>
의미 연산의의미를 C# 지정어로나타낸연산자 연산자종류 객체생성연산자 : new 객체형반환연산자 : typeof 오버플로검사연산 : checked 오버플로무시연산 : unchecked
[ 예제 2.26 IsAsOperatorApp.cs] using System; public class IsAsOperatorApp { static void IsOperator(object obj) { Console.WriteLine(obj + " is int : " + (obj is int)); Console.WriteLine(obj + " is string : "+(obj is string)); static void AsOperator(object obj) { Console.WriteLine(obj + " as string == null : " + (obj as string == null)); public static void Main() { IsOperator(10); IsOperator("ABC"); AsOperator(10); AsOperator("ABC"); 실행결과 : 10 is int : True 10 is string : False ABC is int : False ABC is string... True 10 as string == null : True ABC as string == null : False
연산자결합법칙우선순위 () []. 후위 ++ 후위 -- new typeof checked unchecked 좌측결합 ( 높음 ) 단항 + 단항-! ~ 전위 ++ 전위-- ( 자료형 ) 우측결합 * / % 좌측결합 + - 좌측결합 << >> 좌측결합 < > <= >= is as 좌측결합 ==!= 좌측결합 & 좌측결합 ^ 좌측결합 좌측결합 && 좌측결합 좌측결합? : 우측결합 = += -= *= /= %= &= ^= = <<= >>= 우측결합 ( 낮음 )
묵시적형변환 (implicit type conversion) 컴파일러에의해자동적으로수행되는형변환 작은크기자료형 큰크기자료형 명시적형변환 (explicit type conversion) 프로그래머가캐스트연산자를사용하여수행하는형변환형태 ( 자료형 ) 식 큰크기자료형에서작은크기자료형으로변환시정밀도상실 형변환금지 bool 같은자료형이외에다른자료형으로의변환금지
[ 예제 2.28 LosePrecisionApp.cs] using System; class LosePrecisionApp { public static void Main() { int big = 1234567890; float approx; approx = (float)big; Console.WriteLine("difference = " + (big - (int)approx)); 실행결과 : difference = -46
박싱 (boxing) 값형의데이터를참조형으로변환하는것컴파일러에의해묵시적으로행해짐박싱과정 언박싱 (unboxing) 참조형의데이터를값형으로변환하는것반드시캐스팅을통하여명시적으로행해짐반드시박싱될때형으로언박싱을해주어야함
[ 예제 2.30 BoxingUnboxingApp.cs] using System; class BoxingUnboxingApp { public static void Main() { int foo = 526; object bar = foo; // foo is boxed to bar. Console.WriteLine(bar); try { double d = (short)bar; Console.WriteLine(d); catch (InvalidCastException e) { Console.WriteLine(e + "Error"); 실행결과 : 526 System.InvalidCastException: at BoxingUnboxingApp.Main() Error
마우스 윈도우사용자에게가장편리하고친숙한입력장치 윈폼애플리케이션의사용자상호작용은대부분마우스를통해이루어짐 사용자가마우스를이동하거나클릭하면이벤트가발생 마우스이벤트 이동이벤트 사용자가마우스의위치를이동시킬경우발생 선택이벤트 사용자가마우스의버튼을클릭할경우발생
MouseEnter 마우스포인터가컨트롤이나폼영역에들어올때발생 MouseHover 마우스포인터가컨트롤이나폼에서이동하는것을멈출때발생 매번발생하지않으며처음멈출때만발생 MouseLeave 마우스포인터가컨트롤이나폼영역을벗어날때발생 MouseMove 마우스포인터가새로운영역으로이동할때발생 MouseWheel 입력포커스를가지고있는컨트롤이나폼위에서마우스휠버튼을회전시킬때발생
EventHandler 델리게이트형의처리기를사용하는이벤트 MouseEnter, MouseHover, MouseLeave MouseEventHandler 델리케이트형의처리기를사용하는이벤트 MouseMove, MouseWheel MouseEventArgs 클래스가제공하는프로퍼티를이용하여마우스의위치와상태에대한추가적인정보사용가능 public delegate void EventHander(object sender, EventArgs e); public delegate void MouseEventHander(object sender, MouseEventArgs e);
Button Clicks 마우스의상태를나타내는 MouseButtons 열거형값 MouseButtons 열거형 Left : 마우스왼쪽버튼을클릭한상태 Middle : 마우스중앙버튼을클릭한상태 None : 마우스를누르지않은상태 Right : 마우스오른쪽버튼을클릭한상태 XButton1 : 첫번째 X 버튼을클릭한상태 XButton2 : 두번째 X 버튼을클릭한상태 마우스버튼을클릭한횟수 IntelliMouse 에서제공하는버튼
Delta X Y 마우스휠의회전수 ( 휠을 1회돌리는것 ) 를나타내는값클라이언트좌표내에서, 마우스위치의 X좌표클라이언트좌표내에서, 마우스위치의 Y좌표
[ 예제 10.3 MousePositionApp.cs] 1) 폼설계 2) 프로퍼티 컨트롤 : (Name) 프로퍼티값 Form : Form1 Text MousePositionApp 3) 이벤트처리기 컨트롤 : (Name) 이벤트메소드명 Form : Form1 MouseEnter Form1_MouseEnter()
private void Form1_MouseEnter(object sender, EventArgs e) { Point mousepoint = PointToClient(MousePosition); string msg = Mouse Position : + mousepoint.x +, + mousepoint.y; MessageBox.Show(msg); 실행방법 : 폼위로마우스를이동하여 MouseEnter 이벤트를발생시킨다. 실행결과 : MousePosition 프로퍼티마우스의좌표를전체화면에대한상대좌표로 Point 구조체형으로반환 PointToClient 메소드전체화면에대한상대좌표를클라이언트좌표로변환
MouseDown 폼이나컨트롤에서마우스버튼을누를때발생 MouseUp Click 폼이나컨트롤에서마우스버튼을누른후해제할때발생 폼이나컨트롤을클릭할때발생 DoubleClick 폼이나컨트롤을더블클릭할때발생
EventHandler 델리게이트형의처리기를사용하는이벤트 Click, DoubleClick MouseEventHandler 델리케이트형의처리기를사용하는이벤트 MouseDown, MouseUp
마우스의이벤트가비동기적으로불특정시간에발생하더라도상대적인순서는보장됨 MouseEnter 와 MouseLeave 사이에발생하는이벤트 MouseHover MouseMove Click 이벤트 MouseDown 과 MouseUp 이벤트다음에발생 DoubleClick 이벤트 Click 이벤트다음에발생
[ 예제 10.5 MouseEventApp.cs] 1) 폼설계 2) 프로퍼티 ListBox : listbox1 Label : label1 Button : button1 Form : Form1 컨트롤 : (Name) 프로퍼티 값 Form : Form1 Text MouseEventApp ListBox : listbox1 Items Button : button1 Text Close Label : label1 Text MouseEventArgsLabel 3) 멤버 private void UpdateEventLabels(string msg, int x, int y, MouseEventArgs e) { string message = string.format("{0 X:{1, Y:{2", msg, x, y); string eventmsg = DateTime.Now.ToShortTimeString(); eventmsg += " " + message; listbox1.items.insert(0, eventmsg); listbox1.topindex = 0; string mouseinfo; if (e!= null) { mouseinfo = string.format("clicks: {0, Delta: {1, " + "Buttons: {2", e.clicks, e.delta, e.button.tostring()); else { mouseinfo = string.format("clicks: {0", msg); label1.text = mouseinfo;
4) 이벤트처리기 컨트롤 : (Name) 이벤트메소드명 ListBox : listbox1 MouseDown DoubleClick listbox1_mousedown() listbox1_doubleclick() Button : button1 Click Button1_Click() private void listbox1_mousedown(object sender, MouseEventArgs e) { UpdateEventLabels("(ListBox)MouseDown", e.x, e.y, e); private void listbox1_doubleclick(object sender, EventArgs e) { Point mousepoint = PointToClient(MousePosition); UpdateEventLabels("(ListBox)DoubleClick", mousepoint.x, mousepoint.y, null); private void button1_click(object sender, EventArgs e) { Application.Exit(); 실행방법 : ListBox 상에서 MouseDown, DoubleClick 이벤트를발생시킨다. 실행결과 :