- 특정 행동을 취하는 코드의 집합
- 함수(Function), 프로시저(Procedure) 등..
- 객체의 행동
- 강제성은 없으나 어떤 특정 행동에 대한 코드들을 그룹으로 묶어 관리하는 측면
- 정적메서드(공용) vs 객체메서드(멤버)
클래스 안에서만 선언 가능 클래스 자식 수준에서 선언 가능
메서드 안에 메서드 선언 불가능, 모든 코딩은 메서드 안에서
이루어 진다.
클래스 밖에서 선언 한것은 자료형이라는것을 생성하기 위한 Enum,
Struct 를 제외한 모든 것들은 클래스 내에 기록된다.
- 모든 메서드는 클래스의 자식(멤버)
1. 메서드 선언(정의)
- 접근지정자 정적키워드 반환형 메서드명(인자리스트)
{
메서드 본문(body)
}
2. 메서드 호출(실행)
- 메인 메서드는 계속 실행되게 되있으며 우리가만든 메서드는 직접적으로 호출하지 않는경우 메서드 호출이 되지
않는다.
C#에서의 코드의 실행순서(제어 흐름)는 위에서 아래로 라인단위!! -> Main()메서드의 첫줄부터
흐름이 시작 ..*******************
메서드 호출이 시작되면 제어 흐름이 위에서 아래에서 선언된 메소드로 이동하면서 위에서 아래로 흐르지 않는다.
* 메서드 사용 장점
- 유지 보수성이 높다.
- 코드의 수정이 용이
- 개발성이 높다(생산성이 높다.
적은 코드의 동일한 업무가 가능)
- 가독성이 높다(코드의 성질에 따라 영역이 분리)
*** 무조건 2회이상 반복되는 코드가 발생하면 무조건 메서드를 만들어서
사용하도록 한다.
*** 하나의 메서드안에서 각각의 성질을 갖는 코드 집합이 2개 이상이
되면 메서드를 만들어서 사용
메서드 a 메서드 b로
빼서 호출 메서드는 계속 쪼개고 쪼개기 떄문에 메소드 집합이 된다.
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
//요구사항] "안녕하세요" x 5회 출력
//요구사항] "하나"-"다섯" x 5회 출력
Console.WriteLine("안녕하세요");
Console.WriteLine("안녕하세요");
Console.WriteLine("안녕하세요");
Console.WriteLine("안녕하세요");
//메서드 호출
//메서드명(인자리스트);
Hello();//Hello()
메서드로 이동하세요
Hello();
Hello();
Hello();
Hello();
Num();
Num();
Num();
Num();
Num();
}
//메서드 생성
public static void
Hello()
{
Console.WriteLine("Hello");
}//메서드를 모두 읽은후 자기가 호출한 곳으로 돌아간다.
public static void Num()
{
Console.WriteLine("하나");
Console.WriteLine("둘");
Console.WriteLine("셋");
Console.WriteLine("넷");
Console.WriteLine("다섯");
}
}
}
메서드의 행동 분류 => 메서드는 어떠한 행동
1. 인자가 없고 반환값이 없는 메서드
2. 인자가 있고 반환값이 없는 메서드
3. 인자가 없고 반환값이 있는 메서드
4. 인자가 있고 반환값이 있는 메서드
인자
- Parameter, 매개변수
- 메서드를 실행할때 건네주는 데이터
- 메서드의 가용성 높이기 위해..(좀더 쓸모있는 메서드)
- 인자는 1개 이상 사용이 가능 약 250개 정도 사용할수 있다.
- 모든 자료형이 가능 (인티져,
플롯, 블리언)
인자의 타입과 갯수와 순서는 반드시 지켜서 호출!
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
/*---------------------------------------------------------
지역변수(Local Variable)
- 메서드안에서 선언된 변수
- 지역변수의 영역 : 변수선언문이 속해있는
메서드 {}
=> 지역변수의 생명주기(Life Cycle)
: 변수가 언제 메모리에 생성 - 언제 메모리에서
소멸
- 생성되는 시점 : 선언문이 실행될떄..
- 소멸되는 시점 : 선언문이 포함된 블럭에서
제어가 벗어날때
---------------------------------------------------------*/
//1. 인자가 없고 반환값이 없는 메서드
Hello1();
Hello2();
//2. 인자가 있고 반환값이 없는 메서드
//Mr Kim
: 실인자(진짜인자)
Hello3("Mr
Kim");
Hello4(10, "KJH");
}
/*--------------------------------------------
1. 인자가 없고 반환값이 없는 메서드
- void : 반환값이 없는
- (없음) : 인자가 없는
호출이 되면 메서드안의 코드만 실행시키고 종료
--------------------------------------------*/
public static void Hello1()
{
Console.WriteLine("Hi~");
}
public static void Hello2()
{
Console.WriteLine("Hi~~ Mr kim");
}
/*--------------------------------------------------------
2. 인자가 있고 반환값이 없는 메서드
- 인자 : 모든 타입의 변수
: 메서드 {]안에서는 일반 지역변수와 동일하게
사용
string name : 가인자(가짜)
--------------------------------------------------------*/
public static void Hello3(string name)
{
Console.WriteLine("Hi~~~Mr {0}님", name);
}
public static void Hello4(int count, string
name)
{
for
(int i=1; i<count; i++)
{
Console.WriteLine("Hi~~{0}", name);
}
}
}
}
반환값
- 메서드를 실행한 후 돌려받는 데이터
- 메서드의 가용성을 높이기 위해...
- 반환값은 단 1개..
- 모든 자료형이 가능
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
//호출 구문이 사라지고 리턴된 곳으로 값을 준다.
int
result = GetNum();//반환값을 받아서 처리..
Console.WriteLine(result);
int
a = 10, b = 20;
int
result2 = Sum(a, b);
Console.WriteLine("{0} + {1} = {2}", a, b, result2);
}
//3. 인자가 없고 반환값이 있는 메서드
public static int GetNum()
{
int
num = 10;
//반환값이 있는 메소드
//리턴문이 빠져서는 절대 안된다.
return
num;
//return
20; 상수를 넣어도 된다. 고정값 반환 변수를 넣게되면 그때마다 다른값을 받는다.
}
//4. 인자가 있고 반환값이 있는 메서드
public static int Sum(int a, int b)
{
int
result = a + b;
return
result;
}
}
}
지역변수 이해 소스
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
//지역변수의 생명주기
//num이라는 변수가 언제 생성-소멸?
//main메소드 실행중에 생성된 num
int
num = 20;
Test1();
Console.WriteLine("main num : {0}", num);
}
public static void Test1()
{
//context
폴더가 다른 같은 이름 num
//main과 같이 스택에 생성된다.Test라는 메소드의 num이라는 것을 인식한다.
int
num = 10;
Console.WriteLine("Test1 num : {0}", num);
}
}
}
메서드 인자값의 전달 형태
- 메서드를 호출할때 인자를 넘겨주는 방식
1. Call By Value
- 기본형
- 값에 의한 전달
- 메서드 호출 시 값자체를 복사해서 전달하는 방식
- Side Effect가 없음.
- 전달받은 매개변수를 매서드안에서 수정을 하더라도 매개변수 원본은 영향을 받지 않음.
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
int
a = 10, b = 20;
Console.WriteLine("a : {0}, b : {1}", a, b);
Swap(a,b);
Console.WriteLine("a : {0}, b : {1}", a,b);
}
public static void Swap(int a, int b)
{
//바꾸기
int
temp;//빈컵
temp = a;
a = b;
b = temp;
Console.WriteLine("a : {0} b : {1}", a, b);
}
}
}
- 주소에 의한 전달
- 메서드 호출 시 주소값을 복사해서 전달하는 방식
- Side Effect가 있음.
- 전달받은 매개변수를 메서드안에서 수정을 하면 원본도 영향을 받음
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
int
a = 10, b = 20;
Console.WriteLine("a : {0} b : {1}", a, b);
Swap(ref
a,ref b);
Console.WriteLine("a : {0} b : {1}", a,b);
}
//주소값을 저장 ref int a, ref int b
//호출후 주소 번지를 기억 변수값이 아님
//temp 일반 값을 가질수 있는 변수
//temp 는 a의 주소 값을 찾아 100번지를 찾아가 데이타10을 저장
//다시 a로 갔더니 주소값 형태로 되어 있어
데이타를 못넣었다.
public static void Swap(ref int a, ref int b)
{
//바꾸기
int
temp;//빈컵
temp = a;
a = b;
b = temp;
Console.WriteLine("a : {0} b : {1}", a, b);
}
}
}
3. Output Parameter
재귀 메서드 : Factorial(팩토리얼)
디렉터리 구조에서 많이 쓰인다.
폴더별로 갯수를 세서 형제가 있는지 본후 형제있으면 계속 들어간다.이러한
형태로 똑같은 행동을 계속한다.
using System;
namespace Csharp
{
class Test
{
public static void Main(string[] args)
{
//Factorial(팩토리얼)
//4! = 4
x 3 x 2 x 1
//Test1();
int
result = Factorial(15);
Console.WriteLine("4! = {0}",result);
}
public static int Factorial(int n)
{
if
(n > 1)
return
n * Factorial(n - 1);
else
return
1;
}
public static void Test1()
{
Console.WriteLine(DateTime.Now);
//Test1();
}
}
}
매서드 오버로딩(Overloading) => 히드라, 져글링, 울트라 리스크를 태운다.
- 매서드가 여러가지 형태(갯수,
타입)의 인자리스트를 가질 수 있게 해주는 기술
- 매서드 시그너쳐(Signature), 매서드 서명 -> 싸인
: 매서드를 구분할 수 있게 해주는 요소
- 매서드 서명으로 사용 가능한 구성 요소
1. 기능 : 매서드명, 인자의
자료형, 인자의 갯수
1. public static void Test() 선언 // o
2. public static void Test(int n) // o
3. public static void Test(int m) // x (인자의 이름 다름) / int m 이 2번이었다면 o
4. public static void Test(int n, int m) // o
5. public static void Test(string s)// o (인자의 타입이 다르므로)
6. public static void Test(string s, byte b) // o
7. public static int Test() // x (1번때문에)
8. public static int Test(bool b) //o (유일하므로)
9. public static void Test(ref int n)
Overloading
- 메서드 오버로딩을 사용하는 이유
1. 동일한 업무를 하는 매서드들이 인자를 달리하는 경우...
2. 동일한 업무 => 메서드명 동일
3. 기존에 업무가 존재하는데.. 거기에 비슷한 업무를 추가시키는
경우..
- 메서드 오버로딩 자제
- 1개의 이름을 가지고 여러가지 기능!! => 모호성(디버깅이 힘들어 질수 있다.)
using System;
namespace Csharp
{
class Overloding
{
public static void Main(string[] args)
{
DrawLine();
DrawLine();
DrawLine('+');
DrawLine('#');
DrawLine(100);
DrawLine(1000);
DrawLine('@',
20);
DrawLine('~',
40);
}
public static void
DrawLine()
{
Console.WriteLine("==========");
//선긋기
//메서드의 다형성
}
//확장
public static void DrawLine(char c)
{
for
(int i=0; i<10; i++)
Console.Write(c);
Console.WriteLine();//빈엔터
}
public static void DrawLine(int count)
{
for
(int i=0; i<10; i++)
Console.Write('=');
Console.WriteLine();
}
public static void DrawLine(char c, int count)
{
for(int i=0; i<10; i++)
Console.WriteLine(c);
Console.WriteLine();
}
}
}