728x90

1. 메소드란?

  • 정의: 특정 작업을 수행하는 일련의 코드를 하나의 이름으로 묶은 것.
  • 다양한 언어에서의 표현:
    • C++: 함수 (Function)
    • 파스칼: 프로시저 (Procedure)
    • 비주얼 베이직: 서브 루틴 (Subroutine)

2. 메소드 선언 형식

한정자 반환형식 메소드이름(매개변수)
  • 한정자: 메소드의 속성 정의 (예: public, static).
  • 반환형식: 메소드가 반환하는 데이터의 형식.
  • 메소드 이름: 호출 시 사용할 이름.
  • 매개변수: 메소드 실행에 필요한 입력값.

예시:

public int Add(int a, int b)
{
    return a + b;
}

3. return 키워드

  • 프로그램의 흐름을 호출자로 되돌립니다.
  • 반환형식이 존재할 경우 반환값과 반환형식이 일치해야 합니다.

예시 (재귀 호출):

public int Fibonacci(int n)
{
    if (n < 2)
        return n;
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

4. 매개변수 전달 방식

a. 값에 의한 전달

  • 매개변수로 데이터를 복사하여 전달.
public void Swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int x = 3, y = 4;
Swap(x, y);
Console.WriteLine($"{x}, {y}"); // 결과: 3, 4 (값이 변경되지 않음)

b. 참조에 의한 전달 (ref)

  • 매개변수를 참조하여 원본 데이터를 변경.
public void Swap(ref int a, ref int b)
{
    int temp = a;
    a = b;
    b = temp;
}

int x = 3, y = 4;
Swap(ref x, ref y);
Console.WriteLine($"{x}, {y}"); // 결과: 4, 3

c. 출력 전용 매개변수 (out)

  • 메소드에서 결과를 출력하는 용도로 사용.
public void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

int quotient, remainder;
Divide(10, 3, out quotient, out remainder);
Console.WriteLine($"Quotient: {quotient}, Remainder: {remainder}");

5. 메소드 오버로딩

  • 같은 이름의 메소드를 매개변수의 타입, 개수로 구분하여 여러 개 정의.
public int Add(int a, int b)
{
    return a + b;
}

public double Add(double a, double b)
{
    return a + b;
}​

6. 가변 길이 매개변수 (params)

  • 개수가 유동적인 매개변수를 받을 때 사용.
public int Sum(params int[] numbers)
{
    int sum = 0;
    foreach (int num in numbers)
        sum += num;
    return sum;
}

int result = Sum(1, 2, 3, 4);
Console.WriteLine(result); // 출력: 10

7. 명명된 매개변수

  • 매개변수 이름을 명시적으로 지정하여 호출.
public void PrintInfo(string name, int age)
{
    Console.WriteLine($"Name: {name}, Age: {age}");
}

PrintInfo(age: 30, name: "Alice");

8. 선택적 매개변수

  • 기본값을 제공하여 필요에 따라 값을 전달하지 않을 수 있음.
public void PrintMessage(string message = "Hello, World!")
{
    Console.WriteLine(message);
}

PrintMessage(); // 출력: Hello, World!
PrintMessage("Hi!"); // 출력: Hi!

9. 로컬 함수

  • 메소드 내부에 정의된 함수로, 해당 메소드에서만 사용 가능.
public void Calculate()
{
    int counter = 0;

    void LocalFunction(int a, int b)
    {
        counter++;
        Console.WriteLine($"{a} + {b} = {a + b}, Counter: {counter}");
    }

    LocalFunction(1, 2);
    LocalFunction(3, 4);
}

정리

  • 메소드는 코드를 재사용하고 모듈화하기 위한 핵심 도구.
  • 다양한 매개변수 전달 방식 (ref, out, params)과 유연한 호출 방식을 제공.
  • 로컬 함수와 메소드 오버로딩으로 코드의 가독성과 효율성을 높일 수 있음.
728x90
728x90

1. 객체 지향 프로그래밍 (OOP)

  • 정의: 코드 내의 모든 것을 객체로 표현하는 프로그래밍 패러다임.
  • 객체(Object): 세상의 모든 것을 지칭하며, 속성과 기능으로 이루어집니다.
    • 속성: 데이터를 통해 표현 (예: 다리, 귀).
    • 기능: 메소드를 통해 표현 (예: 뛰기, 듣기).

2. 클래스(Class)

  • 정의: 객체를 생성하기 위한 청사진(모형).
  • 예시:
class Cat
{
    public string Color; // 데이터: 속성
    public void Meow()   // 메소드: 기능
    {
        Console.WriteLine($"{Color} 고양이: 야옹");
    }
}

Cat kitty = new Cat();  // Cat 클래스의 객체 생성

3. 클래스와 객체의 관계

  • 클래스는 복합 데이터 형식의 참조 형식입니다.
  • **객체(Object)**는 클래스의 인스턴스(실체)입니다.
    Cat kitty = new Cat();
    • new: 생성자를 호출해 객체를 힙(Heap)에 생성.
    • kitty: 생성된 객체의 참조를 저장.

4. 생성자(Constructor)와 종료자(Destructor)

a. 생성자

  • 클래스와 같은 이름을 가지며 객체 생성 시 호출됩니다.
  • 객체를 초기화하기 위한 용도로 사용됩니다.
  • 예시:
class Cat
{
    public string Color;

    // 생성자
    public Cat(string color)
    {
        Color = color;
    }

    public void Meow()
    {
        Console.WriteLine($"{Color} 고양이: 야옹");
    }
}

Cat kitty = new Cat("검은색"); // 생성자 호출

b. 종료자

  • 객체가 소멸될 때 호출되는 특별한 메소드.
  • 매개변수나 한정자가 없으며 오버로딩 불가능.
  • CLR의 가비지 컬렉터가 객체의 소멸 시점을 판단해 호출.
  • 예시:
class Cat
{
    ~Cat()
    {
        Console.WriteLine("Cat 객체가 소멸되었습니다.");
    }
}

5. 정적 필드와 메소드 (Static)

  • static 한정자를 사용해 클래스 자체에 소속되는 필드와 메소드.
  • 특징:
    • 클래스의 모든 인스턴스가 공유.
    • 객체를 생성하지 않고 호출 가능.
  • 예시:
class Counter
{
    public static int Count = 0;

    public static void Increment()
    {
        Count++;
    }
}

Counter.Increment(); // 객체 없이 호출
Console.WriteLine(Counter.Count); // 출력: 1

6. 클래스의 기본 구조

class ClassName
{
    // 필드 (Field): 데이터 저장
    public string FieldName;

    // 생성자 (Constructor): 객체 초기화
    public ClassName(string value)
    {
        FieldName = value;
    }

    // 메소드 (Method): 동작 정의
    public void MethodName()
    {
        Console.WriteLine($"Field: {FieldName}");
    }

    // 정적 메소드 (Static Method)
    public static void StaticMethod()
    {
        Console.WriteLine("This is a static method.");
    }
}

정리

  • 클래스는 객체를 생성하기 위한 청사진으로, 속성(필드)과 기능(메소드)을 포함.
  • 객체는 클래스의 인스턴스로, new 키워드를 통해 생성.
  • 생성자는 객체를 초기화하고, 종료자는 객체 소멸 시 호출.
  • 정적 필드/메소드는 클래스 자체에 속하며, 모든 인스턴스가 공유 가능.
728x90
728x90

1. 객체와 다형성

  • 다형성(Polymorphism): 객체가 여러 형태를 가질 수 있는 성질.
    • 하위 형식 다형성: 파생 클래스가 기반 클래스의 메소드를 재정의하여 다양한 동작을 실행.

a. 예제: 다형성

class ArmorSuite
{
    public virtual void Initialize()
    {
        Console.WriteLine("ArmorSuite: 초기화");
    }
}

class IronMan : ArmorSuite
{
    public override void Initialize()
    {
        base.Initialize(); // 기반 클래스 메소드 호출
        Console.WriteLine("IronMan: 초기화");
    }
}

2. 메소드 오버라이딩

  • 조건:
    • 메소드는 virtual 키워드로 선언되어야 함.
    • override 키워드로 재정의.
    • private 메소드는 오버라이딩 불가.

a. 예제

class BaseClass
{
    public virtual void MyMethod()
    {
        Console.WriteLine("BaseClass: MyMethod");
    }
}

class DerivedClass : BaseClass
{
    public override void MyMethod()
    {
        Console.WriteLine("DerivedClass: MyMethod");
    }
}

b. 메소드 감추기 (new 키워드)

  • 기반 클래스의 메소드를 감추고 파생 클래스 메소드만 표시.
class BaseClass
{
    public void MyMethod()
    {
        Console.WriteLine("BaseClass: MyMethod");
    }
}

class DerivedClass : BaseClass
{
    public new void MyMethod()
    {
        Console.WriteLine("DerivedClass: MyMethod");
    }
}

c. 메소드 봉인 (sealed 키워드)

  • 오버라이딩된 메소드의 추가 재정의를 금지.
class BaseClass
{
    public virtual void MyMethod()
    {
        Console.WriteLine("BaseClass: MyMethod");
    }
}

class DerivedClass : BaseClass
{
    public sealed override void MyMethod()
    {
        Console.WriteLine("DerivedClass: MyMethod");
    }
}

3. 중첩 클래스

  • 클래스 안에 선언된 클래스.
  • 외부 클래스의 모든 멤버(심지어 private)에 접근 가능.

예제

class OuterClass
{
    private int number = 42;

    class NestedClass
    {
        public void DisplayNumber(OuterClass outer)
        {
            Console.WriteLine($"Number: {outer.number}");
        }
    }
}

4. 분할 클래스

  • partial 키워드를 사용하여 여러 파일에 걸쳐 하나의 클래스를 정의.
  • 코드 관리 및 분할 작업에 유용.

예제

partial class MyClass
{
    public void Method1()
    {
        Console.WriteLine("Method1");
    }
}

partial class MyClass
{
    public void Method2()
    {
        Console.WriteLine("Method2");
    }
}

5. 확장 메소드

  • 기존 클래스의 기능을 확장하는 메소드.
  • 정적 클래스와 this 키워드를 활용.

예제

public static class StringExtensions
{
    public static string ToUpperFirst(this string input)
    {
        if (string.IsNullOrEmpty(input)) return input;
        return char.ToUpper(input[0]) + input.Substring(1);
    }
}

// 사용
string name = "john";
Console.WriteLine(name.ToUpperFirst()); // 출력: John

6. 클래스 vs 구조체

특징클래스구조체

키워드 class struct
형식 참조 형식 값 형식
복사 방식 얕은 복사 깊은 복사
생성 방법 new 키워드 필요 선언만으로 생성 가능
생성자 매개변수 없는 생성자 가능 불가능
상속 가능 불가능

예제

struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        X = x;
        Y = y;
    }
}

