언어/C#

C#4. 메소드, 클래스, 접근한정자, 상속

에린_1 2024. 7. 17. 20:36
728x90

C#

메소드(Method)

  • 일련의 코드를 하나의 이름 아래 묶은 것이다.
  • 이렇게 묶은 코드는 메소드를 호출하는 것으로 실행 가능하다.
  • 함수, 프로시저, 서브루틴과 다른점은 클래스안에 존재 한다는 것이다.

값에 의한 전달(Pass by value)

  • 메소드를 호출할 대 데이터를 복사해서 매개변수에 넘기는 것을 의미한다.

참조에 의한 매개변수 전달(Pass by reference)

  • 매개 변수가 메소드에 넘겨진 원본 변수를 직접 참조한다. 따라서 메소드 안에서 매개변수를 수정하면 이 매개변수가 참조하고 있는 원본 변수에 수정이 이뤄진다.
  • ref 키워드를 매개변수 앞에 붙여준다.

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

  • 참조 변환 값을 이용하면 메소드의 호출자로 하여금 반환 받은 결과를 참조로 다룰 수 있도록 한다.
  • ref 키워드로 메소드를 한정한다.
    • public ref int SomeMethod();
  • return 문을 사용할 대 ref 키워드를 반환할 필드나 객체 앞에 붙여준다.
  • 반환 값을 참조로 넘겨 받기 위해서는 결과를 담는 지역변수와 호출할 메소드의 이름 앞에 ref 키워드를 위치 시켜야 한다. 이렇게 참조로 반환 받은 결과를 담는 지역 변수를 참조 지역변수 ref local 라고 부른다.

출력 전용 매개변수

  • out 키워드를 이용한 ‘출력 전용 매개변수’ 사용
  • 메소드의 선언부와 호출부에 ref 키워드 대신 out 키워드를 사용한다.
  • out 키워드의 경우 ref 키워드와는 달리 해당 매개변수에 결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.

메소드 오버로딩

  • 하나의 메소드 이름에 여러 개의 구현을 올리는 것
  • 오버로딩을 하면 컴파일러가 메소드 호출 코드에 사용되는 매개변수의 수와 형식을 분석해서(오로지 매개변수만 분석한다) 어떤 버전이 호출될 지 찾아준다.
  • 이름에 대한 고민을 줄여주는 동시에 코드를 일관성 있게 유지한다.

명명된 인수(Named Argument)

  • 메소드를 호출할 때 인수의 이름에 근거해서 데이터를 할당할 수 있다.
  • 메소드를 호출할 때 인수의 이름 뒤에 클론(:)을 붙인 뒤 그 뒤에 할당할 데이터를 넣어주면 된다.

선택적 인수(Optional Argument)

  • 메소드의 매개변수는 기본값을 가질 수 있다.
  • 기본값을 가진 매개변수는 메소드를 호출할 때 해당 인수를 생략할 수 있다.
  • 선택적 인수는 항상 필수 인수 뒤에 와야 한다.

로컬 함수(Local Function)

  • 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수이다. 클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부른다.

클래스

객체 지향 프로그래밍과 클래스

  • 코드 내 모든 것을 객체(object)로 표현하려는 프로그래밍 패러다임을 뜻한다.
  • 객체, 속성, 기능
  • 클래스 안에 선언된 변수들을 일컬어 필드(Field)라고 한다. 그리고 필드와 메소드를 비롯하여 프로퍼티, 이벤트 등 클래스 내에 선언된 요소들을 일컬어 멤버라고 한다.

생성자와 종료자

  • 객체가 생성될 때는 생성자(Constructor)가 호출되고 소멸할 때는 종료자(Finalizer)가 호출된다.
  • 생성자
    • 생성자는 클래스의 이름과 동일한 이름을 가지며, 객체를 생성하는 역할을 한다.
    • 클래스를 선언할 때 명시적으로 생성자를 구현하지 ㅏㅇㄶ아도 컴파일러에서 생성자를 만들어준다.
    • 생성자도 오버로딩이 가능하다.
  • 종료자
    • 매개변수가 없고, 한정자도 사용하지 않는다.
    • 오버로딩이 불가능하다.
    • CLR의 가비지 컬렉터가 객체가 소멸되는 시점을 판단해서 종료자를 호출해준다.
  • 생성은 생성자에, 뒤처리는 가비지컬렉터에 맡기는 편이 좋다.

