반응형

클래스와 객체

C#의 모든 것은 해당 속성 및 메서드와 함께 클래스 및 객체와 연결된다.

자동차를 예를 들어보자. 자동차는 클래스와 같다. 무게, 색상, 브랜드 등과 같은 것을 속성, 구동 및 브레이크와 같은 것들을 메서드라고 비유할 수 있다. 폭스바겐 자동차를 만들고 싶다면 자동차 클래스의 속성과 메서드를 사용하여 만들 수 있다. 이때 만들어진 폭스바겐 자동차가 객체다.

다음은 필수는 아니지만 알아두면 도움 될만한 내용이다.

  1. C# 파일과 클래스 이름을 동일하게 가져가는 경우가 많다. 코드를 체계적으로 정리하기 위함이다.
  2. 클래스 이름을 지정할 때 첫 글자는 대문자로 한다.
  3. 변수가 클래스 내에서 직접 선언되면 이를 ‘필드(field)’ 또는 ‘속성(attribute)’라고 한다.

객체 만들기

예시:

class Car // 자동차 클래스
{
  string color = "red"; // 필드

  static void Main(string[] args)
  {
    Car myObj = new Car(); // myObj라는 객체 생성
    Console.WriteLine(myObj.color);
  }
}

클래스(myObj.color) 내의 변수/필드에 접근하려면 점 구문(.)을 사용한다.

다중 객체

예시:

class Car
{
  string color = "red";
  static void Main(string[] args)
  {
    Car myObj1 = new Car();
    Car myObj2 = new Car();
    Console.WriteLine(myObj1.color);
    Console.WriteLine(myObj2.color);
  }
}

한 클래스에 여러 객체를 만드는 것도 가능하다.

여러 클래스 사용1

클래스의 객체를 생성하고 다른 클래스에서 접근할 수도 있다. 이는 더 나은 클래스 구성을 위해 자주 사용된다고 한다.

Car.cs

class Car
{
  public string color = "red"; // 접근제한자 public 사용
}

Program.cs

class Program
{
  static void Main(string[] args)
  {
    Car myObj = new Car();
    Console.WriteLine(myObj.color);
  }
}

Car.cs스크립트를 살펴보면 string앞에 public이라는 키워드가 사용되었다. 이 키워드는 다른 클래스에서의 접근을 허락한다. 이를 접근 제한자 또는 접근 한정자라고 부르는데, public이 외에도 private, protected 등이 있다.

클래스 멤버

앞서 클래스 내에서 선언된 변수를 필드 또는 속성이라고 부른다고 하였다. 클래스 멤버는 클래스 내에 있는 필드 또는 메서드들을 뜻하는 말이다.

예시:

class MyClass
{
  // 클래스 멤버
  string color = "red";        // 필드
  int maxSpeed = 200;          // 필드
  public void fullThrottle()   // 메소드
  {
    Console.WriteLine("The car is going as fast as it can!");
  }
}

필드를 비워 두고 객체를 생성할 때 수정할 수도 있다. 이는 한 클래스에서 여러 객체를 사용할 때 특히 유용하다.

예시:

class Car // Car클래스
{
    // 클래스 멤버
  string model; // 비어 있는 상태로 선언된 필드
  string color;
  int year;

  static void Main(string[] args)
  {
    Car Ford = new Car(); // Car클래스에서 Ford 객체 생성
    Ford.model = "Mustang"; 
    Ford.color = "red";
    Ford.year = 1969;

    Car Opel = new Car(); // Car클래스에서 Opel 객체 생성
    Opel.model = "Astra";
    Opel.color = "white";
    Opel.year = 2005;

    Console.WriteLine(Ford.model);
    Console.WriteLine(Opel.model);
  }
}

프로그램에서 사용되는 데이터는 실행될 때 컴퓨터 메모리(RAM)에 저장 공간을 할당받는다. 클래스에 객체가 만들어질 때도 각각의 객체마다 별도로 저장 공간을 할당 받는다.

즉, Ford.model = “Mustang”;이라는 코드가 실행되면 Ford라는 객체의 modelMustang이라는 값이 저장되는 것이지 Car 클래스의 model 필드에 Mustang이라는 값이 저장되지 않는다.

