TIL

if(today == 25.01.27) for (int i = today; i<25.01.28;i++) Class TIL

gaon99 2025. 1. 27. 21:40

부트캠프 6일차

 

1. 오늘 학습 키워드

조건문, 반복문, 클래스, 객체 지향 프로그래밍


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

 

2.1 조건문

 

조건문에는 보통 if, else if, else, switch case 정도로 흔히 알고있다.

 

조건문은 학부생 시절부터 많이 다뤘기에 간단히 적어두고 넘어가겠다.

int score = 85;

if (score >= 90)
{
    Console.WriteLine("Grade: A");
}
else if (score >= 80)
{
    Console.WriteLine("Grade: B");
}
else if (score >= 70)
{
    Console.WriteLine("Grade: C");
}
else
{
    Console.WriteLine("Grade: F");
}

 Score의 등급이 점수의 조건에 따라 정해지는 if / else if 를 사용한 간단한 구문이다.

 

그리고 이번엔 동일한 구문을 Switch Case 를 사용하여 작성하였다.

int score = 85;

switch (score / 10)  // 점수를 10으로 나누어 0~9, 10~19, 20~29 등의 범위로 처리
{
    case 10:
    case 9: Console.WriteLine("Grade: A"); break;
    case 8: Console.WriteLine("Grade: B"); break;
    case 7: Console.WriteLine("Grade: C"); break;
    default: Console.WriteLine("Grade: F"); break;
}

 

2.2 3항 연산자.

예전에 프로그래머스의 코딩 테스트를 연습하면서 다른 사람들이 3항 연산자를 사용하여 간단히 풀이를 잘 한것을 보고

연습해보고자 나도 해보았던 코드를 가져왔다.

 answer[end] = (num_list[end-1]>num_list[end-2]) ? num_list[end-1] - num_list[end-2] : num_list[end-1] * 2;

 

3항 연산자는 (조건) ? X : Y로

조건에 부합하면 X, 부합하지 않으면 Y가 된다. if , else 구문을 사용하면 아래 코드 처럼 나타낼수 있다.

if(num_list[end-1] > num_list[end-2])
{
    answer[end] = num_list[end-1] - num_list[end-2];
}
else
{
    num_list[end-1] * 2;
}

2.3 반복문

반복문도 학부생 시절부터 자주 사용하던 C의 기초였기에, 예전에 프로그래머스 코딩테스트에서 사용한 홀수 출력을
예제로 적어두고 넘어가겠다.

*for 
for (int i = 1; i <= 99; i++){
    if (i % 2 == 1)
        Console.WriteLine(i);
}

*while
int i = 0;
while(i<=99)
{
    i++;
    if(i%2 ==1)
    {
        Console.WriteLine(i);
    }
}

*do while
int i = 0;
    do
    {
    if (i % 2 == 1)
    {
        Console.WriteLine(i);
    }
        i++;
    }
while (i < 100);

 

2.4 컬렉션

List 가변적인 크기를 갖는 배열
Dictionary 키와 값으로 구성된 데이터를 저장, 중복된 키를 가질 수 없다
Stack 후입 선출 구조를 가짐
Queue 선입 선출 구조를 가짐
Hashset 중복되지 않은 요소들로만 이루어진 집합

2.4.1 List

List<int> Nums = new List<int>();
Nums.Add(10);
Nums.Add(20);
Nums.Add(30);

Nums.Remove(10);

foreach(int number in Nums)
{
    Console.WriteLine(number);
}

 2.4.2 Dictionary

Dictionary<string, char> Grade  = new Dictionary<string, char>();
Grade.Add("John", 'A');
Grade.Add("Ethan", 'C');
Grade.Add("Pauline", 'B');

Grade.Remove("Ethan");

foreach(KeyValuePair<string, char> pair in Grade)
{
    Console.WriteLine($"{pair.Key} : {pair.Value}");
}

 

내가 자주 사용할 List와 Dictionary 정도만 작성해보겠다.

 

2.5 메서드

메서드란 특정한 작업을 수행하기 위해 사용되는 독립적인 기능 단위 라고 말하고, 학부생 시절에 함수라고 말하고 다녔다..

보통 반복되는 특정 작업이나, 메인 구문을 깔끔하게, 즉 가독성을 높이기 위해 자주 사용한다.

그리고 메서드의 이름을 통해 어떤 역할을 하는지 파악하는 등, 많은 장점을 가지고 있다.

 

사용 방법은 아래같은 메서드를

