728x90

vs2015-wpf

Save the Humans.7z



wpf-user guide

WPF_user_guide.7z.001

WPF_user_guide.7z.002



wpf 연습(if~else문 활용)

우상단 체크박스에 체크하지 않으면 Text block에 위와 같은 문구가 뜬다.

체크 후에 버튼을 눌러보면 처음엔 오른쪽-다시 한번 눌렀을 땐 왼쪽으로 정렬이 된다. 


처음 실행시 text에 right가 아니기 때문에 else문이 실행되고 text속성이 right로 변경, HorizontalAlignment 속성도 right로 변경된다.

다시 한번 눌렀을 때는 if문이 만족되어 각각 left로 변경됨을 볼 수 있다.


아래는 그리드에 대한 재멀(xaml) 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<Window x:Class="Practice_Using_IfElse.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Practice_Using_IfElse"
        mc:Ignorable="d"
        Title="MainWindow" Height="192" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button x:Name="changeText" Content="Change the lable if checked" 
        HorizontalAlignment="Center" VerticalAlignment="Center" Click="changeText_Click"/>
 
        <CheckBox x:Name="enableCheckbox" Content="Enable lable changing" Grid.Column="1" 
        HorizontalAlignment="Center" VerticalAlignment="Center"/>
 
        <TextBlock x:Name="labelToChange" Grid.Row="1" TextWrapping="Wrap" Text="Press the button to change my text" 
        Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>
cs


