프로퍼티, 생성자, 소멸자, 상속, 다형성 구현-[가상 메서드, 추상화, 오버라이딩과 오버로딩, 제네릭], out, ref

ggm-_-·2024년 9월 24일
0

TIL (Tody I Learn)

목록 보기
5/27
post-custom-banner

(화)2024.09.24 자 끄적끄적...
그냥 제목 한국어로 쓰다가 영어도 넣어주고 싶어서 그냥 넣어봤음... 가독성 너무 떨어져서 뺌
공부하면서 그냥 내맘대로 내 보기 편한대로 쓴건데 틀린 거 있으면 댓글 감사

1. 프로퍼티(Property)

get, set이용해서 접근할 수 없는 대상에 간접적으로 접근하여 값을 반환하거나 값을 넣어줄 수 있다.

[접근 제한자] [데이터 타입] 프로퍼티명(약간 함수 느낌)
{
	get{}
	set{}
}
string name;

public string Name
{
	get{
		return name;
	}
	set{
		name = value;
	}
}

자동 프로퍼티

public int Age{get; set;}
  • 필드를 만들지 않아도, 자동으로 private한 필드가 생기게 된다.
  • 프로퍼티 이름과 같은 변수가 생김.(아마도)

2. 생성자, 소멸자

생성자(Constructor)

  • 생성될 때 실행됨. 형태: [클래스이름]
  • 인스턴스(객체) 초기화하고, 초기값 설정.
  • 반환 타입 x, 객체 생성 시 new와 함께 호출. 예) Person person = new Person();
  • 초기화작업 수행
  • 오버로딩 가능. 오버로딩: 매개변수가 다른 생성자를 정의하여 호출할 때 매개변수 타입과 개수에 따라 다른 함수 호출.

소멸자(Destructor)

  • 소멸될 때 실행됨. 형태: ~[클래스이름]
  • 사용한 자원의 리소스 해제
  • 메모리 해제 및 자원 정리
  • 객체의 소멸 시점에 로깅작업 수행하거나 디버깅 정보 기록가능
class Person {

	//디폴트 생성자
	public Person()
	{
	}
	//오버로딩
	public Person(string name)
	{
	}
	//소멸자 뭐 거의 쓰진 않는다
	~Person()
	{
	}
}
class Person
{
    private string name;
    private int age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {name}, Age: {age}");
    }
}



Person person1 = new Person();

3. 상속(Inheritance)

  • 기존 부모,상위 클래스 확장 or 재사용 하여 새로운 클래스 생성
  • 자식은 부모의 멤버(필드,메서스,프로퍼티 등) 상속받아 사용가능
  • 상속 통해 부모 클래스 기능 확장 및 수정하여 새로운 클래스 정의가능

상속 장점

  • 재사용
  • 계층구조표현
  • 유지보수

상속 종류

  • 단일 상속
  • 다중 상속:c#에선 지원 안함
  • 인터페이스 상속: 클래스가 인터페이스를 상속받음. 다중상속 지원함

상속 특징

  • 부모 클래스 멤버에 접근가능
  • 부모의 메서드 재정의 가능 =>다형성 구현 가능
  • 상속의 깊이로 계층구조 형성

접근 제한자와 상속

  • 접근제한자: public(전부), private(본인만), protected(본인과 자식만 접근가능)
  • 접근제한자의 사용으로 자식의 접근가능 범위가 달라진다.
  • 접근제한자를 통해 가시성을 조절하여 캡슐화와 정보 은닉 구현

4. 다형성(Polymorphism) 구현

가상 메서드(virtual)

  • 기본적으론 부모 클래스에서 정의되고 자식 클래스에서 재정의 하는 메서드
  • virtual키워드를 사용하여 선언, 자식 클래스에서 필요에 따라 재정의
  • 이를 통해 자식에서 부모 클래스의 메서드를 변경하거나 확장가능
  • 그러니까 부모 클래스에서 virtual키워드를 통해 메서드를 생성하면 자식에서 재정의를 했다고 알려주는 것.(하지 않았을 수도 있지만 했으니까 가서 확인해! 이런 느낌)
  • 자식 클래스에서는 override키워드를 통해 재정의 해야함.

왜 가상메서드를 이용해야 되는가?

