본문으로 바로가기

C# 복습 (1)

category 개발자과정준비/C# 2020. 7. 14. 10:10
반응형

강사님 강의 훑어보기

 

HW에 대해 다시 알아보기

 

밑이 있어야 가동된다

 OS에는 MAC, Windows, Linux등 많은 OS가 있는데 이러한 운영체제들은 HW가 있어야 돌아갈 수 있습니다. 원래는 OS만으로 사용하는데는 문제가 딱히 없었지만 스마트폰의 보급으로 APP의 중요성이 대두되었습니다.

 하지만 OS를 가동하는데 HW가 필요한 것처럼, APP을 가동하기위해서는 OS가 필요한데, OS는 여러가지 운영체제가 있어서 Windows에서 개발하던 App이 MAC에서는 돌아가지않는 현상이 발생했습니다. 그래서 이러한 현상을 해결할 수 있는 방법이 플랫폼의 등장이었습니다. 플랫폼의 가상머신을 도입하여 여러가지 OS가 있는것처럼 이식하는 개념으로 여러가지 운영체제에서 개발하던 App을 다른 운영체제에서도 가동되고, 개발할 수 있는 환경을 만들어주게 되었습니다.

가장 대표적인 예시는 Java이다

 

현재 개발 언어들의 현황

펌웨어 : 시스템의 효율을 높이기 위해 S/W를 H/W화 시킨 것으로, 하드웨어 장치에 포함된 S/W이다. 대부분의 H/W 장비에 내장되며 장비의 구동 및 제어를 위한 별도의 S/W이다.

 

 

 

어셈블리 : 조합하다

삼성자동차가 벤츠엔진을 본인의 자동차에 끼워넣은것처럼 이러한 엔진파트를 어셈블리라고한다

다른 사람이 개발한 것을 내가 들고오는것을 어셈블리라고 한다.

 

 

 

메모장으로만 하다보면 얼마나 VS가 편한지  

부산에서 서울까지 걸어가다보면 KTX가 편한것을 알 수 있다

// 프롤로그 시작
using System;    // 시스템 함수, 이것을 쓰겠다.(System.Console.write -> Console.Write로 쓰게해줌)
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200625_001   // 회사로따지면 부서 같은 곳, 개발하는 공간을 서로 독립적으로 쓰기위해서
// 프롤로그 끝
{
    class Program   //  클래스
    {
        static void Main(string[] args)      //  Main 메서드 & 엔트리 포인트
            //  Main  메서드의 인자/인수/매개변수 : 1개, 이름은 args
        {
            Console.WriteLine("지옥으로 키티");
            Console.WriteLine(args[0]);
            Console.WriteLine(args[1]);    // 이대로 출력하면 오류가 뜨지만 속성, 디버그, 시작 옵션에 입력하면 출력된다
            //C:\Users\admin\source\repos\20200625\bin\Debug의 cmd창에서 .exe파일 이름을 복사해서 실행하면된다
        }
    }
}

그래도 실행하면 배열 구문에서 오류가 뜨는 것을 볼 수 있다

 

 

 

오류가 떴을때 조금의 설정만해주면 운영체제가 알아서 번역해서 실행해준다. VS에서 설정해보자

솔루션 탐색기에서 우클릭 -> 속성 -> 디버그 -> 시작 옵션에서 테스트1 테스트2를 입력
위의 시작옵션에서 입력한 값이 결과값으로 출력되었다

 

 

 

cmd창에서 화면이름, args[0]값, args[1]값  을 입력해주면 결과값이 출력된다

 

 

 

 

 

왜 이런 엔디안을 쓰냐?

보통 제일 번지가 제일 작은 수를 인식해서 연산을 수행한다.

리틀 엔디안은 연산에 강하다(덧셈할때 앞자리부터하면 불편하니까)

빅 엔디안은 대소 비교가 빠르다(딱 앞자리만 보면되니까)

 

 

참과 거짓 boolean형 

타입이름 : bool  -> true랑 false 저장

