C#/C# 교과서

[C# 교과서] 35~37. 생성자, 소멸자, 메서드와 매개변수

서니션 2023. 1. 11. 23:21
728x90
반응형

생성자

  • 단어 그대로 개체를 생성하면서 무엇인가를 하고자 할 때 사용되는 메서드
  • 생성자 이름이 클래스 이름과 동일
  • 클래스 내에서 클래스 이름과 동일한 이름을 갖는 메서드는 모두 생성자
  • 메서드와 마찬가지로 클래스에 매개변수를 달리하여 생성자를 여러개 만들 수 있음, 이를 생성자 오버로드 또는 오버로딩이라고 함
  • this 키워드를 사용해서 다른 생성자를 호출할 수도 있음
  • 생성자도 메서드(함수)임
  • 하지만 메서드와 달리 반환 형식을 지정 못함
  • 또 static 생성자는 매개변수를 포함할 수 없으며, 매개변수를 사용하여 필드를 초기화할 때는 istance 생성자인 public 생성자를 사용해야 함

this() 생성자로 다른 생성자 호출하기

  • 생성자에서 this()는 자신의 또 다른 생성자를 의미
  • this() 생성자로 매개변수가 있는 생성자에서 매개변수가 없는 생성자를 호출하거나 또 다른 생성자들을 호출 할 수 있음
  • 매개변수가 있는 생성자 뒤에 콜론(:) 기호와 this()를 사용하여 자신의 매개변수가 없는 생성자를 먼저 호출 할 수 있음
  • public ex(string str) : this() 이렇게 ..

생성자 포워딩

this() 생성자를 사용하면 생성자를 포워등 할 수 있으므로 다른 생성자에 값을 전달하기 좋음


생성자를 사용하여 읽기 전용 필드 초기화

  • readonly
  • 읽기 전용 필드는 클래스의 인스턴스를 생성할 때 넘어온 값에 따라 한 번 선언한 후 변경되지 않고 사용할 수 있는 기능을 만듦
  • 상수는 선언과 동시에 반드시 초기화해야 에러가 발생하지 않지만, 읽기 전용 필드는 선언과 동시에 초기화도 가능하고 선언한 후 생성자로 초기화할 수도 있음

식 본문 생성자

화살표 연산자를 사용하여 함수를 줄여 표현하는 것처럼 생성자 코드를 줄여 표현 가능

class Pet
{
	private string _name;

	public Pet(String name) => _name = name; // 식 본문 생성자
	public override string ToString()
	{
		return _name;
	}
}

필드가 private 액세스 한정자를 가진 멤버들은 생성자로 초기화해서 사용 가능


종료자, 소멸자

  • 클래스의 인스턴스를 사용한 후 최종 정리할 때 실행되는 클래스에서 가장 늦게 호출하는 메서드
  • C#에서는 닷넷 가비지 수집기가 개체를 소멸할 때 메모리를 해제하는 등 역할을 대신해 줌

메서드

C#에서는 모든 함수를 클래스 내에 선언하기에 함수 대신에 메서드라고 함


메서드의 매개변수 전달 방식

  • 값 전달 방식 : 말 그대로 값을 그대로 복사해서 전달하는 방식을 의미. 지금까지 사용해 왔던 매개변수 방식
  • 참조 전달 방식(ref) : 실제 데이터는 매개변수가 선언된 쪽에서만 저장하고, 호출된 메서드에서는 참조(가리키는)만 하는 형태로 변수 이름만 전달하는 방식
  • 반환형 전달 방식(out) : 메서드를 호출하는 쪽에서 선언만 하고, 초기화하지 않고 전달하면 메서드 쪽에서 해당 데이터를 초기화해서 넘겨주는 방식
  • 가변형 전달 방식(params) : 1개 이상의 매개변수를 가변적으로 받을 때 매개변수를 선언하면 params 키워드를 붙임. 가변적이라는 것은 같은 타입으로 하나 이상을 받을 수 있도록 배열형으로 받는다는 의미. 가변 길이 매개변수는 반드시 매개변수를 선언할 때 마지막에 위치해야 함.

참조 전달 방식(ref)

ref 키워드로 로컬 변수를 공유할 때 사용하는 방식

using System;

class ParameterRef
{
    static void Main()
    {
        int num = 10;
        Console.WriteLine($"[1] {num}");

        Do(ref num); // 참조 전달 방식

        Console.WriteLine($"[3] {num}");
    }

    static void Do(ref int num)
    {
        num = 20;
        Console.WriteLine($"[2] {num}");
    }
}

// [1] 10
// [2] 20
// [3] 20

반환형 매개변수 전달 방식(out)

메서드를 호출하기 전에 굳이 지역 변수를 초기화하지 않고 호출한 메서드에서 전달한 값을 받아 사용할 때

using System;

class ParameterOut
{
    static void Main()
    {
        int num; // 변수를 반드시 초기화할 필요는 없음

        Do(out num); // 반환형 매개변수 전달 방식

        Console.WriteLine($"[2] {num}");
    }

    static void Do(out int num)
    {
        num = 20;
        Console.WriteLine($"[1] {num}");
    }
}

// [1] 20
// [2] 20

변환

자료형.TryParse(”변환할 내용”, out “변환이 되면 담을 그릇”)


가변 길이 매개변수(params)

using System;

class Params
{
    static void Main()
    {
        Console.WriteLine(SumAll(3,5));
        Console.WriteLine(SumAll(3,5,7));
        Console.WriteLine(SumAll(3,5,7,9));
				// 하나 이상의 값을 가변적으로 호출 중
    }

    static int SumAll(params int[] numbers)
    {
        int sum=0;
        foreach (int num in numbers)
        {
            sum += num;
        }
        return sum;
    }
}

// 8
// 15
// 24

선택적 매개변수

> static int Add(int a, int b=1)
{
	return a+b;
}
> Add(5)
6
> Add(5, 3)
8

기본값이 설정된 메서드는해당 매개변수를 생략하면 자동으로 기본값으로 초기화.

새로운 값으로 매개변수가 전달되면 그 값으로 초기화.

728x90
반응형