자식의 형태가 아닌 부모의 형태로 리스트를 관리하고자 할 때,
어떤 부분에 접근하면 가장 가까운 부모의 형태에 들어있는 메서드들에 접근하게 된다.
이 때, 자식에서 그 메서드를 변경해줬을 지라도 부모가 가까우니 자식까지 안 가게 되는데,
[자식에서 재정의할 수도 있으니 보고와라] 가 가상메서드인 것이다.
그래서, 부모의 메서드에 virtual을 자식의 메서드에 override를 넣어 가상메서드를 관리한다.

그림 넣을까 말까 고민중

추상화(Abstraction)

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

  • 미적지근한 뭉뚱그린 클래스(와 메서드 이하 생략)
  • 아 그냥 이런 클래스가 있다~ 얘기하는 클래스. 하지만 반드시 자식 클래스에서 정의되어야 한다.
  • 부모 클래스에서 정의되지 않는다. 아니, 하면 안된다. 아니, 없어요 그냥. (부모 클래스에서 정의하는 건 가상 메서드라고 볼 수 있다)
    위의 특징은 추상메서드의 특징. 추상메서드는 정의되지 않는다.
    추상 클래스에서 어느정도의 구현은 가능하다.
  • 이런 기능이 있는데, 자식에서 무조건 만들 기능이야~ 라는 느낌
  • abstract키워드 사용하여 만듬. 자식에서 override로 구현

오버라이딩과 오버로딩(Overriding and Overloading)

  • 오버라이딩은 부모의 메서드를 재정의하는 것.
  • 오버로딩은 똑같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러개 정의하는 것. 호출을 여러개 중에 골라서 해서 오버로딩.

제네릭(Generic)

  • 다양한 자료형에 대응할 수 있는 기능.

  • <T>키워드를 사용해서 제네릭 선언.

  • 선언 시점이 아닌 사용시점에 자료형이 결정됨. 사용시점에 <T>대신 꺾쇠안에 구체적인 자료형 대입.

  • 코드의 재사용성을 높임...? 뭔 개소리야 이게...? 그냥 다양한 자료형에 대응할 수 있다는 거 같음. 그게 재사용성 높이긴 하네 ㅇㅇ

  • 제네릭을 이용한 stack구현 코드 예시

// 제너릭 클래스 선언 예시
class Stack<T>
{
    private T[] elements;
    private int top;

    public Stack()
    {
        elements = new T[100];
        top = 0;
    }

    public void Push(T item)
    {
        elements[top++] = item;
    }

    public T Pop()
    {
        return elements[--top];
    }
}

// 제너릭 클래스 사용 예시
Stack<int> intStack = new Stack<int>();
intStack.Push(1);
intStack.Push(2);
intStack.Push(3);
Console.WriteLine(intStack.Pop()); // 출력 결과: 3
  • 제네릭 두 개 이상 사용 예시
    제네릭 꺾쇠 안에 무조건 T를 사용하지 않아도 되는데 그냥 T1, T2 이렇게 쓴다. (그것이 약속이니까....)
class Pair<T1, T2>
{
    public T1 First { get; set; }
    public T2 Second { get; set; }

    public Pair(T1 first, T2 second)
    {
        First = first;
        Second = second;
    }

    public void Display()
    {
        Console.WriteLine($"First: {First}, Second: {Second}");
    }
}
Pair<int, string> pair1 = new Pair<int, string>(1, "One");
pair1.Display();

Pair<double, bool> pair2 = new Pair<double, bool>(3.14, true);
pair2.Display();

5. out, ref 키워드

  • 메서드에서 매개변수를 전달할 때 붙이는 키워드들
  • 원래 매개변수로 들어온 변수는 값만 전달되지만, out과 ref 둘 다 매개변수로 들어온 변수를 직접 변경한다.
  • out키워드를 사용한 변수는 "무. 조. 건." 값을 전달받아 변수가 바뀌어야 한다. (변수가 값을 전달받지 않으면 에러)
  • ref키워드는 값의 변경가능성이 있을 때 사용한다. out과 다른 점은 변경해도 되고 안해도 되고 차이인듯
    • ref 사용예시를 들어보면 if문을 사용해 어떤 조건일 때만 ref가 쓰인 변수가 바뀐다 요정도?
profile
미숙한 초보 게임 개발자
post-custom-banner

0개의 댓글