ps. 단 클래스를 정의하는 것만으로는 저장공간이 할당되지 않는다고 한다.

객체 메서드

메서드는 일반적으로 클래스에 속하며, 객체의 동작 방식을 정의한다. 필드와 마찬가지로 점 구문(.)을 사용하여 메서드에 접근 할 수 있다. 그리고 메서드를 호출할 때는 이름 뒤에 두 개의 괄호()와 세미콜론을 사용한다.

예시:

class Car
{
  string color;                 // field
  int maxSpeed;                 // field
  public void fullThrottle()    // method, public 접근 제한자를 사용했다는 점에 유의하자.
  {
    Console.WriteLine("The car is going as fast as it can!");
  }

  static void Main(string[] args)
  {
    Car myObj = new Car();
    myObj.fullThrottle();  // Call the method
  }
}

앞의 예시에서 fullThrottle 메소드 앞에 public 키워드가 붙었다. 그 이유는 public(공개) 메소드는 객체를 생성한 후에만 호출이 가능하고, 객체의 상태를 변경하거나 기능을 실행할 수 있다.

ps.static(정적) 메서드의 경우에는 클래스의 객체를 만들지 않고도 접근할 수 있지만, 클래스의 필드에 직접 접근하여 값을 수정할 수 없다.

반응형
반응형

반복문(Loop)

While문

루프는 지정된 조건에 도달하는 한 코드 블록을 실행할 수 있다.

지정된 조건이 True인 동안 코드블록을 반복 실행한다.

 

주의 할 점은 조건 안의 변수값을 증가시켜야 한다.

그렇지 않으면 무한 루프에 빠진다.

 

예시:

int i = 0;
while (i < 5)
{
  Console.WriteLine(i);
  i++;
}

Do/While문

do/while 루프는 while 루프의 변형이다.

이 루프는 조건이 true인지 확인하기 전에 코드 블록을 한 번 실행한 다음 조건이 true인 동안 루프를 반복한다.

조건이 거짓이더라도 코드가 한 번은 실행된다.

 

예시:

int i = 0;
do
{
  Console.WriteLine(i);
  i++;
}
while (i < 5);

For문

코드 블록을 반복하려는 횟수를 정확히 알고 있으면 while 루프 대신 for 루프를 사용한다.

예시:

