C#

C#문법-11 : Nullable Type, 메소드 파라미터

알통몬_ 2019. 4. 24. 11:20
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 

지난 포스팅에서는 C# 클래스에 대해 공부했습니다.

2019/04/24 - [C#] - C#문법-10 : 클래스 - 메소 드, 프로퍼티, 필드, 이벤트


이번 포스팅에서는 Nullable Type 과 메소드 파라미터에 대해

공부합니다.


Nullable Type

정수, 실수, 구조체 같은 값 타입은 null 이라는 값을 가질 수

없습니다. 하지만 C#에서는 값 타입도 null 값을 가질 수 

있도록 Nullable Type을 지원합니다.

Nullable Type은 값을 가지면서 null 인지 상태 체크를

할 수 있는 기능을 같이 가지고 있는 구조체입니다.

값 타입 선언시 변수 타입? 와 같이 물음표를 붙이면

해당 타입이 아닌 Nullable형 타입이라는 것을 의미합니다.

int a = 0; // 정수 타입

int? b = null; // Nullable 정수 타입

using System;
using System.Text;

namespace workspace_csharp {

class Program {
int? a;

void method() {
if(a.HasValue) {
Console.WriteLine(a);
} else {
Console.WriteLine("a는 값이 없습니다.");
}
}
}
}

Nullable 타입이 값을 실제로 가지고 있는지 확인하는 기능을 제공

한다고 위에서 언급했는데 위 예제를 보시면 HasValue 라는 코드가

보입니다. .HasValue를 사용하면 a가 값이 있는지 없는지를

bool 타입 값으로 반환해줍니다.


Nullable static Class

Nullable 정적 클래스는 두 Nullable 객체를 비교하는 메소드를

제공하고 Nullable 타입이 어떤 값 타입에 기반을 두고 있는지

알려주는 메소드를 제공합니다.

using System;
using System.Text;
using System.Reflection;

namespace workspace_csharp {

public class Program {
int? a = null;
int? b = 0;

public void method() {
int rst = Nullable.Compare(a, b);
Console.WriteLine(rst);

bool rst2 = Nullable.Equals(a, b);
Console.WriteLine(rst2);
Type c = typeof(Program);
MethodInfo methodInfo = c.GetMethod("IntMethod");
Type returnVal = methodInfo.ReturnType;
Type result = Nullable.GetUnderlyingType(returnVal);

Console.WriteLine("instance of " + result);
}
public static void Main(String[] args) {
Program program = new Program();
program.method();
}

public int? IntMethod() {
return -100;
}

}
}


자바에서 클래스의 타입을 체크할 때 instanceof 를 사용하는게

생각이 나네요 ㅎㅎ

[ 광고 보고 가시죠! ]



[ 감사합니다! ]


메소드 파라미터

메소드 구조

[접근제한자] 반환타입 메소드이름([파라미터,...]) {

return [value];

}

대괄호는 생각이 가능하다는 뜻입니다.

예를 들어 접근 제한자는 뒤에서 공부하겠지만

public int GetUserAge() {

[return 10];

}

이런 식으로 메소드를 선언할 수 있습니다.

반환타입이 void 이면 [return ..;] 이 생략될 수 있고,

메소드는 하나의 반환 값만 가집니다.


그리고 메소드 선언 시 시작하는 글자를 대문자로 시작하고

낙타식 표기법을 사용하는 것이 관례입니다.

Pass By Value 와 Pass By Reference

using System;
using System.Text;

namespace workspace_csharp {

public class Program {

int Add100(int input) {
return input + 100;
}

// ref method
int RefMethod(ref int a, ref int b) {
return a++ - b++;
}

// out method
int OutMethod(int a, int b, out int x, out int y) {
x = a * b;
y = a - b;
return x + y;
}


public static void Main(String[] args) {
Program program = new Program();

// 값을 복사해 전달하는 Pass By Value 방식
int origin = 100;
int newVal = program.Add100(origin);


// 참조를 전달하는 Pass By Reference
// ref or out 키워드를 사용합니다.
// 메소드 내에서 변경된 값이 리턴 후에도 유효합니다.
// ref 와 out 의 차이점은
// ref는 초기화가 필요하지만,
// out은 초기화가 없어도 됩니다.
int i = 100;
int j = 10;
int refRst = program.RefMethod(ref i, ref j);

Console.WriteLine(refRst);

int k, l;
int outRst = program.OutMethod(100, 10, out k, out l);

Console.WriteLine(outRst);

}



}
}


Named Parameter

using System;
using System.Text;

namespace workspace_csharp {

public class Program {
void setData(string name, string id, int age, string gender) {
Console.WriteLine("name = " + name);
Console.WriteLine("id = " + id);
Console.WriteLine("age = " + age);
Console.WriteLine("gender = " + gender);
}

public static void Main(String[] args) {
Program program = new Program();
//일반적 사용;
program.setData("박성균", "altongmon", 28, "남성");

// Named Parameter;
// 선언된 메소드의 파라미터 위치, 순서와 상관 없이
// 파라미터 이름 : 값 으로 선언해주면 됩니다.
program.setData(age : 28, gender : "남성", id : "Thomas", name : "박성균");
}



}
}


Optional Parameter : 메소드의 파라미터가 기본 값을 가지고

있다면 메소드 호출 시 해당 파라미터를 생략할 수 있습니다.

using System;
using System.Text;

namespace workspace_csharp {

public class Program {

int getPoint(char grade = 'A') {
switch(grade) {
case 'A':
return 90;
case 'B':
return 80;
case 'C':
return 70;
case 'D':
return 60;
default:
return 50;
}
}

public static void Main(String[] args) {
Program program = new Program();
//Optional Paramter
Console.WriteLine(program.getPoint());

Console.WriteLine(program.getPoint('B'));
}

}
}


메소드의 파라미터가 몇 개가 들어올 지 모르는 경우가 있을 수

있습니다. 그런 경우 자바는 ... 을 사용할 수 있는데

C#에서는 params 키워드를 사용합니다.

using System;
using System.Text;

namespace workspace_csharp {

public class Program {

int getAvg(params int[] point) {
int avg = 0;
for(int i = 0; i < point.Length; i++) {
avg += point[i];
}
avg /= point.Length;
return avg;
}

public static void Main(String[] args) {
Program program = new Program();
//Optional Paramter
Console.WriteLine(program.getAvg(10, 20, 30, 40 ,50));

Console.WriteLine(program.getAvg(100, 85, 77, 93, 66, 58, 99));
}

}
}


지금까지 메소드에 대해 공부했습니다.

이상입니다. 감사합니다.

다음 포스팅에서는 이벤트에 대해 공부합니다.

반응형