첫 번째 값 / 첫 번째 값 혹은 기본값
메소드 이름 그대로의 뜻은 대충 알고 있지만, 확실히는 몰랐던 부분...!
출처: C# 코딩의 기술: 실전편 - 3.1 First와 FirstOrDefault 중 선택은?
두 메소드를 바라봐야하는 관점 : '어느 쪽이 맞는가' (x), '적재적소에 사용하는 것' (o)
+) Last vs. LastOrDefault, Single vs. SingleOrDefault도 같은 차이!
First | FirstOrDefault | |
공통점 | 순서가 첫번 째인 요소를 가져온다 | |
글자 수 | 5글자 | 14글자 (쓰기도 어렵고, 읽기도 어려움) 이것까지 비교항목에 넣어야하나 싶었지만, 책에서 글자수의 차이는 중요한 사항이라고 얘기하고 있음 |
첫 번째 요소가 없을 때, | 예외 발생 (무거운 처리 -> 피하는 것이 좋음) | 기본값(참조 형식이면 null)을 반환 |
사용할 경우 | 첫 번째 값에 해당하는 요소가 있는지 아는 경우 (첫 번째 요소가 없는 것이 발생하지 않는 경우라면, 남은 차이점은 메소드의 글자 수 밖에 없고 글자 수가 적은 쪽이 편리 = First가 유리) |
조건에 맞는 문자를 찾지 못하는 경우가 자주 있을 때 (= 요소가 없을 가능성이 있다면) |
* Default(): 확실하게 요소가 존재한다는 것을 아는 경우 ( = 예외 문제를 무시해도 되는 경우)
using System;
using System.Linq;
class Program
{
public static void Main(string[] args)
{
for (; ; )
{
var s = Console.ReadLine();
if (string.IsNullOrEmpty(s)) return;
Console.WriteLine("이름의 첫 번째 글자는 {0}입니다.", s.First());
}
}
예외가 발생하지 않는 이유)
IsNullOrEmpty -> First 메소드로 불러올 수 있는 문자가 없을 때, 루프를 끝내고(=예외가 발생하지 않고) 프로그램을 종료
예문은 IsNullOrEmpty를 사용했지만, 코드에서 null처리를 해주는 것도 동일하게 예외가 발생하지 않는 경우로 봐도 될 것 같다!
동일한 코드를 null처리로 바꿔본다면
for (; ; )
{
var s = Console.ReadLine();
if (s != "")
{
Console.WriteLine("이름의 첫 번째 글자는 {0}입니다.", s.First());
return;
}
}
이 될 수 있을 것이다
cf. 문자열 != "" vs string.IsNullOrEmpty(문자열)
문자열 != "" | string.IsNullOrEmpty(문자열) | string.IsNullOrWhiteSpace(문자열) | |
확인 | 문자열이 빈 문자열인지만 확인 | 문자열이 빈 문자열인지, null 인지 확인 |
문자열이 빈 문자열인지, null 인지, 공백 문자인지 확인 (IsNullOrEmpty 검사 확장) |
true 반환 경우 | 문자열인 null인 경우 | 문자열이 null이거나 빈 문자열("")인 경우 |
문자열이 null이거나 공백 문자만 포함하는 경우 |
NullReferenceException | 발생 가능 | 발생 x |
* FirstOrDefault(): 조건에 맞는 문자가 없을 가능성이 있는 경우
using System;
using System.Linq;
class Program
{
public static void Main(string[] args)
{
for (; ; )
{
var s = Console.ReadLine();
if (string.IsNullOrWhiteSpace(s)) return;
var ch = s.FirstOrDefault(c => char.IsNumber(c));
if (ch == default(char))
Console.WriteLine("없어요");
else
Console.WriteLine("이름에 있는 첫 번째 숫자 {0}입니다.", ch);
}
}
}
조건에 맞는 첫 번째 값이 없는 경우, 기본값으로 설정해둔 "없어요"를 출력
즉, 주어진 조건과 일치하지 않는 경우를 처리하는 안전한 방법을 제공하는 것으로 볼 수 있다. (= 예외를 방지하는 방법!)
'공부 > C#' 카테고리의 다른 글
[C#]클래스 vs. 구조체 (0) | 2023.12.18 |
---|---|
[C#/궁금증]기본 데이터 형식(15가지)는 전부 값형식일까? (0) | 2023.12.17 |
[C#]if문 vs switch문 (1) | 2023.12.05 |
[C#]var 사용법 (1) | 2023.11.29 |
[C#]readonly vs. const (1) | 2023.11.27 |