내일배움캠프/IL

[내배캠][Unity_6기][IL] C# 기초 문법 톺아보기

binary는 호남선 2024. 8. 31. 22:59

- 다음 내용은 Unity 퀘스트 모음집 \ 기초 문법 톺아보기 페이지를 학습하고 작성되었습니다.

- 이전 C# 사전 문법 기초와 중복되는 내용은 생략하였습니다.

상속 (Inheritance)

- 하위 클래스가 상위 클래스의 속성과 메서드를 물려받아 사용

- C#은 클래스 다중 상속 지원 X

- ex) Animal(상위 클래스), Brid(하위 클래스)

새는 동물의 특성을 상속 받아 걸을 수 있고, 조류 고유의 특성으로 날 수 있음

// 상속 사용 예제
Bird bird = new Bird();
bird.Eat();
bird.Fly();

class Animal
{
    public void Eat()
    {
        Console.WriteLine("Walking...");
    }
}

class Bird : Animal
{
    public void Fly()
    {
        Console.WriteLine("Flying...");
    }
}

인터페이스 (Interfaces)

- 클래스나 구조체가 구현해야 하는 속성과 메서드를 정의

- C#은 인터페이스 다중 상속 지원, 클래스 다중 상속 불가로 생기는 한계를 해소

- 인터페이스를 상속시 반드시 인터페이스에 정의된 내용 구현 필요

- ex) 동물 인터페이스의 소리를 내는 메서드

새 객체를 동물 인터페이스 상속받아 만들면 반드시 소리내는 메서드 구현 필요

// 인터페이스 사용 예제
IAnimal bird = new Bird();
bird.MakeSound();

interface IAnimal
{
    void MakeSound();
}

class Bird : IAnimal
{
    public void MakeSound()
    {
        Console.WriteLine("Tweet");
    }
}

추상 클래스 (Abstract Classes)

- 여러 클래스의 공통된 부분을 모아 상속을 통해 활용하는 클래스

- 그 자체로 인스턴스화 될 수 없으며, 하위 클래스가 상속을 통해서만 사용 가능

- 추상 메서드는 추상 클래스에서만 허용

- 추상 메서드는 구현 내용이 없음

// 추상 클래스 사용 예제
Animal bird = new Bird();
bird.MakeSound();

abstract class Animal
{
    public abstract void MakeSound();
}

class Bird : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Tweet");
    }
}

가상 메서드 (Virtual Methods)

- 하위 클래스에서 재정의할 수 있는 상위 클래스의 메서드

- 상위 클래스에서는 virtual 키워드와 정의됨

- 하위 클래스에서 재정의할 때는 override 키워드 사용

// 가상 메서드 사용 예제
Animal bird = new Bird();
bird.MakeSound();

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

class Bird : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Tweet");
    }
}

Random

- 의사 난수를 편리하게 생성하도록 지원하는 클래스

Random random = new Random();

// 0 ~ int.MaxValue 범위의 난수 생성
int randomNum = random.Next();
// 1 ~ 100 범위의 난수 생성
// 첫번째 인자는 포함, 두번째 인자 미포함
int randomNumInRange = random.Next(1, 101);

참고 : https://learn.microsoft.com/ko-kr/dotnet/api/system.random?view=net-8.0

문자열 처리 (String Manipulation)

문자열 길이

- Length 속성으로 문자열 길이 확인

string message = "Hello World";
int length = message.Length; // 11

 

문자열 비교

- Equals 메서드나 ==(같음 연산자) 사용해 동일한 문자열인지 검사

string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2; // false
isEqual = str1.Equals(str2); // false

 

문자열 추출

- Substring 메서드로 특정 범위의 문자열만 추출할 수 있음

- 첫번째 인자는 추출을 시작할 인덱스, 0보다 작거나 문자열 길이보다 크면 에러

- 두번째 인자는 추출할 문자의 개수, 생략하면 첫번째 인자의 인덱스부터 문자열 끝까지 추출

