휴일 지나고 나선 미니 프로잭트 기간때처럼 탠션과 집중력이 유지가 되질 않는다.. 의외로 혼자 공부하는건 적성에 맞지 않는걸까? 아니면 C#이 생각보다 어려운 탓인걸까? 오늘 뭘 배웠길래 이런 감상이 나왔는지 다음과 같이 서술하겠다..
1)클래스와 객체
{
객체 지향 프로그래밍
{
객체 지향 프로그래밍 ( Object-Oriented Programming, OOP ) 에 대한 특징을 간단히 요약하자면
1. 캡슐화 : 관련 데이터와 기능을 한 단위로 묶어 안전성과 유지보수성을 높임
2. 상속 : 동물 안에 포유류가 있고, 포유류 안에 식육목 등이 있듯이 클래스를 확장시키는 메커니즘이다.
이는 코드의 중복을 줄이고, 구조화와 유지보수를 용이하게 해준다.
3. 다형성 : 오버로딩과 오버라이딩을 통해 하나의 메소드로 다양한 객체에서 동작할수 있게 한다.
4. 추상화 : 세부사항을 감추고 개념에 집중하는 기능이다.
5. 객체 : 데이터와 메소드를 가지고 객체들간에 상호작용을 해서 프로그램을 동작시킨다.
그래서 클래스가 무엇이냐 :
클래스는 일종의 붕어빵 틀로, 이걸로 객체를 인스턴스화해 생성하는 역할이다. 즉 거푸집 내지는 설계도 역할을 하는것.
그렇게 객체는 클래스로부터 인스턴스로서 생성되며, 각자 독립적으로 고유의 데이터를 가질수 있다고 한다.
예를 들어 이 코드에선 class Person이 거푸집이 되었고, 그걸 Person p = new Person(); 으로 p라는 객체를 생성해준것이다.
클래스를 설명할땐 접근 제한자( 위의 예시에선 아마 static )가 빠질순없다.
클래스 내외로 어떻게 접근 가능할지를 정해주는 기능이라고 할수 있다.
}
필드와 메소드
{
필드 는 클래스나 구조체 내에서 객체의 데이터를 저장하는 변수 다. ( 필드 = 변수 ? )
즉 클래스 { } 내에서 선언해주는 string,int,float 등의 변수들을 필드라고 부르게되는것 같다. ( 주로 private로 쓴다고 한다 )
메소드 는 클래스나 구조체 내에서 객체의 동작(기능)을 정의하는 함수라고 한다. ( 메소드 = 함수 ? )
자주 사용했던 public void x() 등의 함수들을 메소드라고 부르게 되는것같다. ( 주로 public을 쓴다고 한다 )
}
생성자와 소멸자
{
생성자 란 객체가 생성될때 호출되는 메소드이다.
생성되는 객체를 초기화하고, 필요한 초기값을 설정한다고 한다. ( new를 통해 초기화를 해준다 )
이 사진에서 public Person() 이 디폴트 생성자다.
이런식으로 생성자를 같은 이름으로 다르게 설정해주면 생성자 오버로딩을 구현할수 있게된다.
생성자 오버로딩이란 생성자를 여러개 정의해서 각 생성자의 매개변수들과 타입에 따라 다르게 호출할수 있게 하는것.
소멸자 란 객체가 소멸되는 시점에 자동으로 호출되는 메드이다.
}
프로퍼티
{
프로퍼티란 클래스 내부의 필드에 대한 접근을 간접적으로 제어하는데 사용된다고 한다.
구조는 get, set 접근자를 사용해 간접적으로 값을 가져오는 듯하다.
아직은 이해가 잘 안되는 부분이지만 일단 코드의 안정성/가독성을 위해 간접적으로 접근시키는 기능인듯 하다.
후에 더 이해가 잘 되면 자세히 기록하도록 하겠다.
}
}
2) 상속과 다형성
{
상속
{
위에서 서술했듯이, 상속은 기존의 클래스(부모)에서 확장,재사용해서 새로운 클래스(자식)을 만들어내는걸 말한다.
이렇게 만들어진 상속된 자식 클래스는 부모 클래스의 기능들(필드, 메소드, 프로퍼티 등)을 이어받아 사용할수 있고,
각 자식 클래스별로 이어받은 기능들을 수정하거나 확장해서 사용할수도 있다.
부모 클래스인 Animal에서 Name과 Age라는 필드 , 그리고 Eat과 Sleep이라는 메소드 를 선언해주었고. 그 클래스를 상속받은 Cat과 Dog 클래스는 그 기능들을 이어받고 각각 자기들만의 소드들을 가질수 있다.
이렇게 호출해주면 자식 클래스에서 선언되지 않았음에도 부모클래스의 메소드를 이어받아 호출이 가능하다.
그런데 Cat의 경우엔 Sleep을 따로 호출해주었는데, 그렇게 해주니 동명의 부모의 메소드를 생략하고 자식의 것으로 호출이 된다.
}
다형성
{
1. 가상 메소드
첫번째로 가상(Virtual) 메소드 라는 개념이 나오는데, 기본적으로 부모 클래스에서 virtual 키워드를 사용해 정의되고, 자식 클래스에서 재정의 할수 있는 메소드 라고 한다.
재정의는 위에서처럼 할수 있는데 왜 가상 메소드가필요하냐면, 자식 객체를 많이 관리하게되면 각 자식 클래스별로 관리하는것이 아니라 부모 클래스로 관리해야 할때가 있는데, 이럴때 자식 객체에서 위처럼 재정의를 하면 문제가 발생하기 때문이라고 한다.
객체들을 부모 클래스로 관리해주게 되면 메소드를 불러올때 부모 클래스에 해당하는 부분만 불러오게 되는데, 이를 해결하기위해 각 자식 클래스를 불러올때마다 부모 클래스의 메소드를 덮어씌워주는 방식인 것이다.
Virtual로 메소드를 만들어서 동작할때 Override로 재정의를 해준다.
2. 추상 클래스와 메소드
추상(Abstract)클래스는 직접적으로 인스턴스를 생성할수 없는 클래스로,
주로 상속을 위한 베이스 클래스로 사용된다고 한다.
가상 메소드와의 차이점은 추상 클래스는 인스턴스를 생성할수 없기때문에 자식클래스에서 재정의가 되지 않으면 사용이 불가능하다는 점이다.
3. 오버라이딩과 오버로딩
오버라이딩(Overriding) 이란 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하는것이다. ( 말그대로 덮어쓰기 )
상속 관계에서만 발생할수 있고, 메서드의 이름이나 매개변수 및 반환타입이 동일해야 잘 덮어씌워진다.
오버로딩(Overloading) 이란 같은 메소드 이름을 가지고 있으나 매개변수의 개수, 타입, 순사 등이 다른 여러개의 메소드를 정의하는것을 뜻한다. 메소드를 같은 이름으로 여러가지 방식을 만들어두면 각 상황에 맞게 불러와진다고 한다.
}
}
3) 고급 문법과 기능
{
제너릭
{
제너릭이란, 독립된 클래스나 메소드 등의 데이터를 일반화시켜 다양한 자료형에 대응할수 있는 기능이라고 한다.
이걸 이용해서 코드의 재사용성을 높일수 있다고 한다.
제너릭은 클래스명 옆에 <T> 를 선언해서 사용한다고 한다. (제너릭을 <T1, T2> 로 선언해서 두개를 사용할수도 있다)
이 <T> 를 사용하는것이 이해가 잘 안갔었는데 팀원분에게 물어보고 답을 얻었다.
클래스속 메소드를 선언할때 기존 개념에선 어떤 값으로 불러올지를 선언한다, 예를 들면 :
public void Introduce(string "Hi") 이런식. 이렇게 string으로 선언을 하면 여기엔 string으로밖에 안들어간다. 한가지 자료형으로만 쓸수 있는것이다. 근데 미리 클래스에서 <T>를 써서 제너릭을 선언해주면, 이 T를 다양한 자료형으로 대응할수 있게 된다.
이런식으로 Class Stack<T>로 클래스가 선언되면, private T[] elements; 로 필드를 선언할수 있다. 여기서 사용된 T는 제너릭 자료형으로, 여기선 int가 되었다.
}
out, ref 키워드
{
}
'게임개발 > C#' 카테고리의 다른 글
24-09-22 C# 프로그래밍 기초 02.7 (0) | 2024.09.22 |
---|---|
24-09-21 C# 프로그래밍 기초 02.5 (0) | 2024.09.21 |
24-09-19 C# 프로그래밍 기초 01 (2) | 2024.09.19 |
28-08-16 코딩실습과정 ++ (0) | 2024.08.16 |
24-08-15 코딩실습과정+ (0) | 2024.08.16 |