C#/C# 교과서
[C# 교과서] 35~37. 생성자, 소멸자, 메서드와 매개변수
서니션
2023. 1. 11. 23:21
생성자
- 단어 그대로 개체를 생성하면서 무엇인가를 하고자 할 때 사용되는 메서드
- 생성자 이름이 클래스 이름과 동일
- 클래스 내에서 클래스 이름과 동일한 이름을 갖는 메서드는 모두 생성자
- 메서드와 마찬가지로 클래스에 매개변수를 달리하여 생성자를 여러개 만들 수 있음, 이를 생성자 오버로드 또는 오버로딩이라고 함
- 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
기본값이 설정된 메서드는해당 매개변수를 생략하면 자동으로 기본값으로 초기화.
새로운 값으로 매개변수가 전달되면 그 값으로 초기화.