반응형

1. 오늘 학습 키워드

기초 문법 톺아보기


2. 오늘 학습 한 내용을 나만의 언어로 정리하기

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

//------------------------------------------------------------------------------------------------------------------------//
//입력과 출력

//출력
Console.WriteLine("Hello");

//숫자 입력
int number = int.Parse(Console.ReadLine());
Console.WriteLine($"You entered: {number}");
// Parse - string형만 받음 - null값이여도 안됨
// Convert.Toint32() - object등 여러 타입으로 사용 가능하다 null값이면 0으로 값을 받음
//------------------------------------------------------------------------------------------------------------------------//
//Loop 반복문
//for, while, do-while문이 있다.
//do-while 문
//조건을 나중에 평가하므로 코드 블록이 최소 한 번 실행됩니다.
//------------------------------------------------------------------------------------------------------------------------//
//조건문
//if, else if, else가 있다.
//------------------------------------------------------------------------------------------------------------------------//
//배열

//배열 선언과 초기화
int[] numbers = new int[5]; // 크기가 5인 정수 배열 선언
numbers[0] = 10; // 첫 번째 요소에 값 10 저장
numbers[1] = 20; // 두 번째 요소에 값 20 저장

// 배열 선언과 동시에 초기화
int[] numbers2 = { 10, 20, 30, 40, 50 };

//배열 접근과 순회
int[] numbers3 = { 10, 20, 30, 40, 50 };
for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}
//------------------------------------------------------------------------------------------------------------------------//
//클래스

//클래스 정의와 객체 생성 방법
class Person
{
    public string Name;
    public int Age;

    public void Introduce()
    {
        Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
    }

    static void Main(string[] args)
    {
        // 클래스 사용 예제
        Person person = new Person();
        person.Name = "John";
        person.Age = 30;
        person.Introduce();
    }
}
//여태 유니티로 클래스를 사용했었지만 static void Main(string[] args)를 C#에서 직접 코드를 작성할때 써야할줄은 몰랐다.
//------------------------------------------------------------------------------------------------------------------------//
//상속

//상속 예제
class Animal
{
    public void Eat()
    {
        Console.WriteLine("Eating...");
    }
}
class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Barking...");
    }

    static void Main(string[] args)
    {
        // 상속 사용 예제
        Dog dog = new Dog();
        dog.Eat();
        dog.Bark();
    }
}
//------------------------------------------------------------------------------------------------------------------------//
//인터페이스
//인터페이스는 클래스나 구조체가 구현해야 하는 메서드와 속성의 정의를 포함합니다. C#에서는 인터페이스를 다중 상속할 수 있습니다.

//인터페이스 정의와 구현

interface IAnimal
{
    void MakeSound();
}

class Dog2 : IAnimal
{
    public void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    static void main(string[] args)
    {
        // 인터페이스 사용 예제
        IAnimal animal = new Dog2();
        animal.MakeSound();
    }
}
//클래스 상속은 구현 상속, 인터페이스는 기능 약속이다.
//------------------------------------------------------------------------------------------------------------------------//
//추상 클래스
//추상 클래스는 인스턴스화될 수 없으며, 상속을 통해서만 사용될 수 있습니다. 추상 메서드를 포함할 수 있습니다.

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

class Dog3 : Animal3
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    static void main(string[] args)
    {
        // 추상 클래스 사용 예제
        Animal3 animal = new Dog3();
        animal.MakeSound();
    }
}

//추상 클래스의 주요 이점
//1. 공통 로직을 재사용할 수 있다 (일반 메서드 포함 가능)
abstract class Animal
{
    public void Breathe()
    {
        Console.WriteLine("숨 쉰다");  // 모든 동물이 숨 쉬니까!
    }
    public abstract void MakeSound();  // 동물마다 울음소리는 다르니까 직접 구현하도록 강제
}

//2. 상속받는 클래스에 "반드시 구현해야 하는 메서드"를 강제할 수 있다
abstract class Animal
{
    public abstract void MakeSound();  // 반드시 구현
}
class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}

//3. 기초 구조는 정하고, 세부는 유연하게
abstract class Character
{
    public void TakeTurn()
    {
        Console.WriteLine("턴 시작");
        Attack();
        Console.WriteLine("턴 종료");
    }
    public abstract void Attack();
}

