반올림하는 코드
num = (int)(num * 10 + 0.5) / 10.0 // 반올림
num = (int)(num * 10) / 10.0 // 버림
0.5 미만의 수는 0.5를 더해도 첫째자리 수가 변하지 않지만,
0.5 이상의 수는 0.5를 더하면 첫째자리 수가 변한다.
함수의 필요성
중복코드를 방지하고, 유지 보수에 편하다. 재활용성이 올라간다.
수학에서 말하는 함수
집합 Y의 원소가 집합X의 각 원소에 오직 하나씩만 대응할 때, 이 대응f를 집합X에서 집합Y로의 함수라 함.
프로그래밍에서의 함수
함수에 입력이 들어가면 어떤 결과가 출력
함수 정의(definition)
static <반환형> <함수형>(<매개변수 목록>)
{
// 함수 Body
}
함수를 정의할 때는 다음 것들을 포함해야함
- 함수 시그니쳐
- static
- 함수명(필수)
- 매개변수 목록(선택)
- 입력값
- int, byte와 같은 자료형 뿐만 아니라, int[], string[]같은 배열도 가능
- 함수는 0개 이상의 매개변수를 가짐(필수가 아님)
- 인자(Arguments)라고도 함.
- 반환형(필수) : 반환형이 없다면 void를 사용한다.
- 반환형이 void가 아닐 경우, 함수 Body에 return 키워드를 이용해 데이터를 반환해야함.
- 함수 Body(필수)
배열의 길이 - Length
string[] args;
int length = arg.Length;
- C#에서는 프로퍼티(property)라고 함.
- 배열의 길이를 알려준다.
함수명, 함수Body
static int Add(int op1, int op2)
{
return op1 + op2;
}
- 함수가 어떤 기능을 가졌는지 알 수 있게 지으면 가독성 증가
- 함수는 블랙박스 -> 어떤 입력을 넣으면 함수 내부구조를 알지 못해도 어떤 출력이 나오는지 알 수 있어야함. (함수명의 중요성)
함수호출
static void Main(string[] args)
{
int result = Add(1, 2)
}
함수는 반드시 블랙박스여야함
- 가독성을 위해
- 함수는 함수 호출자에 대해서 알아서는 안됨.
- 호출자가 함수 내부를 알 필요가 없게 함수명을 명확하게 지어야함.
코딩 표준: 함수 이름 짓기
- 정확하게 어떤 기능을 하는지 알려주는 단어 사용
- 동사로 시작할 것.
- 제일 첫 글자는 대문자로 (C#에서는...)
- 여러 단어를 연결한다면 두 번째 단어에서는 첫 글자를 대문자로
- 파스칼 표기법(Pascal Case)라고 함.
PrintFullName
코딩 표준: 매개변수와 지역변수 이름 짓기
- 정확하게 어떤 정보를 담는지 알려주는 단어 사용
- 명사를 사용할 것
- 제일 첫 글자는 소문자로 시작할 것
- 여러 단어를 연결한다면 '낙타표기법(Camel Case)'를 사용할 것
선조건(Precondition)과 후조건(Postcondition)
- 함수가 무슨 일을 하는지에 대한 약속
- 선조건
- 함수 실행 시작 전에 참으로 가능한 조건
- 예) Divide()함수는 분모가 0이 아니여야 한다.
- 함수 이름이나 매개변수로 유추 가능하다, 부족하면 주석으로 추가 설명
- 후조건
- 함수 실행 후에 보장되는 조건
- 예) 두 정수를 더하면 정수의 결과가 나온다.
- 보통 함수 이름과 반환형으로 유추 가능
- 선조건을 만족하지 못하면 후조건을 보장할 수 없음.
선조건을 명시한 주석
- 문서주석(Documentation Comment)라 부름.
- 비주얼 스튜디오에서는 슬래시(/)를 세 번 입력하면 자동으로 생성
범위(Scope)
- 기본적으로 어떤 범위 안에 선언된 것은 범위 밖에서 쓰지 못함
- 상위 범위에서 선언한 변수/상수는 하위 범위에서 사용 가능
값에 의한 전달
- 원본 변수 != 인자
- 함수 매개변수에 원본 변수의 사본이 전달된다.
- 호출된 함수(reciever)의 인자 값이 변경되어도 호출자(caller) 함수에 반영되지 않음.
원본 변수를 바꾸는 법
class Program
{
static void Square(ref double number)
{
number *= number;
}
static void Main(string[] args)
{
double number = 5;
Console.WriteLine(${"Before: {number}");
Square(ref number);
Console.WriteLine(${"after: {number}");
}
}
- 참조에 의한 전달 (Call by Reference)
- 인자 앞에 ref를 붙여준다.
- 원본 변수 = 인자
- 호출된 함수(reciever)의 인자의 값이 변경되면 호출자 함수(caller)에 반영
- 원본에 손상이 있을 수 있기 때문에 주의.
Best Practice: 함수 대신 중괄호
- 모든 코드를을 함수로 분리 할 필요는 없음.
- 함수가 길어지면 동일한 이름의 지역변수가 생기는 경우가 있음. -> 중괄호를 사용하여 범위를 분리시킴.
Best Practice: 함수 대신 #region과 #endregion
- C# 전용
- 긴 함수를 짧게 만들 수 있는 방법.
- 비주얼 스튜디오에서 코드를 접거나 펼 수 있게 해줌
#region <이름>
// Code
#endregion
- 함수를 따로 작성할 필요가 없음.
- 결론: 함수는 코드 중복을 피하기 위해서 만들어라.