public int AddNumbers(int a, int b)
{
    int sum = a + b;
    return sum;
}
AddNumbers(10, 20);

이런 식으로 간단하게 호출하면 된다.

 

2.5.1 매개 변수

 

매개 변수란 메서드에 전달되는 입력 값으로 위 코드에선 int a, int b를 뜻한다.

 

2.6 클래스

 

2.6.1 객체 지향 프로그래밍

 

일단 클래스에 대하여 적기전에 우리는 객체 지향 프로그래밍에 대하여 인지를 할 필요가 있다.

 

객체 지향 프로그래밍이란 실제 세계의 개체나 개념을 프로그램으로 구현하기 위해,
그 개체를 '객체'라는 단위로 나누고, 객체들 간의 상호작용을 통해 프로그램을 구성하는 방법

이라고 하나, 이게 이해하기 쉬운 말은 아닐것이다.

나는 이해를 할 때, 흔히 비유를 많이 하는 편인데,
사람으로 예시를 들면 사람이란 하나의 큰 프로그램을 만들기 위해선 뇌도 필요하고, 팔, 다리, 장기 등

많은 것들이 필요하다. 이 팔이나 다리 같은 이런 요소를 클래스로 만들어서, 각 클래스가 걷는다, 혹은 무언가를 잡는다

하는 행동을 한다고 생각하면 쉽게 이해할 수 있을것이다.

모든 행동을 뇌에서 컨트롤한다면 아마 뇌는 금방 지쳐 오래 가진 못할 것이다.

 

2.6.2 객체 지향 프로그래밍의 특징

 

2.6.2.1 캡슐화

관련된 데이터와 기능을 하나의 단위로 묶는 것으로 외부에서 데이터를 직접 접근하거나 변경하지 못하도록 숨기는 기법이다.

이를 통해 정보 은닉, 외부 접근 제한, 그리고 안정성과 유지 보수성을 높일수 있다.

흔히 사용하는 접근 제한자의 종류와 특징도 함께 적어두었다. 

public 외부에서 자유롭게 접근이 가능하다.
private 같은 클래스 내부에서만 접근이 가능하다. 
protected 같은 클래스 내부와 상속받은 클래스에서만 접근 가능하다.

2.6.2.2 상속

기존의 클래스를 확장하여, 새로운 클래스를 생성하는 것으로

부모(상위), 자식(하위) 클래스 를 사용하여, 코드의 중복을 줄이고 계층 구조를 사용하여, 코드의 구조화와 유지보수를 용이하게 할 수 있다.

public class Animal
{
    public void Eat()
    {
        Console.WriteLine("Animal is eating.");
    }
    
    public void Sleep()
    {
        Console.WriteLine("Animal is sleeping.");
    }
}

public class Dog : Animal
{

}

public class Cat : Animal
{

}

이렇게 상속 시킬 수 있다.

 

2.6.2.3 다형성

같은 타입이지만 다양한 동작을 수행 할 수 있는 능력,

 

가상 메서드를 예로 들 수 있다.

 

가상 메서드는 부모 클래스에서 이미 메서드가 정의 되었지만, 자식 클래스에서도 재정의 되어 있을 수 있다

public class Unit
{
    public virtual void Move()
    {
        Console.WriteLine("Move");
    }

    public void Attack()
    {
        Console.WriteLine("Unit Attack");
    }
}

public class Marine : Unit
{

}

public class Zergling : Unit
{
    public override void Move()
    {
        Console.WriteLine("Move Zerg");
    }
}

2.6.2.4 추상화

복잡한 시스템이나 개념을 단순화하여, 필요한 기능에 집중한 것으로

부모 클래스에는 구현부가 없기에 자식 클래스에서 반드시 구현 해야한다.

abstract class Shape
{
    public abstract void Draw();
}

class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

class Square : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a square");
    }
}

class Triangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a triangle");
    }
}

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

조건문과 반복문은 학부생 시절에 모든 제어 과정에 들어갔을 정도로 자주 사용해보았지만, 객체 지향 프로그래밍에 대해서는

어색했다. 프로퍼티 라던가, 메서드라던가, 개발을 하기위해 어떤 방식을 추구해야하는가, 에 대해서 많이 고민해봐야겠다.


4. 내일 학습 할 것은 무엇인지

내일은 설 연휴지만 제공해주신 코딩 테스트 문항들을 조금 풀어보고

시간이 남는다면, 3-3, 3-4 강의를 듣고 3주차를 마무리 해야겠다.