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시 반 되어가는 이제야 끝났다...ㅜㅜ
대신 그만큼 개념은 제대로 잡혔을 거라 기대하고 있다.
'내일배움캠프 > C#문법종합반' 카테고리의 다른 글
[TIL 24.05.05~06] 5주차 강의-알고리즘 기초, 정렬 알고리즘 (0) | 2024.05.05 |
---|---|
[TIL 24.04.29~05.05] 4주차 강의 필기노트 (0) | 2024.04.29 |
[TIL 24.04.23] 3주차 과제1: Snake Game (0) | 2024.04.23 |
[TIL 24.04.23] 2주차 과제2: Tic Tac Toe (0) | 2024.04.23 |
[TIL 24.04.22] 1주차~2주차 강의 필기노트 (0) | 2024.04.22 |