xaml.cs 코드의 일부분 (이벤트 핸들러 메서드에 대한 C# 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private void changeText_Click(object sender, RoutedEventArgs e)
        {
            if (enableCheckbox.IsChecked == true)
            {
                if(labelToChange.Text == "Right")
                {
                    labelToChange.Text = "Left";
                    labelToChange.HorizontalAlignment = HorizontalAlignment.Left;
                }
                else
                {
                    labelToChange.Text = "Right";
                    labelToChange.HorizontalAlignment = HorizontalAlignment.Right;
                }
            }
            else
            {
                labelToChange.Text = "Text changing is disabled";
                labelToChange.HorizontalAlignment = HorizontalAlignment.Center;
            }
        }
cs


'Study > C#' 카테고리의 다른 글

C# 클래스, 메소드  (0) 2017.04.04
c# 복습  (0) 2017.03.31
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22
728x90
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
 
//이름/국영수 점수 입력받고 이름/국영수점수/총점/평균/석차 출력
 
namespace SScore
{
    class Student
    {
        public string Name;
        public int Kor;
        public int Eng;
        public int Math;
 
        public int input(object[] arr, int Cnt)
        {
            //이곳에 이름, 국영수 점수 입력받고 총점과 평균을 구한다  
            Console.Write("이름 입력 : ");
            Name = Console.ReadLine();
 
            while (true)
            {
                Console.Write("첫번째 점수 : ");
                Kor = int.Parse(Console.ReadLine());
                if (Kor < 0 || Kor > 100)
                    continue//반복문을 리셋하세요(반복문의 처음 위치로 이동)
 
                ReInput://Label statement
                Console.Write("두번째 점수 : ");
                Eng = int.Parse(Console.ReadLine());
                if (Eng < 0 || Eng > 100)
                    goto ReInput;//지정된 label statement로 이동
                do
                {
                    Console.Write("세번째 점수 : ");
                    Math = int.Parse(Console.ReadLine());
                } while (Math < 0 || Math > 100);
 
                int Sum = Kor + Eng + Math;
                Double Avg = Sum / 3;
 
                arr[Cnt] = Name + "\t" + Kor + "\t" + Eng + "\t" + Math + "\t" + Sum + "\t" + Avg + "\t";
 
                return Sum;
            }
        }
 
        class Program
        {
            static void Exception(int arg)
            {
                if (arg < 2)
                    Console.WriteLine("arg : {0}", arg);
                else
                    throw new Exception("arg가 10보다 큽니다.");
            }
 
            static void Main(string[] args)
            {
                object[] arr = new object[20];
                int[] arr_sum = new int[20];
                int[] rank = new int[20];
 
                Student std = new Student();
 
                char select;
                int Cnt = 0;
 
                while (true)
                {
                    Console.WriteLine("=====================================학생 성적 관리 프로그램=====================================");
                    Console.WriteLine("1. 학생성적 입력 ");
                    Console.WriteLine("2. 학생성적 보기 ");
                    Console.WriteLine("Q. 프로그램 종료 ");
                    Console.WriteLine("=================================================================================================");
 
                    Console.Write(" 메뉴선택 ( 1,2 또는 Q 입력 ) : ");
                    try
                    {
                        select = char.Parse(Console.ReadLine());
 
                        if (select == '1')
                        {
                            arr_sum[Cnt] = std.input(arr, Cnt);
                            Cnt++;
                        }
                        else if (select == '2')
                        {
                            Console.WriteLine();
                            Console.WriteLine("==============종합결과===============");
                            Console.WriteLine("성명\t국어\t영어\t수학\t총점\t평균\t순위");
 
                            for (int i = 0; i < Cnt; i++)
                            {
                                rank[i] = 1;
                                for (int a = 0; a < Cnt; a++)
                                {
                                    if (arr_sum[i] < arr_sum[a])
                                    {
                                        rank[i]++;
                                    }
                                }
                                Console.WriteLine("{0}{1}", arr[i], rank[i]);
                            }
                            break;
                        }
                        else if (select == 'q')
                        {
                            Console.Write("프로그램이 종료됩니다.");
                            break;
                        }
                        else if (select == 'Q')
                        {
                            Console.Write("프로그램이 종료됩니다.");
                            break;
                        }
                    }
 
                    catch (Exception e)
                    {
                        Console.WriteLine("올바른 값을 입력하세요");
                    }
                }
            }
        }
    }
}


'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22
2016-05-20-C#복습  (0) 2016.05.20
728x90

기반 클래스와 파생클래스 사이의 형 변환



안전한 형변환을 위한 is, as 연산자


is 연산자

객체가 해당형식에 해당하는지 검사하여, 결과를 bool값으로 반환

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeCasting
{
    class TestClass { }
    class Program
    {
        static void Main(string[] args)
        {
            Object obj=1004;
            Object obj2 = "천사";
            Console.WriteLine(" {0} is string -> {1}", obj, obj is string);
            Console.WriteLine(" {0} is string -> {1}", obj2, obj2 is string);
            Console.WriteLine("");
        }
    }
}

Output : 

 1004 is string -> False

 천사 is string -> True


계속하려면 아무 키나 누르십시오 . . .



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;

namespace TypeCasting
{
    class TestClass { }
    class Program
    {
        static void Main(string[] args)
        {
            Object obj = "This is string";

            if (obj is int)
                Console.WriteLine("obj는 string");
            else // else문이 없으면 화면에 아무것도 출력되지 않고 실행됨
                Console.WriteLine("obj는 string이 아님");
        }
    }
}

Output : 

obj는 string이 아님

계속하려면 아무 키나 누르십시오 . . .



as 연산자

형변환 연산과 다른 점은 변환이 가능하지 않는 경우 예외를 발생하지 않고 null이 반환됨.

               as 연산자는 오직 참조 형식에 대해서만 사용 가능


즉, as 연산자는 as 뒤에 나오는 타입이 아니면 null을 반환.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TypeCasting
{
    class Program
    {
        static void Main(string[] args)
        {
            object obj1= "alpha";
            object obj2 = 273;
            object obj3 = 52.273;

            string alpha = (string)obj1;
            string beta = (string)obj2;
            string gamma = (string)obj3;

            Console.WriteLine("alpha : " + alpha);
            Console.WriteLine("beta : " + beta);
            Console.WriteLine("gamma : " + gamma);
        }
    }
}

Output :

위와 같이 강제 형 변환을 하게 되면 처리되지 않은 예외가 뜨면서 프로그램이 종료된다.



아래는 as연산자를 쓴 소스이다.  변환이 가능하지않은 A는 null을 반환하게 된다.

using System;

namespace TypeCasting
{
    class Program
    {
        static void Main(string[] args)
        {
            object obj1 = 1004;
            object obj2 ="STRING!";

            string A = obj1 as string;
            string B = obj2 as string;

            Console.WriteLine("(string아니면 null) A: " + A);
            Console.WriteLine("(string아니면 null) B: " + B);
        }
    }
}

Output :

(string아니면 null) A:

(string아니면 null) B: STRING!

계속하려면 아무 키나 누르십시오 . . .

'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 스터디일지 -클래스  (0) 2016.05.22
2016-05-20-C#복습  (0) 2016.05.20
728x90

try~catch 문


try 블록과 각각 다른 예외의 처리기를 지정하는 하나 이상의 catch 절로 구성



아래의 소스는 실행시 에러와 함께 종료된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
 
namespace TryCatchText
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            a = 10;
            b = 0;
            c = a / b;
            Console.WriteLine(c);
        }
    }
}
cs