Point p1 = new Point(10, 20);
Console.WriteLine($"X: {p1.X}, Y: {p1.Y}");

7. 튜플 (Tuple)

  • 여러 필드를 담을 수 있는 구조체.
  • 임시적으로 복합 데이터를 다룰 때 사용.

a. 명명되지 않은 튜플

var tuple = (123, 789);
Console.WriteLine(tuple.Item1); // 출력: 123
Console.WriteLine(tuple.Item2); // 출력: 789

b. 명명된 튜플

var person = (Name: "John", Age: 30);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");

정리

  • 객체는 클래스의 인스턴스이며, 다형성, 오버라이딩, 중첩 클래스, 확장 메소드 등을 통해 강력한 유연성을 제공합니다.
  • 구조체는 값 형식으로 메모리 관리 및 간단한 데이터 저장에 유용.
  • 튜플은 임시적인 복합 데이터를 간단히 표현.
728x90
728x90

1. 접근 한정자 (Access Modifiers)

C#의 접근 한정자는 클래스, 메소드, 변수 등의 멤버에 대한 접근 범위를 지정합니다.


a. public

  • 정의:
    멤버가 동일한 어셈블리의 모든 코드와 다른 어셈블리를 참조하는 코드에서도 접근 가능.
  • 예시:
public class Example
{
    public int Value = 10;