// 프롤로그 시작
using System;    // 시스템 함수, 이것을 쓰겠다.(System.Console.write -> Console.Write로 쓰게해줌)
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200625_001   // 네임스페이스 : 회사로따지면 부서 같은 곳, 개발하는 공간을 서로 독립적으로 쓰기위해서
// 프롤로그 끝
{
    enum Week
    {
        Mon = 100,
        Tue,
        Wed,
        Thu = 200,
        Fri,
        Sat,
        Sun
    }
    class Program   //  클래스
    {
        static void Main(string[] args)      //  Main 메서드 & 엔트리 포인트
            //  Main  메서드의 인자/인수/매개변수 : 1개, 이름은 args
        {
            //string inValue = Console.ReadLine();
            //Console.WriteLine("{0}\n\n", inValue);  // inValue 변수로 문자열을 입력 받아서 출력하는 소스

            //Console.WriteLine("{0:C}\n", 100); // Currency 타입 : 통화표시를 함께 사용
            //Console.WriteLine("{0:D}\n", 00001024); // Decimal 타입 : 10진수로 출력
            //Console.WriteLine("{0:E}\n", 100); //Scientific : 과학적 지수, 지수형태로 출력
            //Console.WriteLine("{0:F}\n", 100);  // Fixed Point(고정 소숫점) : 소수점 자리수를 정해서 표현
            //Console.WriteLine("{0:G}\n", 10000); // General :  정수형이나 소수를 일반적으로 포현
            //Console.WriteLine("{0:N}\n", 100000); // Number타입 : ' , '가 나타나게 표현
            //Console.WriteLine("{0:X}\n", 100);  // Hexadecimal : 16 진수로 표현



            //int iNumber = 0x12345678;
            //Console.WriteLine(iNumber);


            //float fNumber = 41.625f;
            //Console.WriteLine("{0}\n", fNumber);


            Week GoodDay;
            Week Today;

            GoodDay = Week.Fri;   // Week안에있는 Fri (.으로 찾아준다)
            Today = Week.Thu;

            Console.WriteLine("GoodDay = {0}", GoodDay);
            Console.WriteLine("Today = {0}", Today);

            Console.WriteLine("GoodDay Index = {0}", (int)GoodDay);   // int형으로 변환하니까 숫자가 출력된다?
            Console.WriteLine("Today   Index = {0}", (int)Today);
            Console.WriteLine("Index = {0}", (int)Week.Mon);  // 100으로 시작해도 1씩 증가한다
            Console.WriteLine("Index = {0}", (int)Week.Tue);
            Console.WriteLine("Index = {0}", (int)Week.Wed);
            Console.WriteLine("Index = {0}", (int)Week.Thu);  // 중간에 200을 넣어도 200부터 1씩증가
            Console.WriteLine("Index = {0}", (int)Week.Fri);
            Console.WriteLine("Index = {0}", (int)Week.Sat);
            Console.WriteLine("Index = {0}", (int)Week.Sun);
        }
    }
}

 

 

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

namespace _20200625_002
{
    struct Book  // 얘는 클래스보다는 떨어지지만 값이어서 New없이 쓸 수 있다.
    {
        public string Name;   // 기본적으로는 private가 적용되기때문에 public를 해주면 다른 메서드에도 쓸 수 있다
        public int Price;

        static Book()   // 스태틱이기때문에 한번만 호출되었다
        {
            Console.WriteLine("생성자 호출 됬냐?");
        }
        public void test()
        {
            Console.WriteLine("북 메서드 되냐?");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main 시작");
            Book aBook;
            aBook.Name = "test";
            aBook.Price = 100;
            aBook.test();

            Book aBook2;
            aBook2.Name = "test";
            aBook2.Price = 100;
            aBook2.test();
        }
    }
}

 

 

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