//4. 인터페이스와 달리 상태(필드)와 구현을 가질 수 있다
interface IThing
{
    int count = 0; // ❌ 컴파일 에러!
    void Do();     // ✔ 메서드 정의만 가능
}

//추상 클래스는 필드, 생성자, 메서드 모두 가질 수 있다.
abstract class Thing
{
    protected int count = 0;

    public void Increase() => count++;

    public abstract void Do();  // 자식 클래스에서 반드시 구현
}
//------------------------------------------------------------------------------------------------------------------------//
//가상 메서드 (Virtual Methods)
//가상 메서드는 자식 클래스에서 재정의할 수 있는 부모 클래스의 메서드이다.
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

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

    static void main(string[] args)
    {
        // 가상 메서드 사용 예제
        Animal animal = new Dog();
        animal.MakeSound();
    }
}

//------------------------------------------------------------------------------------------------------------------------//
//랜덤 숫자 생성 (Random Number Generation)

//Random 클래스 사용
Random random = new Random();
int randomNumber = random.Next(); // 0과 int.MaxValue 사이의 난수 생성
int randomNumberInRange = random.Next(1, 101); // 1과 100 사이의 난수 생성

//랜덤 숫자 생성 예제
Random random = new Random();
int randomNumber = random.Next(1, 101);
Console.WriteLine($"Random number between 1 and 100: {randomNumber}");
//------------------------------------------------------------------------------------------------------------------------//
//문자열 처리

//문자열 생성 및 초기화
string message = "Hello, World!";

//문자열 길이 확인 - 문자열의 길이는 Length 속성을 사용하여 확인할 수 있습니다.
string message = "Hello, World!";
int length = message.Length; // 13

//문자열 비교 - == 연산자나 Equals 메서드를 사용하여 문자열을 비교할 수 있습니다.
string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2; // false
bool isEqualMethod = str1.Equals(str2); // false

//부분 문자열 추출 - Substring 메서드를 사용하여 문자열의 일부를 추출할 수 있습니다.
string message = "Hello, World!";
string hello = message.Substring(0, 5); // "Hello"

//문자열 분할 - Split 메서드를 사용하여 문자열을 특정 구분자로 나눌 수 있습니다.
string message = "Hello, World!";
string[] words = message.Split(','); // { "Hello", " World!" }

//문자열 합치기 - + 연산자나 String.Concat 메서드를 사용하여 문자열을 합칠 수 있습니다.
string str1 = "Hello";
string str2 = "World";
string message = str1 + ", " + str2 + "!"; // "Hello, World!"

//문자열 포맷팅 - String.Format 메서드를 사용하여 문자열을 포맷팅할 수 있습니다.
string name = "John";
int age = 30;
string message = String.Format("Name: {0}, Age: {1}", name, age); // "Name: John, Age: 30"

//문자 배열 변환 - 문자열을 문자 배열로 변환하거나, 그 반대 작업을 할 수 있습니다.
string message = "Hello";
char[] chars = message.ToCharArray(); // { 'H', 'e', 'l', 'l', 'o' }
string newMessage = new string(chars); // "Hello"
//------------------------------------------------------------------------------------------------------------------------//
//out과 ref
//C#에서 out과 ref 키워드는 메서드에 인수로 전달된 변수를 참조로 전달하는 데 사용됩니다. 둘 다 메서드 내부에서 값을 변경할 수 있으며,
//메서드 호출 후에도 변경된 값이 반영됩니다.

//out
//사용 예: 메서드가 여러 값을 반환해야 할 때 유용합니다.
//특징:
//메서드가 반환하기 전에 반드시 값을 할당해야 합니다.
//호출할 때 초기화되지 않아도 됩니다.

//예제
void GetValues(out int x, out int y)
{
    x = 10;
    y = 20;
}

int a, b;
GetValues(out a, out b);
Console.WriteLine($"a: {a}, b: {b}"); // a: 10, b: 20

//ref
//사용 예: 변수의 현재 값을 메서드 내부에서 수정해야 할 때 유용합니다.
//특징:
//메서드가 호출될 때 변수는 초기화되어 있어야 합니다.
//메서드 내부에서 값을 수정할 수 있습니다.

