|
출처: 선문비트프로젝트 원문보기 글쓴이: 21기 김종현
메 서 드 |
작성자 : 김종현 |
작성일 : 2011-05-16 | |
주 제 : C# 메서드 Study |
◎ 메서드
- 수행해야 할 구문을 포함하는 코드 블록이다.
- 프로그램에서 메서드를 호출하면 포함하는 코드 블록을 수행하게 된다.
- 메서드를 호출하기 위해서는 호출자와 피호출자 사이에 약속이 필요하게 되는데 이를 메서드 시그니쳐라고 한다.
◎ 메서드 시그니처
- 메서드 이름
- 반환형식
- 입력 매개 변수 리스트
- 액세스 수준
- 선택적 한정자
◎ 메서드의 매개변수
- 해당 메서드를 수행하는데 있어 필요한 인수를 호출부에 넣어서 전달된 것을 말한다.
- 값 형식의 매개 변수가 전달 될 때에는 호출부에서 전달한 인자의 값을 복사하여 전달이 된다. 피호출 메서드에서 매개변수의 값을 변경하더라도 호출한 곳의 변수 값이 바뀌지는 않는다.
- 참조 형식의 매개변수는 전달된 인자 인스턴스에 대한 참조를 전달 받게 된다. 입력 매개 변수가 참조하는 인스턴스와 호출하는 곳에서 전달한 인스턴스는 동일한 인스턴스라는 것이다. 하지만 피호출 메서드에서 입력 매개변수에 새로운 인스턴스를 생성한다고 해서 호출하는 곳에 인자변수가 참조하는 인스턴스가 바뀌지는 않는다.
- 피호출 메서드에서 수행한 것을 그대로 반영하기 위해서는 ref 매개변수나 out 매개 변수를 사용해야 한다.
- ref와 out의 차이점은 호출하는 곳에서 입력 인자를 초기화 해서 보내야 하는가 그렇지 않아도 되는가의 차이가 있다.
◎ 메서드 사용 예제
- 위의 설명에 대해서 간단하게 예제 코드를 통해서 증명해 보도록 하겠다
namespace AboutMethod { class MyClass { int num; string name; int kscore; int mscore; int escore; const int min_score = 0; const int max_score = 100; public MyClass(int _num, string _name) { num = _num; name = _name; } } } |
번호, 이름, 과목들의 기본 필드를 선언해주고, 최저점수와 최고점수를 정해준다. 클래스의 데이터를 초기화 하기 위해서 생성자를 이용한다. 생성자 메서드는 메서드 명이 클래스 명과 동일하며, 반환형식을 명시하지 않는다는 것을 기억하자. |
public int KScore { get { return kscore; } set { if (AvailScore(value)) { kscore = value; } else { Console.WriteLine("나올 수 없는 점수입니다"); } } } |
정수에 대한 속성을 추가한다. KScore를 이용해서 kscore를 반환해주고, 최저점수와 최고점수에 해당하지 않을 경우에는 나올 수 없는 점수임을 알려준다. MScore와 EScore의 속성도 동일한 방법으로 추가한다. 속성은 멤버 필드에 대한 접근자로 내부적으로 메서드라는 것을 잊지 않도록 한다. |
private bool AvailScore(int value) { return (min_score <= value) && (max_score >= value); } public double GetAverage() { return (kscore + mscore + escore)/ 3.0; } |
클래스 내부에서만 접근이 가능하게 엑세스 수준을 private로 지정한 가능 점수를 알아보는 bool 타입의 method를 만들고 평균을 알아 볼수 있는 method도 하나 추가한다. |
class Program { static void Main(string[] args) { MyClass mc = new MyClass(2, "홍길동"); mc.KScore = 80; Console.WriteLine("mc.kscore is {0}", mc.KScore); double average = mc.GetAverage(); Console.WriteLine("Average is {0}",average); } } |
main메서드는 프로그램의 진입점 method이다. CLR에 의해 진입점 메서드인 main이 호출 된다. 위에 정의된 메서드들을 사용하는 코드이다. 모든 정보를 보여주고 싶으면 ToString을 override해서 내부적으로 좀 더 표현해 주면 된다. |
◎ 시나리오가 있는 메서드 사용 예제
- 회원의 키, 몸무게를 이용해서 비만도를 구해주는 프로그램이다.
- 회원의 이름, 나이도 나타내주도록 한다.
- 위에 언급한 사항만을 이용해서 작성하도록 하겠다.
namespace AboutExampleMethod { class MyClass { int height; int weight; int age; string name; const int min_age = 10; const int max_age = 100; public MyClass(string _name,int _age ,int _height, int _weight) { name = _name; age = _age; height = _height; weight = _weight; } } } |
Class에 기본 필드들을 선언해 주고 최소 나이와 최대 나이를 정해준다. 생성자를 이용해서 클래스를 초기화해준다. |
public int Age { get { return age; } set { if (AvailAge(value)) { age = value; } else { Console.WriteLine("관리 할 수 없는 나이입니다."); } } } private bool AvailAge(int value) { return (min_age <= age) && (max_age >= age); }
|
지금의 시나리오에서는 필요 없지만, set을 이용하여 필터링 할 수도 있다. |
public double GetBMI() { return (weight / ((height * height) * 0.0001)); } public string Name { get { return name; } } public override string ToString() { return "이름 : " + name + "\n" + "나이 : " + Age + "\n" + "신장 : " + height + "\n" + "체중 : " + weight + "\n"; }
|
비만도를 구하는 식을 써주고 이름을 얻어오는 속성과 ToString을 재정의해서 화면에 어떻게 보여줄지 설정해준다. |
class Program { static void Main(string[] args) { MyClass mc = new MyClass("홍길동", 23, 166, 87); MyClass mc2 = new MyClass("강감찬", 27, 188, 88); MyClass mc3 = new MyClass("고길동", 28, 174, 90); Console.WriteLine(mc.ToString()); Console.WriteLine(mc2.ToString()); Console.WriteLine(mc3.ToString()); double bmi = mc.GetBMI(); string mbmi = bmi.ToString("N2"); double bmi2 = mc2.GetBMI(); string mbmi2 = bmi2.ToString("N2"); double bmi3 = mc3.GetBMI(); string mbmi3 = bmi3.ToString("N2"); Console.WriteLine("{0}회원의 비만지수는 {1} 입니다",mc.Name,mbmi); Console.WriteLine("{0}회원의 비만지수는 {1} 입니다", mc2.Name, mbmi2); Console.WriteLine("{0}회원의 비만지수는 {1} 입니다", mc3.Name, mbmi3); } } |
위에 만들어진 Method들을 이용해서 이름, 나이, 키, 몸무게를 받아서 보여주고 그 회원의 비만도를 표현해주도록 한다. 깔끔하게 소수점 둘째자리까지 표현하게 만들어놨다. 이 코드는 그냥 껴 맞추기 위해 만든 시나리오기 때문에 조금은 허술한 점이 많다. 자신에게 맞는 스타일의 시나리오를 만들어서 실습해 볼 것을 추천한다. |
|
코드를 실행시킨 결과창이다. |