아래 글은 C# 대리자 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 40단원 대리자 546 ~ 563페이지
  • 유튜브채널 VisualAcademy [C# 교과서 마스터하기 40. 대리자(Delegate)]

 

 

 

https://www.youtube.com/watch?v=GXuKiifDpjE 

 

 

 

 

 

✳대리자(Delegate)란?

 

  • 매개 변수 목록 및 반환 형식이 있는 메서드에 대한 참조(포인터)를 나타내는 형식
    -> 메서드 대신 호출

  • 메서드의 매개 변수에 메서드 자체(대리자)를 전달 가능
    -> 내장된 닷넷 API에 많이 사용

  • 영어 단어 delegate는 '위임하다' 또는 '대신하다'의 의미가 있습니다
  • 함수 자체를 데이터 하나로 보고 의미 그대로 다른 메서드를 대신 실행하는 기능

 

 

 

 

 

예제코드

using System;

//[?] 대리자(Delegate): 대신, 위임, 함수 포인터, 메서드 대신 호출, 대리 운전, 메서드의 매개변수로 전달
using System;

class DelegateSample
{
    static void GoForward() => Console.WriteLine("직진");
    static void GoLeft() => Console.WriteLine("좌회전");
    static void GoFast() => Console.WriteLine("과속");
    //static void GoRight() => Console.WriteLine("우회전");
    delegate void CarDriver(); // 대리자 형식 생성

    static void Main()
    {
        //GoForward();  //[1] 내가 직접 운동
        //CarDriver goHome = new CarDriver(GoForward);  //[2] 대리 운전
        CarDriver goHome = GoForward;
        goHome += GoLeft;
        goHome += GoFast;
        goHome -= GoFast;
        goHome += delegate () { Console.WriteLine("우회전"); };  //[3] 무명 메서드/익명 함수
                                                                // goHome += delegate { Console.WriteLine("후진"); };
        goHome += () => Console.WriteLine("후진");  //[4] 람다 식
        goHome();  // goHome.Invoke();

        // 내장된 대리자 형식을 통해서 직접 대리자 개체 생성: Func<T>, Action<T>, Predicate<T>, ...
        Action driver = GoForward;
        driver += GoLeft;
        driver += delegate () { Console.WriteLine("우회전"); };
        driver += () => Console.WriteLine("후진");
        driver();  // 트리거(방아쇠)

        Action go = () => Console.WriteLine("운전");
        go();

        RunLambda(() => Console.WriteLine("매개 변수로 람다 식(함수 이름, 무명 메서드) 전달"));
    }
    static void RunLambda(Action action) => action();
}
반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 필드(Field)  (0) 2021.05.21
C# 이벤트(Event)  (0) 2021.05.21
C# 속성(Property)  (0) 2021.05.20
C# 예외처리하기(Exception)  (0) 2021.05.19
C# 인터페이스(Interface)  (0) 2021.05.18

 

 

아래 글은 C# 속성 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.


📃 참고자료

 

  • C# 교과서(길벗 출판사) - 38단원 속성 사용하기 503 ~ 531페이지
  • 유튜브채널 VisualAcademy [C# 교과서 마스터하기 38. 속성(Property) 사용하기]

 

https://www.youtube.com/watch?v=q-vd0saLxAU 

 

 

 

❔ 속성이란

- 속성은 필드의 값을 읽거나 쓰거나 계산하는 방법을 제공하는 클래스의 속성을 나타내는 멤버입니다.

 

 

 

 

속성의 특성

 

  • 클래스 안에 선언된 필드의 내용을 설정(set)하거나 참조(get)할 때 사용하는 코드 블록을 속성이라 함
  • 개체의 필드 중에서 외부에 공개하고자 할 때 사용하는 방법
    -> private 필드를 public 속성으로

  • 개체의 성질 / 특징 / 색상 / 크기 / 모양 등을 표현

  • 자동차 개체로 비유하면 빨간색 스포츠카, 바퀴 4개 등으로 속성이 표현 가능

 

 

 

 

C# 교과서 예제코드

using System;

namespace PropertyAll
{
    public class Car
    {
        // 필드
        private string color; 

        // 생성자
        public Car()
        {
            this.color = "Black";
        }

        // 메서드로 외부에 공개
        public void SetColor(string color)
        {
            this.color = color; // this.필드 = 매개변수;
        }

        public string GetColor()
        {
            return color;
        }

        // 속성(프로퍼티;Property)
        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                color = value;
            }
        }

        // 읽기전용 속성
        public string Make
        {
            get
            {
                return "한국자동차";
            }
        }

        // 쓰기전용 속성
        private string _Type;
        public string Type
        {
            set
            {
                _Type = value;
            }
        }

        // 축약형 속성
        public string Name { get; set; }
    }

    class PropertyAll
    {
        static void Main()
        {
            //[1] Set과 Get 메서드 사용
            Car car1 = new Car();
            car1.SetColor("Red");
            Console.WriteLine(car1.GetColor()); // Red

            //[2] 속성을 사용
            Car whiteCar = new Car();
            whiteCar.Color = "White"; // set {}
            Console.WriteLine(whiteCar.Color); // get {}

            //[3] 읽기전용 속성
            Car k = new Car();
            // k.Make = ""; // <- 이 코드는 에러
            Console.WriteLine(k.Make); // 읽기만 가능

            //[4] 쓰기전용 속성
            Car car = new Car();
            car.Type = "중형"; // 쓰기만 가능
            // Console.WriteLine(car.Type); // <- 이 코드는 에러: 읽기는 불가

            //[5] 축약형 속성
            Car myCar = new Car();
            myCar.Name = "좋은차";
            Console.WriteLine(myCar.Name);
        }
    }
}
반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 이벤트(Event)  (0) 2021.05.21
C# 대리자(Delegate)  (0) 2021.05.20
C# 예외처리하기(Exception)  (0) 2021.05.19
C# 인터페이스(Interface)  (0) 2021.05.18
WPF UI 코딩 배우기1  (0) 2021.04.25

