728x90

Object 형식

어떤 형식의 데이터라도 object에 담아 처리할 수 있다. (int, long, char, bool, string...)


ex) object a=123;    object b=3.14f;    object c = true;    object d = "hello";




나머지 연산자 %

실수에 나머지 연산자 % 를 쓰는 건 추천하지 않는다.

static void Main(string[] args)
        {
            Console.WriteLine(5.0 % 2.2);
        }

정수라면 실행 결과로 2를 출력하겠지만 여기서는 0.6을 출력한다.

5.0 - (2.2 * 2) = 0.6 



문자열

문자열은 다음과 같이 더할 수 있다.

하지만 문자 (한 글자)는 더할 수 없고, 문자를 숫자로 생각해 더하게 된다.


문자를 연결하고 싶다면 ' '로 감싸지말고 문자열을 뜻하는 " " 로 감싸야한다. 

static void Main(string[] args)
      {
          Console.WriteLine("가나다" + "라마" + '바');
          Console.WriteLine("안녕하세요" [0]);
          Console.WriteLine("안녕하세요" [2]);
      }

출력 결과 :

가나다라마바



숫자와 문자열을 더하면 자동으로 문자열로 형변환된다.

하지만 숫자와 '문자'를 더하면 아스키 코드값으로 출력된다.

static void Main(string[] args)
       {
           Console.WriteLine(2 + '3' + "4");
           Console.WriteLine(2 + '3' + '4');
       }

출력결과 :

534

105




다른 자료형을 bool로 변환

다음과 같은 경우 23번째 줄에서 에러를 출력한다.
Code Snippet
  1. static void Main(string[] args)
  2.         {
  3.             Console.WriteLine(bool.Parse("True"));
  4.             Console.WriteLine(bool.Parse("true"));
  5.             Console.WriteLine(bool.Parse("test"));
  6.         }


bool은 true, false 데이터를 다루며 1바이트 크기의 type이다. (1비트만으로 표현가능하지만 컴퓨터가 기본적으로 바이트 단위를 사용하므로)



오버플로우 확인하기

static void Main(string[] args)
        {
            int num = int.MaxValue;
            Console.WriteLine(num+1);
        }   

오버플로우를 일으키며 -2147483648 이라는 값을 출력한다.

다음과 같이 double로 형변환하면 해결 가능하다.

static void Main(string[] args)
       {
           int num = int.MaxValue;
           Console.WriteLine((double)num+1);
       }   

혹은 num을 선언할 때 unsigned 자료형으로 선언해 해결할 수도 있다.

uint num = int.MaxValue;




음수의 음수?


Code Snippet
  1. static void Main(string[] args)
  2.         {
  3.             Console.WriteLine(-(-1));
  4.             
  5.             int output = int.MinValue;
  6.             Console.WriteLine(-(output));
  7.             Console.WriteLine(-(-2147483648));
  8.         }


위 소스 25번째 줄에서 다음과 같은 오류를 일으킨다.


checked 모드에서 컴파일하면 작업이 오버플로됩니다.

25번째 줄을 주석처리하면 다음과 같은 결과가 출력된다.

출력결과 :
1
-2147483648


키 입력을 출력
static void Main(string[] args)
        {
            Console.ReadKey();
        }
위의 예제를 실행하면 사용자가 누른 키를 콘솔 화면에 표시한다.


ReadKey() 메서드는 ConsoleKeyInfo 객체를 받게 되고, 이 객체 내부의 KeyChar 속성을 통해 입력 키를 알아낸다.
public static ConsoleKeyInfo ReadKey();
public static ConsoleKeyInfo ReadKey(bool intercept);





지정된 크기의 배열 생성


값을 넣지않고 초기화하면 기본 값으로 공간이 채워진다. (숫자 자료형은 0, 문자열 자료형은 빈 문자열, 객체는 null로 초기화)

