- 객체지향 프로그래밍이 왜 C# 태그에 있나? -> C# 코드로 배웠으니까
- 매우 많이 배웠고, 알았지만, 아주 중요한 내용을 복습한다는 의미로 수행
- 모든것을 객체로 표현하는 프로그래밍 패러다임
- 클래스에서 객체를 찍어내는 방식의 기법
- 추상화
- 캡슐화
- 다형성
- 상속
기존 클래스들의 공통 요소들을 추출해 불필요한 부분을 생략
객체의 속성 중 중요한 것을 중점으로 개략화(정리)하는 것
- 중복 작성 없이 효율적으로 작성한다는 뜻
- 캡슐화, 다형성, 상속 개념을 포함하는 상위 개념
정보 은닉: 객체 밖에서 알 필요가 없는 내부 변수를 숨기는 것
접근 제한자를 통해 실현
1. private(default): 클래스 내부에서만 사용 가능하도록 제한
2. public: 모든 클래스에서 공유 가능
3. protected: 클래스 내부 or 파생(자식) 클래스에서만 사용 가능하도록 제한
4. Internal: 같은 어샘블리 내에서 사용 가능[HARD]
5. Internal protected: 같은 어샘블리 내 클래스 내부 or 파생 클래스 사용 가능[HARD]
- 객체가 다양한 형태를 가질 수 있음을 의미
- 상속받아 만들어진 파생(자식) 클래스를 통해 다형성 구현
- 1. 상속과 2. 오버라이드가 다형성 구현의 축
public class Parent{ public virtual void Function(...){ ... } } public class Child : Parent{ public override void Function(...){ ... } } publi void Start{ Parent man1 = new Parent(); Parent man2 = new Child(); Parent man3 = new Child(); List<Parent> mans = new List<Parent>(); mans.Add(man1); mans.Add(man2); mans.Add(man3); foreach(var m : mans){ Debug.Log(m.Function());//Heap 객체에 따라 호출되는 함수가 달라짐 } }
- 부모 클래스의 모든 속성(변수, 함수 등)을 자식 클래스에 적용
- 다중 상속 불가(죽음의 다이아몬드) -> 두 부모가 같은 속성을 가질 경우, 속성 처리에 대한 문제가 생김
- 부모 클래스에서 virtual 함수 선언 시, 자식 클래스에서 해당 함수를 override(재정의)
- 부모 클래스에서 virtual 함수 선언 시, 반드시 자식 클래스에서 override(재정의) 하지 않아도 됨
public class Monster{ public virtual void Move(...){ ... } } public class Elf : Monster{ public override void Move(...){ ... } } public class Orc : Monster{ //Move override 하지 않음 }
- 객체(인스턴스) 생성 불가
- abstract 함수는 abstract 클래스 내에만 선언 가능
- abstract 함수는 부모 클래스에서 선언부만 작성해야 함(구현X)
- abstract 클래스는 클래스이므로, abstract 함수 외(변수, 일반 함수)ㅔ가 작성되어도 된다.
- 부모 클래스에서 abstract 함수 선언 시, 반드시 자식 클래스에서 override(재정의) 해야만 한다.
public abstract class Monster{ int HP; int MP; int ATK; int DEF; public abstract void Move(...); public virtual void Attack(...) { ... } public int GET(...) { ... } } public class Elf : Monster{ public override void Move(...) { ... } } public class Orc : Monster{ //public override void Move(...) { ... } : 선언하지 않으면 에러 }
- 프로그래밍의 계약 / 약속
- 객체(인스턴스) 생성 불가
- 이벤트, 인덱서, 프로퍼티, 메소드만 포함 가능[변수 X]
- 추상클래스와 마찬가지로 인터페이스 내 함수는 선언부만 작성
- Interface 내 함수 선언 시, 반드시 자식 클래스에서 override(재정의) 해야만 한다.
- Interface는 다중 상속 가능
- I를 앞에 붙이는 것이 관례
public Interface IAttack{ public void Attack(...); } public Interface IMove{ public void Move(...); } public class Test : IAttack, IMove{ public void Attack(...){...} public void Move(...){...} }