6장_메소드로 코드 간추리기

CJB_ny·2022년 5월 28일
0

C#

목록 보기
8/9
post-thumbnail

6.1 메소드란?

객체지향 프로그래밍 언어에서 사용하는 요어.
c, c++ 에서는 함수

클래스 안에 존재한다.
C#은 객체지향 프로그래밍 언어이다.
따라서 코드 내의 모든 것을 객체로 표현한다.

각 객체는 자신만의 속성(데이터)과 기능 (메소드)을 가지고 있다.

클래스가

이 객체를 위한 청사진 제공

따라서 메소드가 클래스 내에 선언이 된다.

static

static 한정자

static = 정적이다. == 움직이지 않는다.
C# 에서 static이란 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 "한정자"이다.

따라서 해당 클래스의 인스턴스를 만들지 않고도 해당 메소드 호출 가능.

이런거 안됨.

인스턴스를 만들지않고 사용이 이렇게 가능함.


6.2 return

점프문의 한 종류

반환형식이 void 인 경우도 return;으로 종료가능.

6.3 매개 변수

이럴경우

ResultInt에 넘겨진 x, y는 실제로 Animal.ResultInt() 메소드 안으로 들어간 것이냐?

답은 "아니다" 이다.

메소드는 외부로부터 메소드 내부로 데이터를 "전달받는 매개체" 역할을 할 뿐이다.

매개변수도 근본적으로 "변수"이다.

그래서 ResultInt의 매개변수인 a, b에 값이 "복사"될 뿐이다.

데이터가 "값"이든 "참조"든 간에.

즉 x, y 와 a, b는 별개의 메모리 공간을 가진다.

6.4 참조에 의한 매개변수 전달

보통은 메소드 호출 == 값에 의한 전달

참조에 의한 전달

-> 원본 데이터 넘겨줌.

원본의 데이터를 직접 참조한다.

이렇게 ref키워드 붙여 주면된다.

스택 메모리 구조상에서
b는 y를 직접 참조하고 a는 x를 직접 참조하는 중
메모리 상에서 공간은 차지한다.

6.5 메소드의 결과를 참조로 반환하기

메소드의 결과를 참조로 반환하는 참조 반환값 (ref return)

참조 반환값을 이용하면 메소드의 호출자로 하여금 반환받은 결과를 참조로 다룰 수 있도록 합니다.

ref한정자로 메소드 선언, return 할 경우 변수 앞에도 ref키워드 명시해야함.

Main함수 내의 변수들은 ref int Price이런식으로 작성하고

이것은 Product 클래스

ref키워드를 붙은 Price변수는

참조 지역 변수 이다.

이것은 _price를 참조 하고 있어서

private으로 선언된 _price에 접근이 가능하여 값을 10으로 수정이 가능한 것이다.

6.6 출력 전용 매개변수

보통의 경우 메소드의 결과는 하나로 충분

하지만 나누기 메소드 같은 경우 나머지와 몫을 반환하려고 한다면??

이럴경우 ref 키워드를 사용하여

이런식으로도 구현이 가능하지만

C#에서는 조금더 안전한 방법으로 똑같은 일 가능하게 해준다.

out 키워드

를 사용하여

출력 전용 매개변수 를 사용하자 == out키워드

ref를 사용하여 했던 것과의 차이점은

Main함수 내에서 k, n을 초기화 하지(할당)않아도 되었다.

그러면

차이점?

out의 안전 장치는

ref키워드를 사용해서 매개변수를 넘기는 경우, 메소드가 해당 매개변수에 결과를 저장하지 않아도 컴파일러는 경고 하지 않는다.

반면,

out키워드를 사용할 경우 매개변수를 넘길 때는 반드시 메소드가 해당 매개변수에 결과를 저장해야하고 결과를 저장하지 않으면 컴파일러가 에러 내보냄.

왜냐하면

호출하는 메소드에서 그 지역변수를 할당할 것을 보장하기 때문에

또 한가지 더!

출력 전용 매개변수는 사실 메소드를 호출하기 전에 미리 선언할 필요가 없다!
호출 할 때 매개변수 목록 안에서 즉석으로 선언 하면된다!

이런식으로 호출할 때 매개변수 선언 가능하다.

6.7 메소드 오버로딩

오버로딩

과적하다. 탐재량을 넘겨 싣는 것.
메소드 오버로딩 == 하나의 메소드 이름에 여러 개의 구현을 올리는 작업.

즉, CalCulateNumber(int x, int y)라는 메소드 있을 경우

같은 이름으로 더하기 기능 지원, 빼기 기능 지원, 나누기 기능 지원... 등등 같은 함수 이름으로 가능하다는 말이다.

이런식으로 가능하다는 말.

이렇게 오버로딩을 해놓는 경우
컴파일러가 메소드 호출 코드에 사용되는 매개변수의 수와 형식을 분석해서(오로지 매개변수만 분석, 반환 형식은 보지도 않음)
어떤 버젼이 호출 될지를 찾아준다.

메소드 버젼을 찾는 작업은 "컴파일 타임"에 이루어 지므로, 서능 저하는 걱정 ㄴㄴ

메소드 오버로딩은 함수이름 고민 줄여주고 일관성 유지 굿.

Console.WriteLine은 18개의 함수를 오버로딩함.

6.8 가변 개수의 인수

인수의 "갯수(개수)"가 다르다는 이유만으로 똑같은 메소드를 여러가지 버젼 -> 오버로딩 할 경우

C# => "가변 개수의 인수" 라는 기능 제공함.

가변 개수의 인수는

  • params 키워드와 배열을 사용해서 선언함.

이런식으로.

이렇게 사용이 가능함.

오버로딩은 형식이 다를경우, 가변 개수의 인수는 인자가 가변적일 경우 사용

6.9 명명된 인수

int Sum(int a, int b, int c)
Sum(1, 2, 3)

하게되면

a = 1, b = 2, c = 3

인데

C#은 다른 스타일 지원 => "명명된 인수"이다.

즉, 메소드를 호출 할때 이름에 근거하여 데이터 할당함.

이딴식으로 사용 가능.

6.10 선택적 인수

메소드의 매개변수는 기본값을 가질 수 있다.

void MyMethod(int a, int b = 0)
{
}

이런식으로 가능.

값 안넣어주면 그대로 출력

값 안넣어주면 0, 0

값 넣어주면 순서대로 ㄱㄱ

6.11 로컬 함수

로컬 함수는 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수.

p213 읽어봐

문제

1번 매개변수 관해

2번 ref, out

이런식으로 함수가 있을 경우

Main함수의 mean의 값은? 0 이다.

이유는 무엇인가?

값만 복사해서 Mean함수에 전달했기 때문에 Main함수의 mean의 메모리 주소에는 어떠한 변화도 일어 나지 않음.

수정한다면

이렇게 수정이 가능하다.

3번 오버로딩, out

 public class TestClass
    {
        static void Main(string[] args)
        {
            int a = 3;
            int b = 4;


            Plus(a, b, out int resultA);

            Console.WriteLine("{0} + {1} = {2}", a, b, resultA);

            double x = 2.4;
            double y = 3.1;
            
            Plus(x, y, out double resultB);

            Console.WriteLine("{0} + {1} = {2}", x, y, resultB);
        }

        public static int Plus(int a, int b, out int c)
        {
            c = a + b;
            return c;
        }

        public static double Plus(double a, double b, out double c)
        {
            c = a + b;
            return c;
        }
    }
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글