코딩을 하다 보면. net에서 제공해주는 함수 말고 직접 만들어서 사용할 경우가 생긴다. 사용자 정의 함수는 어떻게 만들어 사용하는지 알아보자. 같은 namespace에 있는 class를 사용하는 방법이 있고, 다른 namespace에 있는 class를 사용하는 방법도 있지만 이번에는 같은 namespace에 있는 데이터를 사용해보려고 한다.
1. Class 선언 방식
class 클래스 이름
{
[한정자] [static] [반환 형식] [메소드의 이름] ( 매개 변수 목록 )
{
//실행하고자 하는 코드
return 메소드의 결과; // 메소드 결과의 데이터 형식은 반환 형식과 일치
}
}
1.1 한정자
한정자란 사용자가 만드는 메서드를 호출할 수 있는 권한을 정해 놓는 것이다.
public : 공개(누구나 접근하여 사용)
protected : 일부 공개(자신이 만들어진 class 또는 이를 상속받는 하위 class에서만 사용)
private : 비공개(자신의 class에서만 사용)
1.2 static
static은 정적메소드로 프로그램이 처음 실행될 때 메모리에 자동적으로 생성이 됩니다. static 키워드는 변수나 함수, 클래스가 객체(인스턴스) 단위가 아니라 클래스 단위로 생성하여 사용할 수 있게 한다. 구체적인 예는 아래에서 보여드리도록 하겠다!
1.3 반환 형식
메소드가 반환할 데이터 형식을 지정해준다. void, int, string, class 등이 있다. 메소드의 결과는 선언된 반환 형식과 동일해야 한다. void는 반환할 게 없을 때 사용이 되며 return을 쓰지 않아도 된다.
1.4 매개변수
메소드에서 사용될 데이터를 어떻게 받을지 사용자가 정의한다. 없을 수도 있고 여러 개가 올 수도 있다. 매개변수는 입력 타입을 직접 정의해서 넣어줘야 한다.
2. Class 예제
동일한 namespace에서 두 개의 파일을 만들어서 한 개의 파일은 사용자 정의 함수를 만들고 다른 파일에서 그 함수를 사용하려고 한다.
우선, 사용자 정의 함수를 정리할 MyLibrary 클래스를 만든다.
특정 범위의 지정한 배수의 총합을 구하는 함수를 만든다고 하자.
2.1 public static으로 만든 함수
//MyLibrary.cs
namespace ConsoleAppMethod
{
class MyLibrary
{
public static int SumCalc(int minValue, int maxValue, int num)
{
int sum = 0;
for (int i = minValue; i < maxValue; i++) // minValue부터 maxValue까지 1씩 증가시키면서 num의 배수인지 체크하기
{
if (i % num == 0)
sum += i; // 값을 num으로 나누었을 때 나머지가 0이면 sum에 계속해서 더해주기
}
return sum; //총합을 반환
}
}
}
다음으로는 사용자 정의 함수를 사용할 main 파일을 만들자.
사용자 정의 함수를 어떻게 사용할까? 위와 같이 만들었다면 아래의 방법대로 사용하면 된다.
[메소드의 반환 형식] [변수 이름] = [클래스명].[메소드의 이름](매개 변수 목록);
//Program.cs
namespace ConsoleAppMethod
{
class Method_ex1
{
static void Main()
{
int tot = MyLibrary.SumCalc(0, 10, 2);
Console.WriteLine(tot); // 20 (2+4+6+8)
}
}
}
2.2 public 으로 만든 함수
그렇다면 위에서 말한 한정자와 static에 따라서는 어떻게 바뀔까? static을 사용하면 객체가 아니라 클래스 단위로 사용하게 해 준다. 그러므로 static을 사용하지 않으면 객체를 생성해야 해당 함수를 사용할 수 있다.
// MyLibray.cs 의 함수 일부
public int SumCalc(int minValue, int maxValue, int num)
위에 처럼 함수를 만들면 아래와 같이 함수를 사용해야 한다.
[클래스명] [객체 이름] = new [클래스명]();
[객체 이름].[메소드 이름]( 매개 변수 목록);
//Program.cs
namespace ConsoleAppMethod
{
class Method_ex1
{
static void Main()
{
MyLibrary tot = new MyLibrary();
Console.WriteLine(tot.SumCalc_(0, 10, 2)); //20
}
}
}
2.3 private으로 만든 함수
public으로 지정하지 않으면 기본 값으로 private 함수로 만들어진다. private 함수로 만들면 위에 방법들로는 사용자 지정 함수를 사용할 수 없다.
//MyLibrary.cs
int SumCalc(int minValue, int maxValue, int num)
{
int sum = 0;
for (int i = minValue; i < maxValue; i++)
{
if (i % num == 0)
sum += i;
}
return sum;
}
public int priSumCalc(int minValue, int maxValue, int num) //같은 클래스에서는 다른 private 함수를 사용할 수 있다.
{
return SumCalc(minValue, maxValue, num);
}
//Program.cs Main() 함수 안에
MyLibrary tot = new MyLibrary();
Console.WriteLine(tot.priSumCalc(0, 10, 2)); //20
위와 같이 같은 class 내에서 다른 함수가 private 함수를 불러오고 해당 함수를 public으로 만들어서 사용하면 다른 class에서도 사용할 수 있다. (굳이 위의 예시처럼 할 필요는 없고 예시로 만든 것이다!!)
2.4 메소드 오버로딩 (Method Overloading)
함수를 만들다 보면 이런 생각이 들것이다. 꼭 매개 변수를 지정된 개수만큼 넣어줘야 하나? 나는 범위를 기본적으로는 0부터 시작하고 싶은데 라고 생각이 들 수도 있다. 그러면 함수를 하나 더 만들어야 하나?
이럴 때 사용하는 것이 오버로딩이다.
public static int SumCalc(int minValue, int maxValue, int num)
{
int sum = 0;
for (int i = minValue; i < maxValue; i++) // minValue부터 maxValue까지 1씩 증가시키면서 num의 배수인지 체크하기
{
if (i % num == 0)
sum += i; // 값을 num으로 나누었을 때 나머지가 0이면 sum에 계속해서 더해주기
}
return sum; //총합을 반환
}
public static int SumCalc(int maxValue, int num)
{
int sum = 0;
for (int i = 0; i < maxValue; i++) // 0부터 maxValue까지 1씩 증가시키면서 num의 배수인지 체크하기
{
if (i % num == 0)
sum += i; // 값을 num으로 나누었을 때 나머지가 0이면 sum에 계속해서 더해주기
}
return sum; //총합을 반환
}
public static void SumCalc(int maxValue, int num)
{
int sum = 0;
for (int i = 0; i < maxValue; i++)
{
if (i % num == 0)
sum += i;
}
Console.WriteLine($"합계는 : {sum}입니다."); ;
}
함수의 명이 같아도 [매개 변수 목록]이나 [반환 타입]이 바뀌면 함수를 여러 개 만들 수 있다.
public static int SumCalc(int maxValue, int num)
static int SumCalc(int maxValue, int num)
다만, 이렇게 public/private, static 이 달라지는 경우는 동일한 함수를 만들 수 없다.
'스마트한 개발 공부 > C#' 카테고리의 다른 글
[C#] 상속과 interface(인터페이스) 그리고 abstract class(추상 클래스) (0) | 2021.08.18 |
---|---|
[C#] Method의 Parameter 전달방식과 Shallow, Deep Copy (0) | 2021.08.17 |
[C#] 제어문(선택문 - 연산자, if, switch && 반복문 - for, while ) (0) | 2021.08.14 |
[C#] Random 을 사용과 입력값 형변환 및 String 타입(가변, 불변) (0) | 2021.08.14 |
[C#] Data Type의 종류 및 특징과 형 변환 (0) | 2021.08.03 |