인수전달
- 메소드의 형식 인수에 호출원의 실인수를 대입하는 것이므로 형식 인수와 실인수의 관계는
 값 타입은 사본이 전달되며 참조 타입은 참조자가 전달되므로 메소드 내에서 형식 인수를 변경할 때의 효과가 다르다



-
참조 타입 - 클래스
값 타입 - 구조체

-
클래스는 참조자가 전달되므로 본 값인 9가 아니라 12가 전달된다
구조체는 값으로 전달되므로 본 값인 9가 전달되고 필드는 소용이 없다

변수의 범주란 선언되는 위치에 따라 구분되는 변수의 특성이며 C에서 기억 부류(Storage Class)라고 칭하는 것과 비슷한 개념이다. 

■ 지역 변수 : 메서드의 내부 또는 특정한 { } 블록 내에 선언되는 변수이다. 블록내에서만 사용되며 별도의 초기값 대입이 없으면 쓰레기값을 가지며 메서드나 블록이 종료되면 자동으로 사라진다. 메서드가 재귀 호출되면 호출될 때마다 새로 생성된다. 정식 명칭은 블록 범위 변수이다.

■ 인스턴스 변수 : 클래스 선언문내에 선언되며 클래스 타입의 객체에 소속된다. 객체가 생성될 때 같이 생성되고 객체가 파괴될 때까지 존재한다. 흔히 필드라고 부르는 멤버 변수가 이 범주에 속한다.

■ 정적 변수 : 클래스 내에 static 키워드와 함께 선언되며 객체가 아닌 클래스에 소속된다. 정적 변수는 객체가 생성되기 전에 이미 존재하며 프로그램이 종료되어야 사라진다. C의 전역 변수와 비슷한 특성을 가지되 클래스에 소속된다는 점이 다르다. C#에서 진정한 의미의 전역 변수는 존재하지 않는다.

■ 배열 요소 : 배열의 한 요소로 생성된다. 배열이 생성될 때 같이 생성되며 배열이 해제될 때 파괴된다. 선언문에 초기값 목록이 있으면 이 목록대로 초기화되며 그렇지 않으면 디폴트 값(보통 0)으로 초기화된다.

■ 값 인수 : 메서드의 인수로 선언되며 메서드가 호출될 때 생성된다. 호출원에서 전달한 실인수의 값으로 초기화되며 메서드가 리턴할 때 파괴된다.

■ 참조 인수 : 값 인수와 같되 앞에 ref라는 키워드를 붙인다. 실인수의 값으로 초기화되지 않고 실인수를 가리키는 참조자로 초기화된다.

■ 출력용 인수 : 참조 인수와 같되 앞에 out라는 키워드를 붙인다. 참조 인수로 전달되는 실인수는 반드시 초기화되어야 하지만 출력용 인수는 초기화되지 않아도 상관없다. 메서드는 출력용 인수에 값을 담아 호출원으로 돌려 보내며 리턴하기 전에 반드시 대입해야 한다.



예1), 값, 참조, 출력용 인수





- PlusOne 메서드는 인수에 별다른 수식이 없으므로 값 호출을 사용한다. 형식 인수 p는 실인수의 값을 대입받은 사본일 뿐이므로 메서드 안에서 값을 변경한다고 해서 실인수가 바뀌는 것은 아니다. PlusOne 내부에서 p++로 형식 인수를 1 증가시키지만 사본을 증가시킨 것이므로 메서드 리턴후에도 실인수 a의 값은 여전히 1이다.




- PlusRef 메서드는 인수 앞에 ref 키워드를 지정했으므로 참조 호출을 사용한다. 형식 인수 p는 실인수의 참조자이므로 p에 대해 어떤 변경을 가하면 실인수도 같이 변경된다. 이 메서드가 리턴되면 a는 2로 증가되어 있다. 참조 호출로 전달되는 인수는 반드시 초기화되어야 한다. 위 예제에서 a를 초기화하지 않은 상태로 PlusRef를 호출하거나 실인수로 b를 전달하면 에러 처리된다. 참조 호출 메서드를 호출할 때는 실인수 앞에도 ref 키워드를 붙여야 한다.





- PlusOut 메소는 out 키워드를 지정하여 출력용 인수를 사용한다. 출력용 인수는 참조 호출과 마찬가지로 참조자가 전달되므로 형식 인수를 변경하면 실인수도 같이 변경된다. 차이점이라면 메서드내에서 값을 변경할 예정이므로 실인수가 초기화되지 않아도 상관없다는 점이다. 인수는 보통 호출원에서 메서드로 전달되지만 출력용 인수는 메서드가 호출원으로 값을 넘기기 위해 사용한다. 리턴값이 두 개 이상이라거나 작업 결과를 인수로 돌려받고 싶을 때 이 범주가 사용된다. 출력용 인수는 함수가 리턴되기 전에 반드시 값을 대입받아야 한다.





예2) 가변 인수
params : 변수의 배열을 전달하는데 배열에는 임의 개수가 인수가 포함될 수 있어 인수를 마음대로 전달할 수 있다



-  

Posted by 코딩하는 야구쟁이
,