namespace _20200626
{
    class Program
    {
        static void Main(string[] args)
        {
            double radius = 3.14;
            Console.WriteLine("radius의 형 : {0}", radius.GetType());  // 
            Console.WriteLine("radius의 값 : {0}", radius.ToString()); // 아스키코드로 바꿔서 출력
            Console.WriteLine();
            //WriteLine 자체가 자동으로 Tostring으로 바꿔서 출력해주는것임
            // \n, Line은 엔터의 효과를 가지고있다(개행)
            
            string name = "이효리";

            Console.WriteLine("name 형 : {0}", name.GetType());
            Console.WriteLine("name 값 : {0}", name.ToString());
            Console.WriteLine();

            Console.WriteLine("raduus == name : {0}", name.Equals(radius));  // 서로 동일한 Type인지 확인하는 Equals
            //기본형의 기본적으로가지는것은 GetType, ToString, Equals가 있다를 기억하자
            
            /*
             자바는 기본타입과 객체타입이 존재하는데
            기본타입에 int가 따로있고 객체에 Integer라고 따로있다.
            예를들어 
            int A;    
            A.      // . 을 찍어도 아무것도 뜨지않는데
            위의 예제에서 
            radius. // .을 찍으면 뭔가 뜨는 것을 확인할 수 있다
             */
        }
    }
}

예제 실행 화면

 

바로 밑으로 내려가는것을 LF, 엔터효과가 나는것을 CR

 

암시적(implicit)형 변환

 직접 캐스팅하지 않고도 형(Type)의 변화가 일어나며 데이터형의 호환성, 사이즈 등이 적절할 때 가능하다.

 범위가 작은 타입에서 그 값을 충분히 담을 수 있는 큰 타입으로 형변환 하는 것은 컴파일러가 '암시적 형변환'으로 간주해서 오류 없이 컴파일 과정을 완료할 수 있다. 하지만 반대로 큰 값을 작은 타입으로 대입하는 경우에는 암시적 형 변환이 불가능하다.(24평 사는 사람이 40평가도 불편함이 없지만, 7평으로가면 불편함을 느낄 수 있는 것처럼)

int intValue = 127;
long longValue = intValue;
Console.WriteLine("longValue = {0}", longValue);   // 암시적 형변환

암시적 형변환 예제 실행 화면

 

 

명시적(Explicit)형 변환

 int에서 char로 형변환은 할 수 없다고 에러와 함께 컴파일을 중단한다. 왜냐면 char는 문자만 담도록 지정된 형식이라고 약속되어있기 때문이다. 그래서 '개발자가 의도한 형변환' 이었음을 컴파일러에게 알려야할때 '명시적 형변환'이라는 의미로 밑의 예제처럼 괄호로 지정해서 구문을 작성한다. 이 밖에도 큰 데이터 타입에서 작은 데이터 타입으로 형변환할때도 '명시적 변환'을 사용해야만 한다.(컴파일러는 '좁아 터지는데 굳이 해야하나?' 싶을때 프로그래머가 '내가 책임질테니 일단 해라.'  라는 느낌)

long longValue2 = 32767;
int intValue2 = (int)longValue2;
Console.WriteLine("longValue2 = {0}\n", longValue2);

명시적 형변환 예제 실행 화면

 

 4바이트 타입의 int 형에서 2바이트 타입의 short 형으로 값을 대입하면 -32,768 ~ 32,767 범위의 값은 정상적으로 변환할 수 있지만 그 범위를 넘어버리면 개발자가 의도한 값이 나오지 않는다. 이런 상황에서 '암시적 형변환'이 가능하다면 무심코 사용한 형변환 코드 탓에 자칫 오류가 발생하는 프로그램을 만들 수도 있으므로 C# 컴파일러는 이런 경우 반드시 '명시적 변환'을 하도록 강제하고 있다.

 

 

 

 

단항 연산자

!뒤에는 bool형만 와야한다

~(틸드)

int aint = 0xffff;
Console.WriteLine("{0:X8}", aint);
aint = ~aint;
Console.WriteLine("{0:X8}", aint);
int aint = 0x12345678;
Console.WriteLine("{0:X8}", aint);
aint = ~aint;
Console.WriteLine("{0:X8}", aint);

~(틸드)의 예제 실행 화면

 계산기의 not은 비트단위를 반대(1을 0으로, 0을 1로)로 바꿔준다. -> 계산기의 NOT버튼이 ~(틸드)역할을 해준다. 한 비트에 있는 숫자를 반대로 바꿔준다.(반전, reverse시켜준다)

 

 !는 bool형을 반대로 바꿔주지만, ~는 한 비트 단위로 원래있는 숫자를 반대로 바꿔준다.

 

 

 