static void Main(string[] args)
       {
           int[] intArray = new int[100];
 
           Console.WriteLine(intArray[0+ "\n" + intArray[99]);
       }


배열 요소를 마지막 요소에서부터 출력

static void Main(string[] args)
        {
            int[] intArray = { 123456 };
 
            for (int i = intArray.Length - 1; i >= 0; i--)
                Console.Write(intArray[i] + " ");
        }

출력결과 : 6 5 4 3 2 1



List 클래스를 이용한 가변적인 크기의 배열 생성

List<> 에서 <>안에는 Generic으로 어떤 자료형인지를 미리 알려준다.

static void Main(string[] args)
       {
           Random random = new Random();
 
 
           List<int> list = new List<int>();
 
           for (int i = 0; i < 6; i++ )
               list.Add(random.Next(1100));
 
           for (int i = 0; i < list.Count; i++)
               Console.Write(list.ElementAt(i) + " ");
       }   


List활용예제

이름, 학점, 영어 입력받고 학점 4.0 이상이고 영어점수가 900점 이상인 리스트를 출력


C#에서 클래스는 앞글자 대문자, 변수명은 소문자를 쓴다. (절대 규칙은 아니지만 권장)


이외의 네이밍 규칙 http://zepeh.tistory.com/115


Code Snippet
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Collections;
  7.  
  8.  
  9. namespace SScore
  10. {
  11.     class Student
  12.     {
  13.         public string name;
  14.         public double grade;
  15.         public int eng;
  16.     }
  17.     class Program
  18.     {
  19.         static void Main(string[] args)
  20.         {
  21.             List<Student> list = new List<Student>();
  22.  
  23.             for (int i = 0; i < 3; i++)
  24.             {
  25.                 Student s = new Student();
  26.  
  27.                 Console.Write("이름:");
  28.                 s.name = Console.ReadLine();
  29.                 Console.Write("학점:");
  30.                 s.grade = double.Parse(Console.ReadLine());
  31.                 Console.Write("영어:");
  32.                 s.eng = int.Parse(Console.ReadLine());
  33.  
  34.                 list.Add(s);
  35.             }
  36.             for (int i = 0; i < list.Count; i++)
  37.             {
  38.                 if (list.ElementAt(i).grade < 4.0 || list.ElementAt(i).eng < 900)
  39.                     break;
  40.                    
  41.  
  42.                 Console.WriteLine(list.ElementAt(i).name + "," +
  43.                     list.ElementAt(i).grade + "," +
  44.                     list.ElementAt(i).eng);                
  45.             }
  46.         }
  47.     }
  48. }



Generic

제네릭은 클래스 자료형을 지정하는 기능이다.  형식 매개 변수 T를 사용 하고 선언할 때 Name<T>의 형태를 가진다. 
두 개 이상을 지정하려면 T, U와 같이 쓴다.

namespace Generic
{
    class Wanted<T, U>
    {
        public T value;
        public U value2;
 
        public Wanted(T value, U value2) 
        {
            this.value=value;
            this.value2 = value2;
        }
    }    
    class Program
    {
        static void Main(string[] args)
        {
            Wanted<stringint> StringAndInt = new Wanted<stringint>("String"32);
 
            Console.WriteLine(StringAndInt.value + "\n" + StringAndInt.value2);
        }
    }
제네릭의 가장 일반적인 사용은 컬레션 클래스를 만드는 것이지만, 클래스나 인터페이스, 메서드, 대리자에도 사용된다.


Indexer
인덱서를 이용하면 클래스나 구조체의 인스턴스를 배열처럼 인덱싱할 수 있다.
인덱서는 프로퍼티와 유사하지만 반드시 인스턴스 멤버로만 존재하여야 한다. (static 선언 불가)
class Sign
{
    public int this[int i]
    {
        get { return (-i); }
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        Sign sign = new Sign();
        Console.WriteLine(sign[15]);
    }
}

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

C# 인터페이스  (0) 2017.04.07
C# 클래스, 메소드  (0) 2017.04.04
headfirst c#-wpf  (0) 2016.11.19
5/27 업무일지 c#학생성적관리(콘솔)  (0) 2016.05.27
c# 클래스 복습2  (0) 2016.05.23

+ Recent posts