    public void Display()
    {
        Console.WriteLine($"Value: {Value}");
    }
}

b. private

  • 정의:
    멤버가 선언된 클래스 또는 구조체 내부에서만 접근 가능.
  • 예시:
class Example
{
    private int Value = 10;

    private void Display()
    {
        Console.WriteLine($"Value: {Value}");
    }
}

c. protected

  • 정의:
    멤버가 같은 클래스 및 파생된 클래스에서만 접근 가능.
  • 예시:
class Base
{
    protected int Value = 10;
}

class Derived : Base
{
    public void ShowValue()
    {
        Console.WriteLine($"Value: {Value}");
    }
}

d. internal

  • 정의:
    멤버가 동일한 어셈블리 내에서 접근 가능하며, 다른 어셈블리에서는 불가능.
  • 예시:
     
internal class Example
{
    internal int Value = 10;
}

e. protected internal

  • 정의:
    멤버가 선언된 어셈블리의 모든 코드와 다른 어셈블리의 파생 클래스에서 접근 가능.
  • 예시:
public class Base
{
    protected internal int Value = 10;
}

f. private internal

  • 정의:
    멤버가 선언된 어셈블리 내부의 코드 및 해당 클래스에서 파생된 클래스 내에서만 접근 가능.
  • 예시:
class Example
{
    private protected int Value = 10;
}

2. 메소드 반환 형식

a. int 반환 형식

  • 반환값이 int 타입이어야 함.
  • 예시:
public int Add(int a, int b)
{
    return a + b;
}

b. string 반환 형식

  • 반환값이 string 타입이어야 함.
  • 예시:
public string Greet(string name)
{
    return $"Hello, {name}!";
}

c. void 반환 형식

  • 반환값이 없음을 의미.
  • 예시:
public void PrintMessage(string message)
{
    Console.WriteLine(message);
}

3. 예제 코드: 다양한 접근 한정자와 반환 형식