for (statement 1; statement 2; statement 3)
{
// code block to be executed}

Statement 1 코드 블록이 실행되기 전에 (한 번) 실행됩니다.

Statement 2 코드 블록 실행 조건을 정의합니다.

Statement 3 코드 블록이 실행된 후에 (매번) 실행됩니다.

  • 중첩루프

루프를 다른 루프 안에 배치하는 것도 가능하다.

이것을 중첩 루프라고 한다.

"내부 루프"는 "외부 루프"가 반복될 때마다 한 번씩 실행된다.

 

예시:

// Outer loop
for (int i = 1; i <= 2; ++i)
{
  Console.WriteLine("Outer: " + i);  // Executes 2 times

  // Inner loop
  for (int j = 1; j <= 3; j++)
  {
    Console.WriteLine(" Inner: " + j); // Executes 6 times (2 * 3)
  }
}

// Outer: 1
//  Inner: 1
//  Inner: 2
//  Inner: 3
// Outer: 2
//  Inner: 1
//  Inner: 2
//  Inner: 3

Foreach문

배열의 요소를 반복하는 데만 사용되는 foreach 루프도 있다.

예시:

foreach (type variableName in arrayName)
{
// code block to be executed}
}

// 구체적인 예시

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
foreach (string i in cars) 
{
  Console.WriteLine(i);
}

// Volvo
// BMW
// Ford
// Mazda

Break / Continue

  1. Break : switch문에서 사용되기도 하고, 반복문에서 벗어날 때 사용하기도 한다.
  2. Continue : 지정된 조건이 발생할 경우 반복을 건너뛰고, 다음 루프로 넘어간다.

Break문 예시:

int i = 0;
while (i < 10)
{
  Console.WriteLine(i);
  i++;
  if (i == 4)
  {
    break;
  }
}

// 0
// 1
// 2
// 3

Continue문 예시:

int i = 0;
while (i < 10)
{
  if (i == 4)
  {
    i++;
    continue;
  }
  Console.WriteLine(i);
  i++;
}

// 0
// 1
// 2
// 3
// 5
// 6
// 7
// 8
// 9

배열 (Array)

배열은 각 값에 대해 별도의 변수를 선언하는 대신 단일 변수타입에 여러 값을 저장하는 데 사용

// 빈 배열 선언

string[] cars;

// 값이 삽입된 배열 선언

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"}; // 문자열
int[] myNum = {10, 20, 30, 40}; // 정수

인덱스 번호를 참조하여 배열 요소에 액세스 할 수 있다.

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
Console.WriteLine(cars[0]);

// Volvo

배열 요소 바꾸기:

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
cars[0] = "Opel";
Console.WriteLine(cars[0]);

// Opel

배열 길이 구하기:

string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
Console.WriteLine(cars.Length);

// 4

배열을 선언하는 여러가지 방법:

// 배열의 크기만 생성
string[] cars = new string[4];

// 배열의 크기와 함께 값을 할당
string[] cars = new string[4] {"Volvo", "BMW", "Ford", "Mazda"};

// 배열의 크기는 지정하지 않고, 값만 할당
string[] cars = new string[] {"Volvo", "BMW", "Ford", "Mazda"};

// 배열의 크기는 지정하지 않고, 값만 할당
string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

배열을 선언하고 나중에 초기화하는 경우 new 키워드를 사용해야 한다.

배열을 초기화한다는 것은 배열에 처음으로 값을 할당하는 과정을 의미한다.

new 키워드를 사용하는 경우 기존의 배열은 사라지고, 새로운 배열이 할당된다.

배열의 정렬

배열은 알파벳순이나 오름차순으로 정렬하는 Sort()와 같은 다양한 배열 메서드를 사용하여 정렬할 수 있다.

  1. Sort()
// Sort a string
string[] cars = {"Volvo", "BMW", "Ford", "Mazda"};
Array.Sort(cars);
foreach (string i in cars)
{
  Console.WriteLine(i);
}

// Sort an int
int[] myNumbers = {5, 1, 8, 9};
Array.Sort(myNumbers);
foreach (int i in myNumbers)
{
  Console.WriteLine(i);
}
  1. System.Linq

Min, Max 및 Sum과 같은 다른 유용한 배열 메서드는 System.Linq 네임스페이스에 있다.

using System;
using System.Linq;

namespace MyApplication
{
  class Program
  {
    static void Main(string[] args)
    {
      int[] myNumbers = {5, 1, 8, 9};
      Console.WriteLine(myNumbers.Max());  // returns the largest value
      Console.WriteLine(myNumbers.Min());  // returns the smallest value
      Console.WriteLine(myNumbers.Sum());  // returns the sum of elements
    }
  }
}

다차원 배열

  1. 2차원 배열

2D 배열을 만들려면 자체 중괄호 세트 내에 각 배열을 추가하고 대괄호 안에 쉼표(,)를 삽입한다.

예시:

int[,] numbers = { {1, 4, 2}, {3, 6, 8} };

단일 쉼표 [,]는 배열이 2차원임을 지정한다.

3차원 배열에는 int[,,]라는 두 개의 쉼표가 있다.

배열을 행과 열이 있는 테이블로 생각하면 쉽다.

출처 : w3school

  1. 2차원 배열에 엑세스하는 방법

예시:

int[,] numbers = { {1, 4, 2}, {3, 6, 8} };
Console.WriteLine(numbers[0, 2]);  // Outputs 2

배열 인덱스는 0부터 시작한다. [0]이 첫 번째 요소이다.

 

배열의 요소 변경:

int[,] numbers = { {1, 4, 2}, {3, 6, 8} };
numbers[0, 0] = 5;  // Change value to 5
Console.WriteLine(numbers[0, 0]); // Outputs 5 instead of 1

2차원 배열의 루프:

// Using foreach

int[,] numbers = { {1, 4, 2}, {3, 6, 8} };

foreach (int i in numbers)
{
  Console.WriteLine(i);
}

// Using for
int[,] numbers = { {1, 4, 2}, {3, 6, 8} };

for (int i = 0; i < numbers.GetLength(0); i++) 
{ 
  for (int j = 0; j < numbers.GetLength(1); j++) 
  { 
    Console.WriteLine(numbers[i, j]); 
  } 
}  

메소드

메소드는 호출될 때만 실행되는 코드 블록이다.

매개변수라고 하는 데이터를 메서드에 전달할 수 있다.

메소드는 특정 작업을 수행하는 데 사용되며 함수라고도 한다.

 

메소드를 사용하는 이유는 코드의 가독성을 높이고,

반복되는 코드를 재사용하기 위함이다.

 

C#에서는 메서드 이름을 대문자로 시작하는 것이 권장된다.

예시:

class Program // 클래스 이름
{
  static void MyMethod() 
  {
    // code to be executed
  }
}
반응형
반응형

C# 문자열

문자열은 일련의 문자로 구성되며, 각 문자는 0부터 시작하는 인덱스 값으로 참조할 수 있다.

예를 들어, "Hello"라는 문자열이 있다면 'H'는 인덱스 0, 'e'는 인덱스 1과 같은 방식이다.

 

또한, C#에서는 IndexOfSubstring이라는 두 가지 유용한 문자열 메소드를 제공한다.

IndexOf 메소드는 특정 문자나 문자열이 처음으로 출현하는 인덱스를 반환한다.

만약 해당 문자나 문자열이 존재하지 않는다면 -1을 반환한다. 아래 예시를 살펴보자.

 

예시:

string str = "Hello World";
int index = str.IndexOf('W'); // index는 6이 됩니다.

Substring 메소드는 문자열의 특정 부분을 추출하는 데 사용된다.

이 메소드는 두 가지 형태가 있다. 하나는 시작 인덱스만 지정하는 것이고,

다른 하나는 시작 인덱스와 길이를 모두 지정하는 것이다.

 

예시:

string str = "Hello World";
string sub = str.Substring(6); // sub는 "World"가 된다.
string sub2 = str.Substring(0, 5); // sub2는 "Hello"가 된다.

이러한 메소드들은 문자열을 다루는 데 있어 매우 중요하므로 잘 기억해두는 것이 좋다.

C# If 문

C#에서 if문은 주어진 조건이 참인 경우에만 코드 블록을 실행한다.
그런데 여러 조건을 확인해야 할 경우에는 if, else if, else 구조를 사용한다.


이 구조에서 if 문 다음에 오는 else if 문은 이전의 ifelse if 문의 조건이 거짓일 때만 확인된다.
그리고 else 문은 앞선 모든 조건이 거짓일 경우에 실행된다.

if (condition1)
{
    // 조건1이 참일 때 실행
}
else if (condition2)
{
    // 조건1이 거짓이고, 조건2가 참일 때 실행
}
else
{
    // 모든 조건이 거짓일 때 실행
}

또한 C#에서는 삼항 연산자를 사용하여 if-else 문을 간단하게 표현할 수 있다.
삼항 연산자는 "조건 ? 값1 : 값2"와 같은 형태로, 조건이 참일 경우 값1을, 거짓일 경우 값2를 반환한다.

var result = (condition) ? "참일 때의 값" : "거짓일 때의 값";

C# Switch문 정리

  • switch 문의 작동 원리: 주어진 조건에 따라 여러 코드 블록 중 하나를 실행.
  • break 키워드: switch 블록에서 더 이상의 코드 실행이나 케이스 테스트를 중단.
  • default 키워드: 모든 케이스와 일치하지 않을 때 실행될 코드를 지정.

예시코드

int day = 4; // 예를 들어, 오늘은 목요일
switch (day)
{
    case 1:
        Console.WriteLine("Monday");
        break;
    case 2:
        Console.WriteLine("Tuesday");
        break;
    case 3:
        Console.WriteLine("Wednesday");
        break;
    case 4:
        Console.WriteLine("Thursday"); // day 4에 해당하므로 "Thursday"가 출력.
        break;
    case 5:
        Console.WriteLine("Friday");
        break;
    case 6:
        Console.WriteLine("Saturday");
        break;
    case 7:
        Console.WriteLine("Sunday");
        break;
    default:
        Console.WriteLine("Looking forward to the Weekend."); // 일치하는 케이스가 없을 때 출력.
        break;
}
반응형

+ Recent posts