아래 글은 C# 예외처리 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 26단원 예외 처리하기 349 ~ 361페이지

  • 유튜브채널 VisualAcademy [C# 교과서 마스터하기 26. 예외 처리하기(Exception)]

 

 

 

 

https://www.youtube.com/watch?v=C781teBX52U 

 

 

 

예외의 의미

  • 프로그램 실행 도중 발생하는 예상치 못한 오류
    -> 오류(Error) === 예외(Exception)

  • 처리되지 않은 예외는 프로그램의 실행을 중단시키는 원인
    -> 강제종료 => 정상 종료로 처리가 필요

  • 신뢰도 및 안정성 측면에서 매우 중요
    -> 예외 처리(Exception Handling)를 통한 강제 종료 방지

 

 

 

예외(오류)의 종류

 

  1. 문법(컴파일) 오류
  2. 런타임 오류
  3. 알고리즘(논리) 오류

 

 

 

 

1.  문법(컴파일) 오류

 

  • 잘못된 명령어 입력
  • 타이핑의 실수로 발생

▶ 문법 오류를 방지하려면 많은 예제를 접해가면서 프로그래밍의 기초문법을 확실하게 이해해야함

 

 

 

 

2. 런타임 오류

 

  • 런타임 오류는 프로그램 작성 후 실행할 때 발생하는 오류
  • 많은 테스트를 통해서 해결

 

 

 

3. 알고리즘(논리) 오류

 

  • 주어진 문제에 대한 잘못된 해석으로 잘못된 결과를 초래하는 에러를 알고리즘 오류 또는 로직 오류라고 함
  • 문법 오류나 런타임 오류를 쉽게 발견해 낼 수 있지만, 알고리즘 오류는 처리 결과가 틀리게 나왔는데도
    알 수 없는 경우가 많기 때문에 이 알고리즘 오류를 해결하기가 가장 어려움
  • 알고리즘 오류를 해결하기 위해선 코드를 분석 및 많이 만들어 보면서 오류를 찾아내는 능력을 키워야함

 

 

 

 

 

예제코드 (C#교과서 360페이지)

using System;

class ExceptionHandling
{
    static void Main()
    {
        int a = 3;
        int b = 0;

        try
        {
            //[1] b가 0이므로 런타임 에러 발생
            a = a / b;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"예외(에러)가 발생됨: {ex.Message}");
        }
        finally
        {
            Console.WriteLine("try 구문을 정상 종료합니다.");
        }

        try
        {
            //[2] Exception 클래스에 에러 메시지 지정하여 무조건 에러 발생
            throw new Exception("내가 만든 에러");
        }
        catch (Exception e)
        {
            Console.WriteLine($"예외(에러)가 발생됨: {e.Message}");
        }
        finally
        {
            Console.WriteLine("try 구문을 정상 종료합니다.");
        }
    }
}
반응형

 

 

아래 글은 C# 인터페이스 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 45단원 인터페이스(Interface) 600 ~ 613페이지

  • 유튜브채널 VisualAcademy [C# 교과서 마스터하기 45. 인터페이스(Interface)]

 

 

https://www.youtube.com/watch?v=N4u2yQji4ec 



 

인터페이스(Interface)란?

 

  • 클래스에서 반드시 구현해야 하는 관련 기능에 대한 정의가 포함된 개념

 

 

 

 

인터페이스의 특징

 

  • 인터페이스 멤버를 구현하지 않으면 에러 발생(강제성)
    -> 기본 모양을 만들어 줘야함

  • 가내 수공업이 아닌 공장과 같은 곳에서는 설계도가 반드시 필요
    -> 설계 과정에서 인터페이스 활용

  • 데이터베이스 설계에서도 인터페이스 활용
  • 단순한 환경이 아닌 복잡한 상황에서 변경 가능한 환경에 대한 대비를 위한 것

  • 설계의 최고 상위개념이 인터페이스이다
  • 중구난방으로 개발하지 않도록 하게 해준다

  • 다형성을 구현 할 수 있다.
  • 참조타입이고 new() 인스턴스 생설할 수 없다.
  • 상속받은 클래스에서 반드시 재정의 해야 한다.

 

인터페이스를 통해 다중 상속 가능

 

  • 원래는 클래스와 클래스끼리 단일 상속만 가능
  • 다중 상속은 인터페이스를 통해 가능

 

 

 

 

예제코드 (C#교과서 612p 예제)

using System;

namespace InterfaceFriends
{
    // [1] 인터페이스: 설계 // Run() 이라는 단어 설계(명시)
    public interface IStandard { void Run(); }

    // [2] 추상 클래스: 설계 + 구현
    public abstract class KS
    {
        public abstract void Back();
        public void Left() => Console.WriteLine("좌회전");
    }

    // [3] 분할 클래스
    public partial class MyCar : KS
    {
        public override void Back() => Console.WriteLine("후진");
    }
    public partial class MyCar : KS
    {
        public void Right() => Console.WriteLine("우회전");
    }

    // [4] 봉인(최종) 클래스
    public sealed class Car : MyCar, IStandard
    {
        public void Run() => Console.WriteLine("전진");
    }

    // [5] 아래 코드는 에러(봉인 클래스는 상속 받을 수 없음)
    // public class SelfCar : Car { }

    class InterfaceFriends
    {
        static void Main()
        {
            Car cla = new Car();
            cla.Run(); cla.Left(); cla.Right(); cla.Back();
        }
    }
}

 

 

 

 


출처

 

* 닷넷코리아

https://www.dotnetkorea.com/

 

반응형

 

WPF 강의를 찾던 도중 초급자(작성자) 기준에 맞는 튜토리얼을 찾아서 공유합니다.

* 강의는 전부 영어로 되어 있지만, 코드만 따라 쳐도 도움이 된다고 생각합니다.

 

 

강의를 듣기 전 알고 있으면 좋은 내용

  • HTML의 태그(Tag)로 이루어진 구조
  • CSS에 대한 지식

- WPF에 XAML이라는 마크업 언어가 사용되는데 같은 마크업 언어인 HTML을 이해하고 있다면 쉽게 배울 수 있습니다.

- CSS에서 Margin, Padding과 같은 명령어에 대한 지식이 있으면 다양한 디자인을 해볼 수 있습니다.

 

 

 

 

www.youtube.com/watch?v=Vjldip84CXQ

 

 

 

 

 

 

영상을 보고 작성한 코드

<Window x:Class="WpfStudy.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:WpfStudy"
        mc:Ignorable="d"
        Title="Wpf Basics" Height="800" Width="400">
    <Border Margin="5" Padding="10" BorderBrush="Black" BorderThickness="1" CornerRadius="4">
        <!-- Buttons -->
        <StackPanel>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <Button x:Name="ApplyButton" Click="ApplyButton_Click" Margin="0 0 10 0" Grid.Column="0" Content="Apply" Cursor="Hand"/>
                <Button x:Name="ResetButton" Click="ResetButton_Click" Margin="0 0 10 0" Grid.Column="1" Content="Reset" Cursor="Hand"/>
                <Button Grid.Column="2" Content="Refresh" Cursor="Hand"/>
            </Grid>
            <TextBlock Text="Pulse Properties" FontWeight="Bold" Margin="0 10" />
            
            <!-- Description -->
            <TextBlock Text="Description"/>
            <TextBox x:Name="DescriptionText" Padding="2" />
            
            <!-- Status and Revision -->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="2*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                 
                <!-- Status -->
                <StackPanel Grid.Column="0" Margin="0 0 10 0">
                    <TextBlock Text="Status"/>
                    <TextBox IsReadOnly="True" Background="#eee" />
                </StackPanel>
                
                <!-- Revision -->
                <StackPanel Grid.Column="1">
                    <TextBlock Text="Revision" />
                    <TextBox IsReadOnly="True" Background="#eee" />
                </StackPanel>
            </Grid>
            
            <!-- Part Number -->
            <TextBlock Text="Part Number"/>
            <TextBox Padding="2" IsReadOnly="True" Background="#eee" />
            
            <!-- Raw Material -->
            <TextBlock Text="Raw Material" FontWeight="Bold" Margin="0 10"/>

            <TextBlock Text="Material" />
            <ComboBox Padding="2" />

            <!-- Manufacturing Information -->
            <TextBlock Text="Manufacturing Information" FontWeight="Bold" Margin="0 10"/>
            
            <!-- Work Centres -->
            <TextBlock Text="Work Centres" Margin="0 0 0 10"/>
            
            <!-- Check Boxes -->
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                 <!-- Column1 -->
                <StackPanel Grid.Column="0">
                    <CheckBox x:Name="WeldCheckBox" Content="Weld"/>
                    <CheckBox x:Name="AssemblyCheckBox" Content="Assembly"/>
                    <CheckBox x:Name="PlasmaCheckBox" Content="Plasma"/>
                    <CheckBox x:Name="LaserCheckBox" Content="Laser"/>
                    <CheckBox x:Name="PurchaseCheckBox" Content="Purchase"/>
                </StackPanel>
                
                <!-- Column2 -->
                <StackPanel Grid.Column="1" >
                    <CheckBox x:Name="LatheCheckBox" Content="Lathe"/>
                    <CheckBox x:Name="DrillCheckBox" Content="Drill"/>
                    <CheckBox x:Name="FoldCheckBox" Content="Fold"/>
                    <CheckBox x:Name="RollCheckBox" Content="Roll"/>
                    <CheckBox x:Name="SawCheckBox" Content="Saw"/>
                </StackPanel>
            </Grid>

            <!-- Length -->
            <TextBlock Text="Length" Margin="0 10 0 0"/>
            <TextBox Padding="2" />

            <!-- Mass -->
            <TextBlock Text="Mass" Margin="0 10 0 0"/>
            <TextBox Padding="2" />

            <!-- Finish -->
            <TextBlock Text="Finish" Margin="0 10 0 0" />
            <ComboBox SelectedIndex="0" Padding="2">
                <ComboBoxItem>Painted</ComboBoxItem>
                <ComboBoxItem>Not Painted</ComboBoxItem>
            </ComboBox>

            <!-- Purchase Info -->
            <TextBlock Text="Purchase Information" Margin="0 10 0 0" />
            <ComboBox SelectedIndex="0" Padding="2">
                <ComboBoxItem>Rubber</ComboBoxItem>
                <ComboBoxItem>Not Rubber</ComboBoxItem>
            </ComboBox>
            
            <!-- Supplier Name -->
            <TextBlock Text="Supplier Name" Margin="0 10 0 0"/>
            <TextBox Padding="2"/>

            <!-- Supplier Code -->
            <TextBlock Text="Supplier Code" Margin="0 10 0 0"/>
            <TextBox Padding="2"/>

            <TextBlock Text="Additional Info" FontWeight="Bold" Margin="0 10"/>
            
            <!-- Note -->
            <TextBlock Text="Note"/>
            <TextBox Padding="2"/>

        </StackPanel>
    </Border>
</Window>

 

 

 

 

 

 

결과물

반응형

 

셀레니움(Selenium) 라이브러리

 

  • Nuget 패키지로 Selenium 직접 다운로드 및 적용

  • C# Winform을 활용한 간단한 로그인폼

  • 셀레니움을 활용 자동 로그인 시스템

  • 버튼클릭 소스 구현

 

 

 

 

 

 

 

 

 

# Nuget 패키지로 셀레니움 라이브러리 다운로드 및 적용 방법

 

 

[셀레니움/Selenium, C#] C#에서 Selenium을 사용하기 위한 준비 단계

요즘 코로나 때문에 재택근무로 전환하는 기업들이 점차 늘고 있습니다. 제 집사람도 마찬가지인데요. 주말에 재택근무를 준비한다고 해서 회사에서 무슨 일을 하는지 살펴봤습니다. 그런데 생

luckygg.tistory.com

 

셀레니움을 C#에서 사용하기 위한 준비단계가 위 사이트에 자세히 나와있습니다.

 

 

 

 

 

 

 

# 윈폼 디자인

 

 

사용된 도구 상자

Lable: 3개

CheckBox: 1개

Button: 1개

 

 

 

 

 

# 네임스페이스 영역

 

using System;
using System.Threading;
using System.Windows.Forms;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

크롬 브라우저를 사용해서 using OpenQA.Selenium.Chrome; 입력했습니다.

 

 

 

 

 

 

 

 

# 버튼, 체크박스 이벤트 영역

 

 public Form1()
        {
            InitializeComponent();
        }

        string naverUrl = 
        "https://nid.naver.com/nidlogin.login?url=https%3A%2F%2Fsell.smartstore.naver.com
        %2F%23%2FnaverLoginCallback%3Furl%3Dhttps%253A%252F%252Fsell.smartstore.naver.com%252F%2523";
        
        private void btnLogin_Click(object sender, EventArgs e)
        {
            // 입력된 아이디, 패스워드 strig형식의 id와 pass에 각각 대입
            string id = textID.Text;
            string pass = textPass.Text;

            IWebDriver driver = new ChromeDriver();

            // 네이버 스마트스토어 로그인 페이지 이동
            driver.Navigate().GoToUrl(naverUrl);

            // 아이디 영역 선택
            var naverId = driver.FindElement(By.XPath("//*[@id='id']"));
            Thread.Sleep(100);

            // 아이디 입력
            naverId.SendKeys(id);
            Thread.Sleep(100);
            

            // 패스워드 영역 선택
            var naverPass = driver.FindElement(By.XPath("//*[@id='pw']"));
            Thread.Sleep(100);

            // 패스워드 입력
            naverPass.SendKeys(pass);
            Thread.Sleep(100);

            // 전부 입력 후 로그인 누르기
            driver.FindElement(By.XPath("//*[@id='log.login']")).Click();

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
        	// 체크박스를 체크하면 비밀번호가 보입니다(체크 해제 시 '*'로 표시).
            if (checkBox1.Checked == true)
            {
                textPass.PasswordChar = default(char);
            }
            else
            {
                textPass.PasswordChar = '*';
            }
        }

 

  • 네이버 스마트스토어  URL이 너무 길어서 필드영역 naverUrl에 대입했습니다.

  • 체크박스 이벤트를 통한 비밀번호 '*'로 보이기 해제(체크 시 해제)

  • Thread.Sleep()을 이용해 입력 딜레이 추가

 

 

 

 

 

 

 

참고 사이트(아래 클릭 시 링크로 이동)

- luckygg.tistory.com/224

- luckygg.tistory.com/225?category=884641

- nwairr.tistory.com/entry/

반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 대리자(Delegate)  (0) 2021.05.20
C# 속성(Property)  (0) 2021.05.20
C# 예외처리하기(Exception)  (0) 2021.05.19
C# 인터페이스(Interface)  (0) 2021.05.18
WPF UI 코딩 배우기1  (0) 2021.04.25

+ Recent posts