public class Example
{
    // public 멤버
    public int PublicValue = 10;

    // private 멤버
    private int PrivateValue = 20;

    // protected 멤버
    protected int ProtectedValue = 30;

    // internal 멤버
    internal int InternalValue = 40;

    // protected internal 멤버
    protected internal int ProtectedInternalValue = 50;

    // private protected 멤버
    private protected int PrivateProtectedValue = 60;

    // 메소드 반환 형식 예제
    public int Add(int a, int b) => a + b;
    public string Greet(string name) => $"Hello, {name}!";
    public void PrintMessage(string message) => Console.WriteLine(message);
}

정리

  • 접근 한정자:
    • public: 모든 코드에서 접근 가능.
    • private: 동일 클래스 내에서만 접근 가능.
    • protected: 동일 클래스 및 파생 클래스에서 접근 가능.
    • internal: 동일 어셈블리에서만 접근 가능.
    • protected internal: 어셈블리 내 모든 코드와 다른 어셈블리의 파생 클래스에서 접근 가능.
    • private internal: 어셈블리 및 파생 클래스에서만 접근 가능.
  • 메소드 반환 형식:
    • int, string 등의 반환값 타입에 맞는 값을 반환해야 하며, void는 반환값이 없음.
728x90
728x90

1. 분기문

  • 정의: 프로그램의 흐름을 조건에 따라 변화시키는 구문.

a. if문

  • 하나의 조건을 평가하여 참/거짓에 따라 실행.
  • 형식:
if (조건식) 
{
	// 조건이 참일 때 실행 
} 
else 
{ 
	// 조건이 거짓일 때 실행 
}
  • else if: 추가적인 조건 평가 가능.
if (조건식1)
{
    // 조건1이 참일 때 실행
}
else if (조건식2)
{
    // 조건2가 참일 때 실행
}
else
{
    // 모든 조건이 거짓일 때 실행
}

b. switch문

  • 하나의 조건식을 다양한 결과와 비교.
  • 형식:
switch (조건식)
{
    case 상수1:
        // 실행 코드
        break;
    case 상수2:
        // 실행 코드
        break;
    default:
        // 모든 조건이 거짓일 때 실행
        break;
}
  • 예시:
object obj = 123;
switch (obj)
{
    case int i:
        Console.WriteLine($"정수: {i}");
        break;
    case string s:
        Console.WriteLine($"문자열: {s}");
        break;
    default:
        Console.WriteLine("알 수 없는 타입");
        break;
}

2. 반복문 (루프문)

  • 정의: 특정 조건을 만족하는 동안 코드 블록을 반복 실행.

a. while문

  • 조건이 참일 때 반복 실행.
while (조건식)
{
    // 반복 실행할 코드
}

b. do-while문

  • 조건에 상관없이 코드 블록을 최소 한 번 실행.
do
{
    // 반복 실행할 코드
}
while (조건식);

c. for문

  • 초기화식, 조건식, 반복식을 사용해 정교하게 제어 가능.
for (초기화식; 조건식; 반복식)
{
    // 반복 실행할 코드
}

d. foreach문

  • 배열이나 컬렉션의 요소를 순회.
  • 형식:
foreach (데이터형식 변수명 in 배열 또는 컬렉션)
{
    // 요소별 실행 코드
}
  • 예시:
int[] numbers = { 1, 2, 3, 4, 5 };

foreach (int num in numbers)
{
    Console.WriteLine(num); // 배열의 각 요소 출력
}

e. 무한 반복

  • for문:
for (;;)
{
    // 무한 반복 코드
}
  • while문:
while (true)
{
    // 무한 반복 코드
}

 


3. 점프문

  • 정의: 실행 흐름을 중단하거나 특정 위치로 이동.

a. break문

  • 현재 실행 중인 반복문 또는 switch문을 중단.
for (int i = 0; i < 10; i++)
{
    if (i == 5) break; // 반복문 중단
    Console.WriteLine(i);
}

b. continue문

  • 현재 반복을 건너뛰고 다음 반복으로 이동.
for (int i = 0; i < 10; i++)
{
    if (i % 2 == 0) continue; // 짝수 건너뛰기
    Console.WriteLine(i);
}

c. goto문

  • 지정된 레이블로 바로 이동.
goto 레이블;

레이블:
    Console.WriteLine("레이블로 이동");

d. return문

  • 메서드를 종료하고 값을 반환.
return 값;

e. throw문

  • 예외를 발생.
throw new Exception("예외 발생");

정리

  • 분기문: if, else, switch를 사용하여 조건에 따른 실행 흐름 제어.
  • 반복문: while, do-while, for, foreach를 활용해 반복 처리.
  • 점프문: break, continue, goto, return, throw를 통해 흐름을 제어.
728x90

+ Recent posts