정적필드와 메소드

  • static으로 한정하지 않은 필드는 자동으로 인스턴스에 소속되며, static으로 한정한 필드는 클래스에 소속된다.
  • static으로 수식한 필드는 프로그램 전체에 걸쳐 하나 밖에 존재하지 않으니 프로그램 전체에 공유해야 하는 변수가 있다면 정적 필드를 이용한다.
  • 정적 메소드는 클래스의 인스턴스를 생성하지 않아도 호출 가능하다.

객체 복사기 : 얕은 복사와 깊은 복사

  • 참조만 복사하는 것을 얕은 복사(shallow copy)라고 한다.
  • 별도의 힙 공간에 객체를 보관해서 복사하는 것을 깊은 복사(Deep copy)라고 한다.

this 키워드

  • 객체가 자신을 지칭할 때 사용하는 키워드이다.
  • 객체 내부에서 자신의 필드나 메소드에 접근할 대 this 키워드를 사용한다.

접근 한정자(Access Modifier)

은닉성(Encapsulation)

  • 사용자에게 필요한 최소 기능만 노출하고 내부를 감추는 것
  • public
    • 클래스의 내부/외부 모든 곳에서 접근할 수 있다.
  • protected
    • 클래스의 외부에서는 접근할 수 없지만, 파생클래스에서는 접근 가능하다.
  • private
    • 클래스의 내부에서만 접근할 수 있다. 파생클래스에서는 접근할 수 없다.
  • internal
    • 같은 어셈블리에 있는 코드에서만 public으로 접근할 수 있다. 다른 어셈블리에 있는 코드에서는 private과 같은 수준의 접근성을 가진다.
  • protected internal
    • 같은 어셈블리에 있는 코드에서만 protected로 접근할 수 있다. 다른 어셈블리에 있는 코드에서는 private과 같은 수준의 접근성을 가진다.
  • private protected
    • 같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근 가능하다.
  • 접근 한정자를 수식하지 않은 클래스의 멤버는 무조건 private으로 접근 수준이 자동 지정된다.

상속

  • 파생 클래스의 이름 뒤에 콜론(:)을 붙여주고 그 뒤에 상속받을 기반 클래스의 이름을 붙이면 된다. 파생클래스는 자신만의 고유한 멤버 외에도 기반 클래스로부터 물려받은 멤버를 가지고 있다.
  • 기반 클래스와 파생클래스 사이에서는 형식 변환이 가능하다.

오버라이딩과 다형성(Polymorphism)

  • 객체가 여러 형태를 가질 수 있다.
  • 메소드를 오버라이딩 하기 위해서는 오버라이딩할 메소드가 virtual 키워드로 한정되어 있어야 한다.
    • private로 선언한 메소드는 오버라이딩 할 수 없다.

상속 & 오버라이딩 봉인

  • sealed 키워드를 통해 봉인할 수 있다.
  • virtual로 선언된 가상 메소드를 오버라이딩한 버전의 메소드만 가능하다.

읽기 전용 필드

  • 읽기만 가능한 필드를 말한다. 즉, 클래스나 구조체의 멤버로만 존재할 수 있으며 생성자 안에서 한 번 값을 지정하면, 그 후로는 값을 변경할 수 없다.
  • readonly 키워드를 이용해 선언할 수 있다.

중첩 클래스(Nested class)

  • 클래스 안에 선언되어 있는 클래스를 말한다.
    • 사용 이유
      • 클래스 외부에 공개하고 싶지 않은 형식을 만들고자 할 때
      • 현재 클래스의 일부분처럼 표현할 수 있는 클래스를 만들고자 할 때

분할 클래스(Partial class)

  • 여러번에 나눠 구현하는 클래스이다.
  • Partial 키워드를 이용해서 작성한다.

확장 메소드(Extenstion Method)

  • 기존 클래스의 기능을 확장하는 기법이다.
  • 메소드를 선언하되, static 한정자로 수식해야 한다. 그리고 메소드의 첫 번째 매개변수는 반드시 this 키워드와 함께 확장하려는 클래스(형식)의 인스턴스여야 한다. 그 뒤에 따라오는 매개변수 목록이 실제로 확장 메소드를 호출할 때 입력되는 매개변수이다.
728x90

'언어 > C#' 카테고리의 다른 글

리플렉션  (0) 2024.07.31
C#5. 인터페이스, 추상 클래스, 프로퍼티, 컬렉션  (1) 2024.07.18
C#3. 조건 연산자, 패턴  (0) 2024.07.16
C#. 2  (0) 2024.07.15
C#. 1  (0) 2024.07.11