//예제
void Increment(ref int number)
{
    number++;
}

int value = 5;
Increment(ref value);
Console.WriteLine(value); // 6

//차이점:
//out은 메서드 내부에서 값을 할당해야 하며, 초기화되지 않은 변수를 받을 수 있습니다.
//ref는 변수의 초기화가 필요하며, 메서드 호출 전에 이미 할당된 값을 전달받습니다.
//------------------------------------------------------------------------------------------------------------------------//
//is와 as
//C#에서 is와 as 키워드는 객체의 타입을 확인하고 변환하는 데 사용됩니다.
//두 키워드는 타입 검사 및 변환을 더 간단하고 안전하게 수행할 수 있도록 도와줍니다.

//is (타입 확인)
//사용 예: 객체가 특정 타입인지 확인할 때 사용합니다.
//특징:
//결과는 true 또는 false로 반환됩니다.
//타입이 일치하면 true, 그렇지 않으면 false를 반환합니다.

//예제
object obj = "Hello, World!";
if (obj is string)
{
    Console.WriteLine("obj is a string");
}
else
{
    Console.WriteLine("obj is not a string");
}

//as (타입 변환)
//사용 예: 객체를 특정 타입으로 안전하게 변환할 때 사용합니다.
//특징:
//타입 변환이 성공하면 변환된 객체를 반환합니다.
//실패하면 null을 반환합니다.

//예제
object obj = "Hello, World!";
string str = obj as string;
if (str != null)
{
    Console.WriteLine("Conversion successful: " + str);
}
else
{
    Console.WriteLine("Conversion failed");
}

//차이점:
//is는 객체가 특정 타입인지 확인하는 데 사용됩니다.
//as는 객체를 특정 타입으로 변환하는 데 사용되며, 변환에 실패하면 null을 반환합니다.
//------------------------------------------------------------------------------------------------------------------------//

3. 학습하며 겪었던 문제점 & 에러

  • 새롭게 알게 된 점
    • 원래는 유니티로만 C#을 사용하다보니 기본 C#의 문법에 대해서는 잘 몰랐었다 기본적으로 유니티는 Start함수나 Update등 바로 코드를 실행하는 코드가 있다보니 원래 C#에서 사용하는 static void main(string[] args)를 사용하는줄 몰랐다 JAVA 공부 경험이 있어서 어렵진 않았다.
    • 상속이나 인터페이스, 추상 클래스, 가상메서드등을 잘 유니티에서는 사용하지 않았었다 그나마 상속을 사용했었는데 기본 문제들을 풀어보면서 조금더 적응해봐야겠다.
    • 기초 문법을 보니 is는 잘 사용했었지만 as는 잘 몰랐었다 as에 대해서도 더 알아봐야겠다.
    • out, ref도 사용할 일이 잘 없었다보니 조금 어색했다 더 알아보자.
    • 나머지것들에 대한건 잘 알고있어서 부족한 부분을 다시 공부해봐야겠다.

4. 내일 학습 할 것

기초 문법 톺아보기 복습, 달리기반 Lv1, Lv2


5. 메모

https://nbcamp-unity-precamp.oopy.io/

[내일배움캠프] 사전캠프 OT & 사전학습 가이드

사전캠프

  • 진행 방식 :
    • 강의 수강
    • 퀘스트 모음집 진행
    • 데일리 루틴 (TIL 제출)
    • 팀스터디
    • 담임 매니저와의 1:1 면담
제목 : [내일배움캠프 사전캠프] + 오늘의 학습 키워드

1. 오늘 학습 키워드
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
3. 학습하며 겪었던 문제점 & 에러
 - 문제&에러에 대한 정의
 - 내가 한 시도
 - 해결 방법
 - 새롭게 알게 된 점
 - 이 문제&에러를 다시 만나게 되었다면? 
4. 내일 학습 할 것은 무엇인지

팀원

팀장 - 26세 이재은

오승엽 - 29세 사회복지학과 졸업, 블루아카이브 게임을 좋아함

유형준 - 24세 게임 모델링쪽 학과 졸업

이원혁 - 27세 정보통신학과 재학중, 게임의 스토리를 좋아함

조민석 - 26세 역사학과


반응형