반응형
책도 선물받았고 C# 기초도 다시 공부하고자함~
3. 클래스
3.1 클래스와 추상화
3.1.1 객체 지향과 클래스
객체 : 현실의 사물을 개념적으로 표현하는것 -> 현실의 사물을 표현하기 위해 변수(속성)와 함수(동작)로 구성되어있다.
클래스 : 객체의 속성과 행위를 정의하는 설계도
- 추상화 : 객체를 구성하기위해 개념적으로 정의하는것
- 속성 -> 필드로 정의 (변수)
- 행위 -> 메서드로 정의 (함수)
- 생성자 -> 인스턴스화시 호출되는 메서드
public class Example : MonoBehaviour
{
private void Start()
{
Human Amy = new Human();
// 인스턴스로 객체가 생성되고 내부 데이터는 비어있음
Human John = new Human("John", 20, 180);
// 인스턴스로 객체가 생성되면서 데이터를 할당해줌
Debug.Log(John.age);
}
}
class Human
{
public string name;
public float height;
public int age;
public Human()
{
}
public Human(string name, float height, int age)
{
this.name = name;
this.height = height;
this.age = age;
}
}
현실의 사람이라는 개념을 Human이라는 클래스로 정의하여 추상화하였고
name, height, age라는 속성을 변수로 정의하였다.
Human() 함수를 사용하여 속성을 할당해주는 메소드를 정의하였고
Human John = new Human("John", 20, 180);라는 구문에서 new 뒤에 Human을 호출하여 생성자를 호출하였다.
오버로딩된 함수를 통하여 생성자를 호출하며 데이터를 입력하거나 비어둘수있다.
- 캡슐화 : 필드와 메서드를 묶어 공개와 은닉을 구분하는것
- 접근제한자 : 공개 범위 설정,
private(외부공개x) < protected(파생까지 o) < internal(같은 어셈블리 o) < public (모든 외부 접근 o) - property : 특정 필드의 값에 접근(get)하거나 설정(set)하는 메서드(getter, setter)
- 접근제한자 : 공개 범위 설정,
public class Example : MonoBehaviour
{
private void Start()
{
Human Amy = new Human();
// 인스턴스로 객체가 생성되고 내부 데이터는 비어있음
Human John = new Human("John", 20, 180);
// 인스턴스로 객체가 생성되면서 데이터를 할당해줌
Debug.Log(John.age);
}
}
class Human
{
public string name;
public float height;
public int age;
/// -----------getter setter-----------
public string Name
{
get { return name; }
set { name = value; }
}
public float Height
{
get { return height; }
set { height = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
/// ---------------------------------
public Human()
{
}
public Human(string name, float height, int age)
{
this.name = name;
this.height = height;
this.age = age;
}
}
public으로 외부 공개가 허용된 property( getter setter)를 통해 내부 속성을 정의하거나 가져올수있다.
- 상속 : 클래스를 물려받는것
- 상위 클래스의 코드를 하위 클래스가 물려받음
- this : 현재 객체를 가리키는 키워드 (인스턴스된 객체에서 this를 쓰면 원본이 아닌 생성된 객체를 참조함)
- base : 부모클래스를 가리킨다.
class Adult : Human
{
public Adult(string _name, float _height, int _age) : base(_name, _height, _age) { }
public void SetAge(int _age)
{
base.age = _age;
}
}
class Human
{
public string name;
public float height;
public int age;
/// -----------getter setter-----------
public string Name
{
get { return name; }
set { name = value; }
}
public float Height
{
get { return height; }
set { height = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
/// ---------------------------------
public Human()
{
}
public Human(string name, float height, int age)
{
this.name = name;
this.height = height;
this.age = age;
}
}
Human 클래스의 Human 함수에서 this.을 사용하여 인스턴스화된 객체에 데이터를 할당한다.
Adult의 SetAge 함수는 base.age는 원본의 age에 접근하여 데이터를 할당하고있다.
- 다형성 : 여러 형태를 갖음 = 같은 형태의 코드가 다른 역할을 할 수 있다.
- 메서드 오버라이드 : 자식 클래스에서 재정의함
- 메서드 오버로드 : 같은 클래스에서 매개변수가 다른 함수를 두 개 이상 정의하는것
class Adult : Human
{
public Adult(string _name, float _height, int _age) : base(_name, _height, _age) { }
public void SetAge(int _age)
{
base.age = _age;
}
/// -----------child class override-----------
public override void GrowUp(int add)
{
if(today == birthday)
{
base.GrowUp(add);
}
}
/// ---------------------------------
}
class Human
{
public string name;
public float height;
public int age;
public string Name
{
get { return name; }
set { name = value; }
}
public float Height
{
get { return height; }
set { height = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public Human()
{
}
public Human(string name, float height, int age)
{
this.name = name;
this.height = height;
this.age = age;
}
/// -----------base class virtual-----------
public virtual void GrowUp(int add)
{
age += add;
}
/// ---------------------------------
}
Human 클래스에서 Human()과 Human(string name, float height, int age)는 서로 오버로딩 관계이고
부모 클래스인 Human클래스의 GrowUp 가상메소드는 자식 클래스인 Adult 클래스에서 오버라이딩되어 생일에만 나이를 먹게 수정되었다.
반응형
'공부' 카테고리의 다른 글
[TIL] [C++, 게임 프로그래밍] 241225 5-1.c++의 컴파일 과정 (0) | 2024.12.25 |
---|---|
[TIL] [C++, 게임 프로그래밍] 241224 5.파일 분리하기 (0) | 2024.12.25 |
[TIL][C++, 게임 프로그래밍] 241206~17 4.TextRPG (0) | 2024.12.17 |
[TIL] 241211 abstract 와 interface (C# 8.0 - 구현부 포함 가능) (0) | 2024.12.12 |
gitbook-cli 설치 시 TypeError: cb.apply is not a function 에러 해결 (0) | 2024.12.12 |
댓글