string message = "Hello, World!";
string hello = message.Substring(0, 5); // "Hello"
string world = message.Substring(7); // "World"

 

문자열 분할

- Split 메서드 사용해 문자열을 특정 구분자로 나눌 수 있음

- 한번에 여러 구분자로 구분 가능

string greetingMsg = "Hello,Ladies and Gentlemen";

string[] subs = greetingMsg.Split(' ', ',');
// subs[0] = Hello
// subs[1] = Ladies
// subs[2] = and
// subs[3] = Gentlemen

 

문자열 병합

- String.Concat, String Join 메서드나 +(더하기) 연산자 사용해 문자열 합칠 수 있음

string str1 = "Hello";
string str2 = "World";
string message = str1 + " " + str2; // "Hello World"

string[] words = { str1, str2 };
message = string.Concat(words); // HelloWorld
message = string.Join(" ", words); // Hello World

 

변수와 문자열의 활용

- String.Format 메서드 사용해 문자열 포맷팅 가능

- 문자열 보간(string interpolation)으로 가독성 향상

string name = "Jane";
int age = 50;

string message = String.Format("Name: {0}, Age: {1}", name, age); // "Name: Jane, Age: 50"
message = $"Name: {name}, Age: {age}"; 				// "Name: Jane, Age: 50"

 

문자열과 문자 배열 간 전환

- 문자열을 해체하여 각 문자가 저장된 배열로 전환 가능

- 문자들이 저장된 배열을 하나의 문자열로 통합 가능

string message = "Ask";
// 문자열 -> 문자의 배열
char[] chars = message.ToCharArray(); // { 'A', 's', 'k' }
// 문자의 배열 -> 문자열
string newMessage = new string(chars); // "Ask"

out과 ref (Pass by Reference)

 

- 메서드에 참조값으로 인자를 전달할 때 사용

- 데이터 값을 복사하여 넘기는 것이 아닌 주소를 참조하는 형식

- 메서드 외부의 변수를 내부에서 변경할 수 있으며, 호출이 종료되어도 변경된 값 유지

out

- 하나의 함수는 하나의 값만 반환 가능, out 키워드로 여러 개의 값을 반환하는 효과

- 헤더와 호출에 모두 out 키워드 필요

- 메서드 반환 전에 반드시 값 할당해야 함

- 호출시 초기화 필요 X

void DivideNum(int a, int b, out int x, out int y)
{
    x = a / b;
    y = a % b;
}

int quotient;
int remainder;
DivideNum(10, 3, out quotient, out remainder);

Console.WriteLine(quotient);    // 3
Console.WriteLine(remainder);   // 1

ref

- 로직상 메서드 외부의 값을 내부에서 접근해야 할 때 사용

- 메모리 할당 큰 클래스 활용 시 불필요한 메모리 복사 오버헤드 감소

- 메서드 호출시 변수 초기화 필요

void Decrement(ref int num)
{
    num--;
}

int value = 3;
Decrement(ref value);
Console.WriteLine(value); // 2

is와 as (Type Checking and Casting)

- 안전한 타입 변환을 도와주는 역할

- 클래스 간 형변환시 실제로는 예외를 발생시키지만 문법상 문제가 없어 컴파일러 수준에서 에러 탐지 불가한 경우 존재

- 잘못된 형변환 시도하면 처리되지 않은 예외 발생

is (타입 확인)

- 객체가 특정 타입인지 확인

- 타입이 일치하면 true, 불일치하면 false 반환

object obj = "Hello";
if (obj is string)
{
    Console.WriteLine("obj is a string");
}
else
{
    Console.WriteLine("obj isn't a string");
}

as (타입 변환)

- 객체를 특정 타입으로 변환

- 변환 성공시 변환된 객체 반환, 실패시 null 반환

object obj = "Bello";
string str = obj as string;
if (str != null)
{
    Console.WriteLine("Conversion successful: " + str);
}
else
{
    Console.WriteLine("Conversion failed");
}