산술 연산자

컴퓨터한테는 5칙연산이 존재한다.

정수를 나눌때 몫, 나머지를 구하는 연산자(/, %)로 나눗셈이 2개로 나뉘어지기 때문.

참고로 실수 나누기는 4칙연산임

 

 

int aint = 0x12345678;
Console.WriteLine("{0:X8}", aint);  // 8자리수만큼 출력
aint = ~aint;
Console.WriteLine("{0:X8}", aint);
aint = aint >> 4;
Console.WriteLine("{0:X8}", aint);  // 끝에 7이 있었는데 절벽에 떨어져서 없어짐, 빈칸은 양수일때 0을 채움
aint = aint << 4;
Console.WriteLine("{0:X8}", aint); // 왼쪽은 이 숫자가 음수니까 1로채우는데 가득 찬 1은 F니까 F로 채워진다

 

 

int aint = 0x12345678;
Console.WriteLine("{0:X8}", aint);  // 8자리수만큼 출력
//aint = ~aint;
//Console.WriteLine("{0:X8}", aint);
aint = aint >> 4;
Console.WriteLine("{0:X8}", aint);  
aint = aint << 4;
Console.WriteLine("{0:X8}", aint);
// ~aint를 숫자 자체가 양수니까 4칸씩 이동해보면 왼쪽, 오른쪽 끝에 0이 오는 것을 볼 수 있다

 

 

 

형 동등성 원칙

3 + 4는 int + int라서 별로 상관이 없지만, 3 + 4.1은 int + double이기때문에 잠시 double + double로 잠시 형변환이 일어난 다음에 결과값인 7.1이 double형으로 출력된다.

 

 

관계연산자는 bool의 결과를 출력한다.

 

byte abyte1 = 0x3F;
byte abyte2 = 0xC1;
Console.WriteLine("{0:X2}", abyte1 & abyte2);  // and연산자,  
Console.WriteLine("{0:X2}", abyte1 | abyte2);  // or 연산자,
Console.WriteLine("{0:X2}", abyte1 ^ abyte2);  // Xor연산자, 
// X2는 최소 두자리수 출력하라는 뜻, 2자리를 넘어가도 출력은됨, 1자리면 빈자리에 0을 출력

비트 연산자 예제 실행 화면

 

조건연산자

 

A ? B : C   삼항 연산자

A가 참이면 B가 선택, 거짓이면 C가 선택된다\

bool abool = !true;
Console.WriteLine("abool의 상태는 ★" + (abool ? "참":"거짓") + "★ 일껄요?");

 

 

 

 

 

 

 

 

제어문은 위에서부터 밑으로 순차적으로 흐르는 흐름을 제어하는 것임

if ~ else 문

if문은 조건식에 따라 각각에 해당하는 명령문을 실행한다. if문은 항상 bool타입만 들어갈 수 있다.

if( 조건문1 && 조건문 2) 일때, 조건문1과 조건문2는 항상 bool형(True, False)로 결과가 나와야한다.

 

if(조건식) 

명령문1 : // 조건식이 참일 때 실행

else

명령문2 : // 조건식이 거짓일 때 실행

 

 

 

 

 

 

int iNum = 100;
if (iNum < 500)
{
    Console.WriteLine("iNum은 500보다 작습니다.");
}
else
{
    Console.WriteLine("iNum은 500보다 큽니다.");
}

위의 if문의 순서도

 

 

다중 if문

	    int ipoint = 77;
            string result;
            if (ipoint >= 0 && ipoint <= 100)
            {
                if (ipoint > 50)
                { 
                    result = "Pass"; 
                }
                else 
                { 
                    result = "Fail";
                }
                    
                Console.WriteLine("결과 : " + result);
            }
            else
            {
                Console.WriteLine("에러 : 범위를 벗어났습니다.");
            }
            // if문은 항상 bool형으로 들어간다는 것에 주목해보자

다중 if문 예제 실행 화면

 

C#에서는 if(A = 100)을 넣어서 ( )안에 정수형이 있으면 컴파일러가 오류가 뜨는 것을 확인할 수 있는데,

