[Unity/C#]객체지향 프로그래밍(=OOP)

강동현·2023년 12월 31일
0

Unity/C#

목록 보기
8/26
  • 객체지향 프로그래밍이 왜 C# 태그에 있나? -> C# 코드로 배웠으니까
  • 매우 많이 배웠고, 알았지만, 아주 중요한 내용을 복습한다는 의미로 수행

1. 객체지향이란?

  • 모든것을 객체로 표현하는 프로그래밍 패러다임
  • 클래스에서 객체를 찍어내는 방식의 기법

2. 객체지향 프로그래밍의 4가지 특징

  • 추상화
  • 캡슐화
  • 다형성
  • 상속

1. 추상화

기존 클래스들의 공통 요소들을 추출해 불필요한 부분을 생략
객체의 속성 중 중요한 것을 중점으로 개략화(정리)하는 것

  • 중복 작성 없이 효율적으로 작성한다는 뜻
  • 캡슐화, 다형성, 상속 개념을 포함하는 상위 개념

2. 캡슐화

정보 은닉: 객체 밖에서 알 필요가 없는 내부 변수를 숨기는 것
접근 제한자를 통해 실현
1. private(default): 클래스 내부에서만 사용 가능하도록 제한
2. public: 모든 클래스에서 공유 가능
3. protected: 클래스 내부 or 파생(자식) 클래스에서만 사용 가능하도록 제한
4. Internal: 같은 어샘블리 내에서 사용 가능[HARD]
5. Internal protected: 같은 어샘블리 내 클래스 내부 or 파생 클래스 사용 가능[HARD]

3. 다형성

  • 객체가 다양한 형태를 가질 수 있음을 의미
  • 상속받아 만들어진 파생(자식) 클래스를 통해 다형성 구현
  • 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 객체에 따라 호출되는 함수가 달라짐
    }
}

4. 상속

  • 부모 클래스모든 속성(변수, 함수 등)자식 클래스에 적용
  • 다중 상속 불가(죽음의 다이아몬드) -> 두 부모가 같은 속성을 가질 경우, 속성 처리에 대한 문제가 생김

4-1. virtual

  • 부모 클래스에서 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 하지 않음
}

4-2. abstract

  • 객체(인스턴스) 생성 불가
  • 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(...) { ... } : 선언하지 않으면 에러
}

4-3. interface

  • 프로그래밍의 계약 / 약속
  • 객체(인스턴스) 생성 불가
  • 이벤트, 인덱서, 프로퍼티, 메소드만 포함 가능[변수 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(...){...}
}
profile
GAME DESIGN & CLIENT PROGRAMMING

0개의 댓글