시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
시험 성적을 출력한다.
C++
#include <iostream>
using namespace std;
int main(){
int score;
cin >> score;
char result;
if (score >= 90) {
result = 'A';
}
else if (score >= 80){
result = 'B';
}
else if (score >= 70){
result = 'C';
}
else if (score >= 60){
result = 'D';
}
else {
result = 'F';
}
cout << result;
return 0;
}
C#
using System;
class Program{
static void Main(string[] args){
int score = int.Parse(Console.ReadLine());
char result;
if (score >= 90)
result = 'A';
else if (score >= 80)
result = 'B';
else if (score >= 70)
result = 'C';
else if (score >= 60)
result = 'D';
else
result = 'F';
Console.WriteLine(result);
}
}
Python
score = int(input());
if score >= 90:
result = 'A'
elif score >= 80:
result = 'B'
elif score >= 70:
result = 'C'
elif score >= 60:
result = 'D'
else:
result = 'F'
print(result);
파이썬에서 조건문을 사용할 때는 들여 쓰기에 주의해야 한다.
Node.js
const fs = require('fs');
const inputData = fs.readFileSync('/dev/stdin').toString().trim();
const score = parseInt(inputData, 10);
let result;
if (score >= 90)
result = 'A';
else if (score >= 80)
result = 'B';
else if (score >= 70)
result = 'C';
else if (score >= 60)
result = 'D';
else
result = 'F';
console.log(result);
#include <iostream>
#include <string>
using namespace std;
int main(){
int a, b;
cin >> a;
cin >> b;
string result = "";
if (a > b)
result = ">";
else if (a < b)
result = "<";
else
result = "==";
cout << result;
return 0;
}
C#
using System;
class Program{
static void Main(string[] args){
string input = Console.ReadLine();
string[] arr = input.Split(' ');
int a = int.Parse(arr[0]);
int b = int.Parse(arr[1]);
if (a > b) input = ">";
else if (a < b) input = "<";
else input = "==";
Console.WriteLine(input);
}
}
Python
strInput = input()
arrInput = strInput.split(' ')
a = int(arrInput[0])
b = int(arrInput[1])
if a > b:
c = ">"
elif a < b:
c = "<"
else:
c = "=="
print(c);
파이썬의 경우 조건문 작성 시
if 조건 :
elif 조건 :
else :
방식으로 작성한다. 그리고 중요한 점은 파이썬의 변수의 범위는 함수 단위로 이루어지기 때문에 조건문 내부에서 선언된 c는 외부에서도 접근이 가능하다. 하지만 함수 내에서 변수를 선언했다면 외부에서 접근할 수 없다.
Node.js
const readline = require('readline');
const rl = readline.createInterface({
input:process.stdin,
output:process.stdout
});
rl.question('', (answer) =>{
let input = answer;
let arr = input.split(' ');
let a = parseInt(arr[0], 10);
let b = parseInt(arr[1], 10);
let result;
if (a > b) {
result = ">";
}
else if (a < b) {
result = "<";
}
else {
result = "==";
}
process.stdout.write(result);
rl.close();
});
node.js 에서 입력은 모듈을 사용하여 처리한다.
1. 'readline' 모듈을 사용하여 입력 인터페이스를 생성한다.
2. 'rl.question'을 사용하여 사용자로부터 숫자를 입력받는다.
더 축약한 코드
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('', (answer) => {
const [a, b] = answer.split(' ').map(Number);
const result = (a > b) ? '>' : (a < b) ? '<' : '==';
process.stdout.write(result);
rl.close();
});
꼬마 정민이는 이제 A + B 정도는 쉽게 계산할 수 있다. 이제 A + B + C를 계산할 차례이다!
입력
첫 번째 줄에 A, B, C (1 ≤ A, B, C ≤ 10^12)이 공백을 사이에 두고 주어진다.
출력
A+B+C의 값을 출력한다.
C++
#include <iostream>
using namespace std;
int main(){
long long a,b,c;
cin >> a;
cin >> b;
cin >> c;
cout << a+b+c;
return 0;
}
int 타입은 최대 - 2^31 ~ 2^31−1까지의 정수를 저장할 수 있는데 입력받을 수 있는 수의 범위는 10^12이므로 이를 저장할 수 있는 long long 타입을 사용한다. (long long은 -2^63 ~ 2^63 −1까지)
C#
using System;
class Program{
static void Main(string[] args){
string str = Console.ReadLine();
string[] arr = str.Split(" ");
long a = long.Parse(arr[0]);
long b = long.Parse(arr[1]);
long c = long.Parse(arr[2]);
Console.WriteLine(a+b+c);
}
}
C#의 int 범위는 - 2^31 ~ 2^31-1, long 범위는 -2^31 ~ 2^31-1이다
Python
str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
c = int(arr[2])
print(a+b+c)
파이썬의 경우 int는 임의 정밀도로 정해진 범위가 없고 사용할 수 있는 만큼 값을 가질 수 있다.
ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다. 불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.
입력
서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)
출력
불기 연도를 서기 연도로 변환한 결과를 출력한다.
문제를 풀기 위해서는 불기와 서기의 차이에 대한 정보가 필요한데 제목에 힌트가 있다. 두 값의 차인 543의 값을 사용해서 불기를 서기로 표시할 수 있다.
"불기 - 543 = 서기"
C++
#include <iostream>
using namespace std;
int main(){
int input;
cin >> input;
cout << input - 543;
}
C#
using System;
class Program{
static void Main(string[] args){
string input = Console.ReadLine();
int val = int.Parse(input);
Console.WriteLine(val - 543);
}
}
Python
str = input()
val = int(str)
print(val - 543)
C#과 Python의 경우에는 입력은 문자열로만 반환되기 때문에 이를 정수계산하기 위해서는 타입 변환의 과정이 필요하다.
9번 "나머지"
문제
(A+B)%C는 ((A%C) + (B%C))%C 와 같을까? (A×B)%C는 ((A%C) × (B%C))%C 와 같을까? 세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 순서대로 주어진다. (2 ≤ A, B, C ≤ 10000)
출력
첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A×B)%C, 넷째 줄에 ((A%C) × (B%C))%C를 출력한다.
using System;
class Program{
static void Main(string[] args){
string input = Console.ReadLine();
string[] arr = input.Split(" ");
int a = int.Parse(arr[0]);
int b = int.Parse(arr[1]);
int c = int.Parse(arr[2]);
Console.WriteLine((a+b)%c);
Console.WriteLine(((a%c)+(b%c))%c);
Console.WriteLine((a*b)%c);
Console.WriteLine(((a%c)*(b%c))%c);
}
}
Python
str = input();
arr = str.split(" ");
a = int(arr[0]);
b = int(arr[1]);
c = int(arr[2]);
print((a+b)%c);
print(((a%c)+(b%c))%c);
print((a*b)%c);
print(((a%c)*(b%c))%c);
이 문제는 받아쓰기만 틀리지 않고 잘하면 어려움이 없는 문제였다.
10번 "곱셈"
문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세 자리 자연수가 주어진다.
출력
첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.
우선 입력받은 두 값을 곱셈하여 저장해 놓고 첫 번째 입력받은 값을 기준으로 하고 두 번째 입력값을 자릿수별로 잘라서 변수에 저장한다. 그리고 각 자릿수마다 기준 값과 곱한 값을 출력하고 처음 계산한 곱셈을 출력하면 될듯하다.
C++
#include <iostream>
#include <string>
using namespace std;
int main(){
int val1;
int val2;
cin >> val1;
cin >> val2;
int result4 = val1*val2;
string str = to_string(val2);
int a = str[2] - '0';
int b = str[1] - '0';
int c = str[0] - '0';
int result1 = val1*a;
int result2 = val1*b;
int result3 = val1*c;
cout << result1 << endl;
cout << result2 << endl;
cout << result3 << endl;
cout << result4 << endl;
return 0;
}
C#
using System;
class Program{
static void Main(string[] args){
string str_1 = Console.ReadLine();
string str_2 = Console.ReadLine();
int val_1 = int.Parse(str_1);
int val_2 = int.Parse(str_2);
int a = (int)char.GetNumericValue(str_2[2]);
int b = (int)char.GetNumericValue(str_2[1]);
int c = (int)char.GetNumericValue(str_2[0]);
int result_1 = val_1 * a;
int result_2 = val_1 * b;
int result_3 = val_1 * c;
int result_4 = val_1 * val_2;
Console.WriteLine(result_1);
Console.WriteLine(result_2);
Console.WriteLine(result_3);
Console.WriteLine(result_4);
}
}
C#에서 단일 문자의 경우 int.Parse는 에러가 발생한다. 따라서 문자를 정수로 전환하기 위해서 char.GetNumericValue를 사용한다.
또는 문자가 숫자일 경우에는 아스키코드를 활용해서 정수로 변환할 수 있다.
아스키코드에서 '0' 문자는 48이다. 그리고 그 뒤로 연속으로 값이 증가하는데 즉 '1' - '0' = 49 - 48 이므로 결과는 1로 정수 값을 구할 수 있게 된다.
int a = (int)char.GetNumericValue(str_2[2]);
int b = (int)char.GetNumericValue(str_2[1]);
int c = (int)char.GetNumericValue(str_2[0]);
// ASCII
int a = str_2[2] - '0';
int b = str_2[1] - '0';
int c = str_2[0] - '0';
Python
str_1 = input()
str_2 = input()
val_1 = int(str_1)
val_2 = int(str_2)
a = int(str_2[2])
b = int(str_2[1])
c = int(str_2[0])
result_1 = val_1 * a
result_2 = val_1 * b
result_3 = val_1 * c
result_4 = val_1 * val_2
print(result_1)
print(result_2)
print(result_3)
print(result_4)
using System;
class Program{
static void Main(string[] args){
string input = Console.ReadLine();
string[] arr_input = input.Split(' ');
int a = int.Parse(arr_input[0]);
int b = int.Parse(arr_input[1]);
Console.WriteLine(a+b);
Console.WriteLine(a-b);
Console.WriteLine(a*b);
Console.WriteLine(a/b);
Console.WriteLine(a%b);
}
}
ReadLine으로 입력을 한 줄로 받고 string.Split을 사용해서 공백으로 두 값을 구분하여 사용한다.
Python
str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b, a-b, a*b, a//b, a%b, sep='\n')
파이썬의 경우 '/' , '//' 연산자가 존재한다.
앞의 두 언어들은 연산하는 두 값이 모두 int 타입이기 때문에 / 연산자를 사용하여 계산하게 되면 결과도 정수형으로 반환되기 때문에 소수점은 버려지게 된다. 하지만 파이썬의 경우 정수형간의 나눗셈은 float으로 반환하기 때문에 문제에서 몫만을 출력해야 하고 이를 위해서는 몫을 구하는 연산자 '//'를 사용해야 한다.
#include <iostream>
using namespace std;
int main(){
cout << "Hello World!";
return 0;
}
C++ 너무 오랜만에 하다 보니 처음에 입출력 라이브러리 이름이 기억이 안 났다.
iosteam (input/output stream) 입력과 출력의 기능을 사용할 수 있는 라이브러리이다.
cout을 사용하려면 std:: 네임스페이스를 사용해야 하는데 이걸 생략하기 위해서 using으로 네임스페이스를 선언한다.
C#
using System;
class Program{
static void Main(string[] args){
Console.WriteLine("Hello World!");
}
}
System 네임스페이스에 포함된 Console 클래스의 함수인 WirteLine을 사용해서 문자를 출력한다.
Python
print("Hello World!")
이렇게 보니 파이썬의 간단함에 새삼스럽게 놀란다.
2번
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A+B를 출력한다.
C++
#include <iostream>
using namespace std;
int main(){
int a, b;
cin >> a;
cin >> b;
cout << a + b;
}
입력받은 값을 저장하기 위한 변수 a, b 선언 후 합을 출력
C#
using System;
class Program
{
static void Main(string[] args)
{
string str = Console.ReadLine();
string[] arr = str.Split(' ');
int a = int.Parse(arr[0]);
int b = int.Parse(arr[1]);
Console.WriteLine(a + b);
}
}
채점 시 한 줄에 두 값을 모두 주기 때문에 Read 사용 시 입력을 제대로 받지 못한다.
따라서 문자열로 받은 다음 값을 잘라서 정수로 변환하여 출력하여야 한다.
Python
str = input()
arr = str.split(' ')
a = int(arr[0])
b = int(arr[1])
print(a+b)
파이썬도 마찬가지로 문자로 입력받은 다음 값을 잘라서 처리한다.
4번 문제까지는 연산 기호만 달라서 문제만 풀고 따로 남기지 않는다.
5번
문제
두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10의 -9승 이하이면 정답이다.
C++
#include <iostream>
using namespace std;
int main(){
double a, b;
cin >> a;
cin >> b;
double res = a/b;
cout.precision(10);
cout << res;
}
소수점 자릿수를 정확하게 출력하기 위해서 추가 작업이 필요하다.
오차를 인정하는 범위가 있기 때문에 소수점 9자리까지 구해야 한다.
cout.precision(n)은 n자리까지 정수부+소수부의 n개까지의 수를 표시해 준다.
문제에서 대입하는 수의 범위는 나누었을 때 정수부가 1자리 이하이기 때문에 precision(10)을 하면 소수점 9자리까지 나오게 된다.
C#
using System;
class Program
{
static void Main(string[] args)
{
string str = Console.ReadLine();
string[] arr = str.Split(' ');
double a = double.Parse(arr[0]);
double b = double.Parse(arr[1]);
Console.WriteLine(a / b);
}
}
float의 정확도는 7번째 자리이기 때문에 double을 사용한다.
Python
str = input()
arr = str.split(' ')
a = float(arr[0])
b = float(arr[1])
print(a/b)
파이썬의 경우 double은 따로 없으며 float이 C의 double을 기반으로 15자리까지의 정확도를 가진다.
extern 키워드를 사용하면 플랫폼 간 상호 운용성, 성능 최적화, 코드의 안전성과 에러 처리를 모색할 수 있다.
플랫폼 간 상호 운용성
C# 언어를 사용하는 프로젝트에서 이외의 언어로 작성된 라이브러리 함수를 호출하는 경우는 아주 흔하게 발생하는 상황이다. 예를 들어서 C#에서 Windows API를 호출하려면 DllImport 속성을 사용해서 C# 코드에서 네이티브 코드 함수를 선언해야 한다. 이를 통해 C# 프로그램에서 운영 체제 수준의 다양한 기능을 직접적으로 사용할 수 있다.
Windows API 중 몇 가지 간단한 함수를 사용해 본다.
namespace Test
{
using System;
using System.Text;
using System.Runtime.InteropServices;
internal class Program
{
[StructLayout(LayoutKind.Sequential)]
public struct SYSTEMTIME
{
public ushort Year;
public ushort Month;
public ushort DayOfWeek;
public ushort Day;
public ushort Hour;
public ushort Minute;
public ushort Second;
public ushort Milliseconds;
}
[DllImport("Kernel32.dll")]
public static extern bool SetConsoleTitle(string title);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
public static extern uint GetConsoleTitle(StringBuilder buffer, uint size);
[DllImport("Kernel32.dll")]
public static extern void GetSystemTime(out SYSTEMTIME st);
static void Main(string[] args)
{
SetConsoleTitle("Bak's Console");
Console.WriteLine("Hello, World!");
StringBuilder buffer = new StringBuilder(256); // Define buffer size according to your need
GetConsoleTitle(buffer, (uint)buffer.Capacity);
Console.WriteLine("Console Title: " + buffer.ToString());
SYSTEMTIME st;
GetSystemTime(out st);
Console.WriteLine("Current System Time: {0}-{1}-{2} {3}:{4}:{5}.{6}",
st.Year, st.Month, st.Day, st.Hour, st.Minute, st.Second, st.Milliseconds);
Console.ReadLine();
}
}
}
실행 결과
외부 함수 SetConsoleTitle을 사용해서 실행되는 콘솔의 타이틀을 변경하고 GetConsoleTitle을 사용해서 변경한 콘솔의 타이틀을 가지고 와서 콘솔에 찍어본다. 그리고 GetSystemTime을 사용해서 현재 실행 중인 장치의 시간을 가지고 온다.
코드를 보면 알 수 있듯이 필요한 기능을 사용하기 위해서는 어트리뷰트를 선언할 때 추가로 필요한 값들이나 사용하고자 하는 함수의 반환값, 필요한 파라미터 등에 대한 정보들이 필요하다.
이러한 정보들은 마이크로소프트 공식 문서나 또는 이를 주제로 하는 커뮤니티에서 확인할 수 있고 이외 라이브러리들도 제공하는 곳에서 API 문서를 확인할 수 있다.
성능 최적화
C# 코드 내에서 수학 계산이나 이미지 처리와 같은 고성능의 연산을 요구하는 네이티브 라이브러리 함수를 호출하는 방법이 있다. 이러한 방식은 매니지드 코드(Managed Code)에 비해 실행 속도가 빠른 네이티브 코드의 이점을 활용할 수 있게 해 준다.
네이티브 코드를 사용하는 것이 언제나 성능적으로 이점이 있다고 할 수는 없으므로 해당 목적을 위해서 외부 라이브러리를 사용한다고 했을 때에는 .Net 환경에서 이미 최적화된 상태인 C# 라이브러리의 성능과 비교해서 네이티브 코드를 사용했을 때에 성능적인 이점이 있을 때 사용하는 것이 좋다.
// 몬스터 인터페이스 정의
public interface IMonster
{
void Attack();
}
// 구체적인 몬스터 클래스
public class Zombie : IMonster
{
public void Attack()
{
Console.WriteLine("Zombie attacks!");
}
}
public class Vampire : IMonster
{
public void Attack()
{
Console.WriteLine("Vampire attacks!");
}
}
// 몬스터 생성을 위한 팩토리 클래스
public abstract class MonsterFactory
{
public abstract IMonster CreateMonster();
}
public class ZombieFactory : MonsterFactory
{
public override IMonster CreateMonster()
{
return new Zombie();
}
}
public class VampireFactory : MonsterFactory
{
public override IMonster CreateMonster()
{
return new Vampire();
}
}
class Program
{
static void Main(string[] args)
{
MonsterFactory factory = new ZombieFactory();
IMonster monster = factory.CreateMonster();
monster.Attack();
factory = new VampireFactory();
monster = factory.CreateMonster();
monster.Attack();
}
}
특히 다양한 객체가 동일한 인터페이스를 공유하거나 시스템 구성 요소 간의 결합도를 낮추기 원할 때 유용하며 객체의 생성과 클래스의 구현을 분리함으로써 모듈화 된 코드 구조를 가능하게 한다.
빌더 패턴 (Builder Pattern)
빌더 패턴은 복잡한 객체의 생성과정을 단계별로 나누어 구축하는 디자인 패턴으로 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 다양한 표현 결과를 얻을 수 있도록 한다. 주로 복잡한 객체를 조립해야 할 때 사용되며 각 부분의 조립 순서를 외부에서 지정할 수 있다.
// 캐릭터의 인터페이스 정의
public interface ICharacter
{
void EquipWeapon(string weapon);
void EquipArmor(string armor);
void AddAbility(string ability);
}
// 캐릭터 빌더 인터페이스
public interface ICharacterBuilder
{
ICharacterBuilder BuildWeapon(string weapon);
ICharacterBuilder BuildArmor(string armor);
ICharacterBuilder BuildAbility(string ability);
Character Build();
}
// 구체적인 캐릭터 빌더
public class HeroBuilder : ICharacterBuilder
{
private Character _character = new Character();
public ICharacterBuilder BuildWeapon(string weapon)
{
_character.EquipWeapon(weapon);
return this;
}
public ICharacterBuilder BuildArmor(string armor)
{
_character.EquipArmor(armor);
return this;
}
public ICharacterBuilder BuildAbility(string ability)
{
_character.AddAbility(ability);
return this;
}
public Character Build()
{
return _character;
}
}
// 사용 예
public class Game
{
public void CreateHero()
{
HeroBuilder builder = new HeroBuilder();
Character hero = builder.BuildWeapon("Sword")
.BuildArmor("Shield")
.BuildAbility("Invisibility")
.Build();
}
}
캐릭터가 가지는 공통적인 기능을 인터페이스로 구현한 다음 구체적인 캐릭터 클래스에서 원하는 옵션으로 조립할 수 있도록 단계를 구분한다.
할당된 메모리는 해당 객체에 대한 모든 참조가 없어질 때까지 메모리에 존재하고 더 이상 참조되지 않을 때 GC에 의해 관리된다.
public class MyClass
{
public int Number { get; set; }
}
public class Program
{
public static void Main()
{
MyClass myObject = new MyClass();
myObject.Number = 1;
Console.WriteLine(myObject.Number);
}
}
생성자
생성자는 객체가 할당될 때 호출되는 생명주기 메서드(Lifecycle Methods)이다.
클래스의 객체를 생성하는 방식을 생각해 보면 new 키워드 뒤에 클래스명의 함수를 쓰는데 이 함수는 클래스에서 따로 작성하지 않았는데도 문제없이 컴파일된다.
MyClass myObject = new MyClass();
그 이유는 클래스에 별도로 생성자에 대한 작성을 하지 않아도 컴파일 단계에서 자동으로 기본 생성자를 만들어서 사용하기 때문에 컴파일 에러가 발생하지 않게 된다.
기본 생성자의 형태는 클래스 명의 메서드로 함수 내부에는 비어있는 형태로 볼 수 있다.
public class MyClass
{
public int Number { get; set; }
// 기본 생성자 형태
public Number(){}
}
public class Program
{
public static void Main()
{
MyClass myObject = new MyClass();
myObject.Number = 1;
Console.WriteLine(myObject.Number);
}
}
생성자의 접근제한자를 private 등을 사용해서 클래스의 인스턴스 생성을 제한할 수 있다.
생성자는 파라미터를 추가한 형태로 선언이 가능하며 클래스의 인스턴스가 생성될 때 필드나 프로퍼티를 초기화하는 방법으로 사용할 수 있다.
public class MyClass
{
public int Number { get; set; }
private string _id;
private string _pw;
private int _age;
private bool _isAgree;
// 기본 생성자 형태
public Number(string id, string pw, int age, bool isAgree)
{
_id = id;
_pw = pw;
_age = age;
_isAgree = isAgree;
}
}
public class Program
{
public static void Main()
{
MyClass myObject = new MyClass("bak", "****", 19, true);
// 에러 발생
MyClass myObject = new MyClass();
}
}
이렇게 하면 인스턴스를 생성과 동시에 필드값을 초기화할 수 있다.
주의할 점은 이렇게 파라미터를 받는 생성자를 작성하게 되면 컴파일러에서는 더 이상 기본 생성자는 만들어 주지 않기 때문에 기본 생성자를 사용하려고 하면 컴파일 에러가 발생하게 되므로 기본 생성자도 사용하기를 원하면 추가로 작성해야 한다. 즉 생성자도 오버로딩이 가능하기 때문에 다양한 매개변수를 받는 생성자의 선언이 가능하다.
소멸자
생성자와는 호출 시점에만 차이가 있는 생명주기 메서드이다. (파괴자라고도 한다.)
소멸자는 객체가 소멸되는 시점에 호출되며 C#에서는 더 이상 객체가 참조되는 곳이 없을 때 GC에 의해서 관리되어 소멸될 때 소멸자가 호출된다.
따라서 소멸자의 호출 시점이 명확하지 않으므로 소멸자 내부에서 어떠한 기능을 수행시키게 한다면 동작에 대한 기대가 힘들기 때문에 C#에서는 이를 활용하는 경우는 드물다.
public class MyClass
{
public Number(){}
// 소멸자 선언
~Number(){}
}