C에서는 bool형도 정수형으로 판별하기때문에 컴파일 오류가 뜨지는 않는다. 이게 나중에는 프로그래머가 발견할 수 없는 오류가될 수도 있는데, 이걸 나름 방지하기 위해서 if(100 = A)로 넣어보는 것을 생각해보자.

 

 

 

 

 

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

namespace _20200629
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("당신의 점수를 입력하세요 : ");
            int point = int.Parse(Console.ReadLine());;
            string result;
            if (point > 90)
            {
                result = "A";
            }
            else if (point > 80)
            {
                result = "B";
            }
            else if (point > 70)
            {
                result = "C";
            }
            else if (point > 60)
            {
                result = "D";
            }
            else
            {
                result = "F";
            }
            Console.WriteLine("\n당신의 점수는 {0}입니다.", point);
            Console.WriteLine("그리고 학점은 {0}입니다.", result);
        }
    }
}

if문 예제 실행 화면

대입연산자 =의 왼쪽에는 항상 변수가 와야한다.

=을 사용할때 2항을 사용하는데, 이때 변수 타입이 같아야한다.(point = 82; 를 예로, point는 int형, 82도 int형)

4 = 3; 을 코드로치면 4는 변수가아니고 상수이기때문에 에러가뜨며, L-Value Error라고함.

참고로 오른쪽에 에러가 뜨면 R-Value Error라고한다.

 

if( )문에서 ( )에는 항상 bool형이 들어가야한다.

>도 이항연산자이므로 항이 2개 필요하다, 두개 다 타입이 같아야한다.

 

 

문자와 문자열의 차이

'A'를 치면 문자 : A의 아스키코드를 가져와라. 라는 뜻

유니코드는 65536, 아스키는 256 만큼 저장이 가능하다

0065 로 저장되기때문에 2byte가 된다.

 

"A"처럼 " " 를 치면 문자열

끝에 Null이 들어가있는 형태로써 0065 0000 가 저장되서 4byte가 된다.

 

아무것도 없이 A만 치게되면 변수로 취급한다.

 

예외적으로 C에서는 'AB'도 컴파일이 된다(원래 ' '안에는 한글자만 써야한다)

"AB"를치면 A아스키코드 0065,  B아스키코드 0066, + Null이 입력된다

( 0065 0066 0000 )

 

 

 

공장자동매칭시스템
가상의 공장 DB를 만든 다음에 내가 원하는 제품 데이터를(옷으로 따지면 수치나 원단) 입력하면 제일 효율적이게 제품을 생산할 수 있는 공장을 매칭시켜줘서 사용자가 공장을 선택하는 시스템.

 

오류검출프로그램

공장이 가동하고있다는 가정하에 오류라는 랜덤수를 줬을때 해당되는 오류를 감지하여 알려주는 프로그램 

    int igrade= 82;

            switch (igrade / 10)
            {
                case 9:
                    Console.WriteLine("당신의 점수는 A입니다.");
                    break;
                case 8:
                    Console.WriteLine("당신의 점수는 B입니다.");
                    break;
                case 7:
                    Console.WriteLine("당신의 점수는 C입니다.");
                    break;
                case 6:
                    Console.WriteLine("당신의 점수는 D입니다.");
                    break;
                case 5:
                    Console.WriteLine("당신의 점수는 F입니다.");
                    break;
                default:
                    Console.WriteLine("정수 값을 입력하세요");
                    break;
            }

switch문 예제 실행 화면

 

switch case문은 범위를 특정할 수 없고 딱 1가지 값만 1:1대응되는것만 할 수 있다는 것에 if문과의 차이점이 있다.

 

 

반복문

막노동 코드를 쭈욱 만드는데 줄이기위해 나온 것이 바로 반복문이다.

반복할 구간을 { } 로 준다. for, while, do-while, foreach문 등등이 있다.(foreach는 C/C++에는 없다)

+ 조건을 주는데 if문의 bool형과 같다.

for문과 while문은 왔다갔다가 가능하다.(상황에따라 깔끔한 코드를 쓰는게 좋음)

 

 

