공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
지난 포스팅에서는 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));
}
}
}
지금까지 메소드에 대해 공부했습니다.
이상입니다. 감사합니다.
다음 포스팅에서는 이벤트에 대해 공부합니다.