실행시 에러가 뜨면서 프로그램 종료 



try~catch문을 통해 예외문구를 출력하게하고 비정상 종료를 막을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
 
namespace TryCatchText
{
    class Program
    {
        static void Main(string[] args)
        {
            int a, b, c;
            a = 10;
            b = 0;
            try
            {
                c = a / b;
                Console.WriteLine(c);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
cs


Output : 


0으로 나누려 했습니다.

계속하려면 아무 키나 누르십시오 . . .




c#에서의 접근 한정자

 public

 클래스의 내부/외부 모든 곳에서 접근 가능



 protected

 클래스의 외부에서는 접근할수 없지만, 파생 클래스에서는 접근 가능.

 private

 클래스의 내부에서만 접근가능.(파생클래스도 접근불가)



멤버에 접근 한정자가 명시되어 있지 않으면 암시적으로 private으로 지정된다.

아래는 protected접근자에 대한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using System;
 
namespace AccessModifier
{
    class WaterHeater
    {
        int a;
        protected int temperature;
 
        public void SetTemperature(int temperature)
        // 변수가 protected이므로 public메소드로 접근. 
        
        {
            if (temperature < -5 || temperature > 42// -5~42사이의 값을 받음
            {
                throw new Exception("Out of temperature range");
                // 값이 범위를 벗어나면 위의 Exception문구를 출력
            }
 
            this.temperature = temperature;
        }
 
        internal void TurnOnWater()
        {
            Console.WriteLine("Turn on water : {0}", temperature);
        }
    }
 
    class MainApp
    {
        static void Main(string[] args)
        {
            try
            {
                WaterHeater heater = new WaterHeater();
                heater.SetTemperature(20);
                heater.TurnOnWater();
 
                heater.SetTemperature(-2);
                heater.TurnOnWater();
 
                heater.SetTemperature(50);
                // try~catch문을 쓰지않으면 컴파일시 처리되지않은 예외가 뜸
                heater.TurnOnWater();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}
cs

Turn on water : 20
Turn on water : -2
Out of temperature range

실행결과 : http://ideone.com/CgGv4G



c#에서의 상속


상속(Inheritance)은 부모(기반) 클래스의 멤버를 자식(파생) 클래스가 물려받는것이다.


기반클래스 -> 파생클래스 또는 슈퍼클래스 -> 서브클래스

라고도 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Base //기반 클래스
{
    //멤버 선언
 
    public void BaseMethod(){};
 }
 
class Derived : Base //기반 클래스 : 파생 클래스
{
    //기반 클래스의 모든 것을 상속 받음.
    //단, private으로 선언된 것 제외.
 
    public void DerivedMethod()
    {
        base.BaseMethod(); //base키워드를 통해 기반 클래스에 접근 가능.(this키워드는 자기 자신)
    }
}
cs


상속시 멤버의 접근 지정자는 아래와 같다. 

 - 기반클래스의 public 멤버는 파생클래스에서도 public

 - 기반클래스의 protected 멤버는 파생클래스에서도 protected

 - 기반클래스의 private은 상속 불가


아래는 상속을 활용한 예제이다. 

실제적으로는 파생클라스가 기반클래스의 개념들을 물려받아 더 넓은 개념을 가지게 된다.


(참고 예제 : http://rintiantta.blog.me/40113370865)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace food
{
    class Food
    {
        public void Maked()
        {
            Console.WriteLine("(만들어짐)");
        }
        public void Selled()
        {
            Console.WriteLine("(팔림)");
        }
        public void Eatted()
        {
            Console.WriteLine("(먹힘)");
        }
    }
 
    class Pizza : Food
    {
        public string TypeOfPizza;
    }
    class Chiecken : Food
    {
        public string TypeOfChicken;
    }
    class Program
    {
        static void Main(string[] args)
        {
            Pizza pizza = new Pizza();
            Chiecken chinnim = new Chiecken();
            
            pizza.TypeOfPizza = "포테이토 피자";
            Console.WriteLine("{0}", pizza.TypeOfPizza);
            pizza.Maked();
            pizza.Selled();
            pizza.Eatted();
 
            chinnim.TypeOfChicken = "갈릭 치킨";
            Console.WriteLine("{0}", chinnim.TypeOfChicken);
            chinnim.Maked();
            chinnim.Selled();
            chinnim.Eatted();
        }
    }
}
cs

Output : (http://ideone.com/fDrY8D)


포테이토 피자
(만들어짐)
(팔림)
(먹힘)
갈릭 치킨
(만들어짐)
(팔림)
(먹힘)


음식은 만들어지고 팔리고 먹힌다는 공통속성을 가지고 있다. 

위와같이 "상속"을 통해 기반 클래스의 코드를 재사용하거나, 자식 클래스에서 기반클래스를 바탕으로 클래스를 확장할 수 있다.



'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
2016-05-20-C#복습  (0) 2016.05.20
728x90

메소드 오버로딩


1
2
3
4
5
6
7
8
9
10
11
12
13
int Plus(int a, int b)
{
    return a + b;
}
 
double Plus(doubl a, double b)
{
    return a + b;
}
 
//
int       result1 = Plus(12);
double result2 = Plus(3.12.4);
cs


새로운 이름을 붙이지않고 하나의 메소드 이름에 여러개의 구현을 올림.

이름에 대한 고민을 줄여주고 코드의 일관성을 유지해주며, 생산성을 높인다. 






객체지향 프로그래밍


객체는 데이터와 메소드로 이루어진다.


: 속성은 데이터(변수), 기능은 메소드




Class는 객체를 만들기위한 청사진

붕어빵 틀이 클래스, 붕어빵은 객체

1
2
3
4
5
 
class 클래스 이름
{
    // 데이터와 메소드
}
cs




고양이를 추상화하기


1
2
3
4
5
6
7
8
9
class Cat
{
    public string Name;
    public string Color;    // 고양이의 속성(이름과 색)은 데이터
 
    public void Meow()    // 기능("야옹"은 메소드
    {
        Console.WriteLine("{0} : 야옹", Name);
    }
cs


위의 코드에서 Cat class에 선언된 Name,Color와 같은 클래스안에 선언된 변수들을 Field라고 한다.



Cat class은 청사진으로 실체(instance)는 아니다. 고양이 한마리의 이름과 색깔들을 정의해주어야 한다.




Cat 객체 생성


1
2
3
4
5
6
//kitty라는 객체를 생성
Cat kitty = new Cat();  
kitty.Color = "white";
kitty.Name = "kitty";
Kitty.Mew();
Console.WriteLine("{0} : {1}", kitty.Name, kitty.Color);
cs




1
Cat kitty = new Cat();   
cs

에서 cat()은 생성자.

new 키워드는 생성자를 호출해서 객체를 생성하는데 사용하는 연산자




this 키워드


1
2
3
4
5
6
7
8
9
10
class Employee
{
    private string Name;
 
    public void SetName(string Name)
    {
        this.Name = Name;
    }
}
//
cs

위의 코드에서 class Employee의 field도 Name,

SetName의 매개변수도 Name이다. (string Name)



this는 이런 모호성을 해결할 수 있는 키워드.

this.Name은 Employee 필드를 가리키고 오른쪽의 Name은 SetName() 메소드의 매개 변수를 가리킨다.



this() 생성자


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyClass
    {
        int a, b, c;
 
        public MyClass()
        {
            this.a = 5425;
        }
 
        public MyClass(int b) 
        {
      this.a = 5425;
            this.b = b;
        }
 
        public MyClass(int b, int c) 
        {
 this.a = 5425;
            this.b = b;
            this.c = c;
        }
cs


위 소스를 보면 문법적 문제는 없다. 다만 세개의 MyClass() 생성자안에 중복되는 코드들이 들어가있는데,

이것을 this() 생성자를 이용해 코드를 개선할 수 있다.

  1. using System;
  2.  
  3. namespace ThisConstructor
  4. {
  5. class MyClass
  6. {
  7. int a, b, c;
  8.  
  9. public MyClass()
  10. {
  11. this.a = 10;
  12. }
  13.  
  14. public MyClass(int b) : this()    //this()가 9행의 MyClass()를 호출
  15. {
  16. this.b = 20;
  17. }
  18.  
  19. public MyClass(int b, int c) : this(b)    //14행의 class호출
  20. {
  21. this.c = 30;
  22. }
  23.  
  24. public void PrintFields()
  25. {
  26. Console.WriteLine("a:{0}, b:{1}, c:{2}", a, b, c);
  27. }
  28. }
  29.  
  30. class MainApp
  31. {
  32. static void Main(string[] args)
  33. {
  34. MyClass a = new MyClass();
  35. a.PrintFields();
  36.  
  37. MyClass b = new MyClass(0);
  38. b.PrintFields();
  39.  
  40. MyClass c = new MyClass(0, 0);
  41. c.PrintFields();
  42. }
  43. }


 stdout

a:10, b:0, c:0

a:10, b:20, c:0

a:10, b:20, c:30



C# 성적관리 프로그램


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Student_Score
{
    class STUDENT
    {
        public string name;
        public int Kor;
        public int Eng;
        public int Tot;
        public double ag;
        public int grd;

        public string Total(string a, string b)
        {
            string temp = (int.Parse(a) + int.Parse(b)).ToString();
            return temp;
        }
        public string Avg(string a, string b)
        {
            string temp = ((int.Parse(a) + int.Parse(b)) / 2).ToString();
            return temp;
        }
        public string Grade(double ag)
        {
            string grade;
            if (90 >= ag)
                grade = "A";
            else if (80 >= ag)
                grade = "B";
            else if (70 >= ag)
                grade = "C";
            else
                grade = "F";
            return grade;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("학생정보 입력");

            STUDENT s1 = new STUDENT();

            Console.Write("이름 : ");
            s1.name = Console.ReadLine();

            Console.Write("국어성적 : ");
            s1.Kor = int.Parse(Console.ReadLine());

            Console.Write("영어성적 : ");
            s1.Eng = int.Parse(Console.ReadLine());

            s1.Tot = s1.Kor + s1.Eng;
            s1.ag = (s1.Kor + s1.Eng) / (double)2;

            Console.WriteLine("====================================================================================");
            Console.WriteLine("이름" + "\t" + "국어" + "\t" + "영어" + "\t" + "총점" + "\t" + "평균" + "\t" + "등급");
            Console.WriteLine(s1.name + "\t" + s1.Kor + "\t" + s1.Eng + "\t" + s1.Tot + "\t" + s1.ag + "\t" + s1.Grade(s1.ag));
        }


    }
}


Output :



'Study > C#' 카테고리의 다른 글

c# 복습  (0) 2017.03.31
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23
c# 스터디일지 -클래스  (0) 2016.05.22

+ Recent posts