for( A; B; C) 중에 A, B, C를 생략해도 굳이 컴파일은 할 수 있지만, B가없으면 무한루프가 돌고 굳이 생략해서 if문처럼 조건을 줄 수 있는 구문이 있으면 같은 값으로 출력할수는 있다.

int A=0;
for(; ; )
{
if (A > 10)
{
  break;
}
  Console.WriteLine("{0}", A++);
}
for(int A=0; A<10; A++)
      {
          Console.WriteLine("{0}", A);
      }

for문의 ( ) 값을 생략했을때 (좌), for문의 ( )값을 다 입력해줬을때(우)

 

int A; 라고쓰면 A라는 int형의 방이 만들어져있는데

int[] iArray;  는 iArray방은 만들어지는데 int형의 배열 가리킬 수 있는 친구가된다.

 

 

C#과 Java는 배열 객체인데 항상 new를 사용해야한다.

int[] iArray = new int[5];   // 배열 모양 생성 = 배열 int 객체 방 5개 생성 // =를 통해 iArray   // 자바랑 동일한 개념임 
            //// 왼쪽을 참조(reference)라고함. 
            iArray[0] = 0;
            iArray[1] = 1;
            iArray[2] = 2;
            iArray[3] = 3;
            iArray[4] = 4;
            // 이렇게 한개씩 넣어야함

또는

int[] iArray;
iArray = new int[5] { 0, 1, 2, 3, 4 };
//참고로 C는 int iArray[5] 로 끝임, iArray라는 5개의 방이 생김.

//iArray = { 0,1,2,3,4}   // 참고로 이 구문처럼 한꺼번에 넣을수는 없다

 

            for(int i = 0; i<iArray.Length; ++i)
            {
                Console.WriteLine(iArray[i]);
            }
            Console.WriteLine();
//===========================================================
            foreach (int i in iArray)
            {
                Console.WriteLine(iArray[i]);
            }

배열 생성, for문과 foreach문으로 출력했을때 예제 실행 화면

 

 

continue는 현재 위치로부터 이하는 안하고 바로 위로가겠다는 뜻

break는 현재 위치에서 종료시키겠다는 뜻

 

두 와일에서 컨티뉴만나면 바로 밑으로간다.

for(int i=0; i < 10; i++)
            {
                if (i % 2 == 1)
                {
                    continue;
                }
                Console.WriteLine("{0}", i);
            }
            Console.WriteLine();

for(int i=0; i < 10; i++)
            {
                if (i % 2 == 1)
                {
                    break;
                }
                Console.WriteLine("{0}", i);
            }
            Console.WriteLine();

 

 

 

 

 

try catch문

            int a, b;
            float c = 0;
            Console.Write("첫번째 정수를 입력하세요 : ");
            a = int.Parse(Console.ReadLine());
            Console.Write("두번째 정수를 입력하세요 : ");
            b = int.Parse(Console.ReadLine());

            try
            {
                c = a / b;
            }

            catch (Exception)
            {
                Console.WriteLine("변수의 값이 올바르지 않습니다.");
                Environment.Exit(0);
            }
            finally
            {
                Console.WriteLine("\n프로그램이 실행 되었습니다.");
            }

            Console.WriteLine("A/B값은 {0} 입니다.", c);

정수를 올바르게 입력했을때의 실행 화면
0으로 나누려고하니까 catch가 잡는다
숫자가아니라 문자를 넣으면 예외처리를 하지않았다는 값이 뜬다

 

try구간은 여기서 에러가 발생하는지를 찾겠다는 뜻임, 실행될때 만들어지는 에러를 감지하는 것(의심가는 코드는 try에 적어놓을 필요가 있다)

catch try구간에서 에러가 발생했을때 catch로 점프한다. 

finally try구간에서 에러가 발생안했을때 catch를 건너뛰고 finally로 들어간다.

 

try문과 catch는 항상 같이 있어야한다. finally는 생략가능하다.

 

Parse는 해석하는 것을 말한다. int형으로 바꾸는 메서드를 int.Parse이라고함.

Console.ReadLine()로 입력받은 글자를 int형으로 바꿔준다.

반응형