본문 바로가기

내일배움캠프/C#문법종합반

[TIL 24.04.28] 3주차 강의 필기노트

C#문법종합반 강의 3주차 내용을 정리하는 글이다. 내가 아는(또는 안다고 생각하는) 일부 내용은 생략되었다.

 

목   차

     


    클래스와 객체

    객체 지향 프로그래밍의 특징

    #특징

    • 캡슐화: 여러 기능을 하나의 단위로 모아 묶는 것.(ex. Status, Item 클래스)
    • 상속: 기존의 클래스를 확장하여 새로운 클래스를 만드는 것.(ex. Person > Student 클래스: 학생만의 특징 추가.)
    • 다형성: 하나의 인터페이스/기능을 다양한 방식으로 구현. (ex. 연산자 오버라이딩, 함수 오버로딩:매개변수 차이)
    • 추상화: 복잡한 시스템을 단순화하여 필요한 것에 집중하는 것(ex. 인터페이스, 추상클래스.)
    • 객체: 클래스로부터 생성된 실체. 

    #클래스의 구성요소

    • 필드: 클래스 안의 변수.(상태/속성)
    • 메서드: 클래스 안의 동작/기능.
    • 생성자: 객체를 초기화하는 역할. (new className 할때 호출됨.)
    • 소멸자: 객체가 소멸될 때 호출되는 메서드.(C#은 대체로 신결쓸 필요 없음-가비지 콜렉터.)

    #구조체 vs 클래스

    구조체: 값 형식 -> 깊은 복사됨.

    클래스: 참조 형식 -> 얕은 복사됨.(깊은 복사 하고 싶으면 인자에 new classname() 하면 됨.)

     

    구조체: 스택 할당.

    클래스: 힙 할당. -> 성능 차이.

     

    구조체: 상속 불가.

    클래스: 단일상속 및 다중상속 가능.

     

    구조체: 작은 단위.(16byte 이하면 스택임.)

    클래스: 큰 단위.

    접근 제한자

    C# 기준으로는 둘 다 멤버선언 기본이 private? 이란다. 원래 C++는 struct의 기본 접근제한자가 public으로 알고 있었는데... 혼란스럽다.

    • public: 전체범위.
    • internal: 프로젝트 범위.(json도 영향범위 안인듯.)
    • protected: 내 클래스 + 자식 클래스.
    • private: 내 클래스만.

    필드와 메서드

    필드: 변수. 일단 private으로 선언하고, *property를 통해 간접적으로 접근한다.*

    메서드: 함수. 때로는 인자를 받아서 처리하고, 때로는 반환값이 있다. 보통은 public으로 선언. 사용을 위해 우선 인스턴스 선언 필요.

    프로퍼티

    • 클래스 멤버로서, 객체의 필드값을 읽거나 설정하는데 사용되는 접근자 메서드의 조합.
    • 필드에 대한 접근 제어와 데이터 유효성 검사 수행 가능.(ex: 특정 값일 경우 무효처리 해버리기.)
    • getter 과 setter 중 일부만 접근제한자를 바꾸는 것도 가능.
    • 또는 하나를 생략해 읽기 전용/쓰기 전용도 가능.
    • 프로퍼티를 불러올 때는 그냥 변수를 부를 때처럼 (className).(memebrName) 의 형식으로 인자 괄호 없음.
    • 소문자로 시작하는 변수명과 알파벳은 똑같되, 첫 글자만 대문자로 함.

    자동 프로퍼티:

    [접근 제한자] [데이터 타입] 프로퍼티명 { get; set; }

    상속과 다형성

    상속

    상속: 기존 클래스 확장or재사용(수정) > 새로운 클래스(자식) 생성.

    따라서 상위 클래스의 멤버를 자식클래스 역시 사용 가능하다.

    #상속의 장점

    • 코드의 재사용성
    • 계층 구조의 표현
    • 유지보수성의 향상

    #상속의 종류

    강의노션과 다르게 난 이렇게 구분할 예정이다.

    • 일반 클래스 상속: 다중상속 불가, 강제성x, 인스턴스 생성o
    • 추상 클래스 상속: 다중상속 불가, 강제성o, 인스턴스 생성x
    • 인터페이스 상속 : 다중상속 가능, 강제성o, 인스턴스 생성x

    다형성

    #가상(Virtual) 메서드

    부모 클래스에서 정의되고 자식 클래스에서 재정의(overriding) 할 수 있는 메서드.

    • virtual 키워드를 사용해 선언됨. -> 이를 통해 자식 클래스에서 메서드 변경/확장 가능.

    #추상(Abstract) 클래스와 메서드

    직접적으로 인스턴스를 생성할 수 없는 클래스 +그냥은 사용할 수 없고 재정의해야 하는 메서드.

    • 추상 메서드는 추상 클래스에서만 선언 가능.
    • 주로 상속을 위한 베이스 클래스가 됨.
    • abstract 키워드를 사용하여 선언됨.
    • 추상메서드는 구현부가 없는 대신 자식 클래스에서 구현을 강제함.

    #오버라이딩과 오버로딩

    오버라이딩: 부모클래스의 메서드(virtual)을 자식클래스에서 재정의.

    메서드 섀도잉(숨김): 부모에 virtual이 없이 그냥 자식이 같은 메서드 이름을 쓰는건 숨김으로 처리됨.

    오버로딩: 같은 함수이름을 사용하면서 인자는 다르게 할 때.

    고급 문법 및 기능

    제너릭

    클래스/메서드를 일반화시켜 다양한 자료형에 대응할 수 있는 기능

    선언은 <T>로, 사용은 <T>의 T 자리에 구체적인 자료형으로 넣어서.

     

    out, ref 키워드

    메서드에서 매개변수를 전달할 때 사용.

    #out

    메서드에서 반환값을 매개변수로 전달하는 경우. (return에 반환하는 대신?)

    return과 함께 사용 가능.

    out 여러 개 사용하면 여러 값을 반환하는 것도 가능, return처럼 반드시 값을 할당해야 함.

    out 인자에는 상수가 들어갈 수 없음.

     

    #ref

    매개변수를 사용하면 메서드 내에서 해당 변수를 직접 변경할 수 있음.

    단, 너무 많이 쓰면 가독성이 떨어지고 유지보수가 힘들어짐.


     

    마무리

    3주차 마지막 강의는 한 번만 더 들어보고 싶다. 간단할수록 전에 알았던거, 또는 다른 글에 정리한거(gpt로 추가 보충했기에) 일 것이다. 3주차 강의 전체를 듣는데에 12시 반 경부터 공부를 시작해서 4시 반 되어가는 이제야 끝났다...ㅜㅜ 

    대신 그만큼 개념은 제대로 잡혔을 거라 기대하고 있다.