클래스 하면 객체지향이라 한다.
객체 지향이란
자동차를 예로 들면
구성요소 : 자동차 , 바퀴 , 엔진 , 기어 , 브레이크 , 핸들, 엔진 속 피스톤 , 나사 이런거 등등등 있으나, 우리가 코딩시 필요한것은 그안의 기능
구성기능 : 전진,후진 , 좌회전,우회전, 등등 이다.
프로그램에 필요한 요소와 기능들만 추려서 담는것을 보고 [추상화] 라고 한다.
"요소" + "기능" 가 합쳐서 만들어진 자료형이 바로 [클래스]이다.
그리고 위 자료형 클래스로 실체화 된 결과물이 "객체" 이다.
struct와 class 차이는 간단하게, 값타입이냐, 참조타입이냐 차이가있다.
struct는 크기가 작고 간단한 객체를 정의할때 사용. 16byte이내 크기를 권장한다 한다.
클래스는 복잡하게 이것저것 다 넣어서 쓴다.
구조체는 크기가 작은 것들을 만들 때 는 구조체를 만들고
양이 많을 때는 클래스
구조체는 변수를 그대로 값 타입 이라서 하나하나 들고 스택에 쌓이고,
클래스는 참조 형처럼 주소 값을 가지고 있다.
속도 자체는 구조체가 조금 더 빠를 수밖에없다.
클래스 초기화 방법 = 새로만드는방법 = 할당방법
클래스 = 객체
클래스 안에서는 변수선언 해둔곳에 초기화가 가능하다.
클래스 내부의 변수들은 멤버변수라고 지칭한다.
간단하게 비교하면 이렇다.
1.클래스 잠조, 구조체는 값타입.
2.클래스는 좀 크고 복잡하거나 현실 물체를 객체로 표현할때
3.구조체는 가볍고 적은 데이터로만.(값타입이라 크면 스택터짐)
스택
데이터형 선언시 그 값들의 자료를 쌓는 장소.
값타입은 바로 바로 데이터를 채우고
참조타입은 다른저장장소(힙)에 쌓아두고 그 장소의 주소값 즉 참조를 가지고 스택에 쌓임.
위의 코드에서 작동하는 스택에 쌓이는것 스택 아래서 두번쨰는 int[] intArr이다.
클래스도 배열처럼
데이터공간 할당을 해줘야 안에있는 자료형들이 생성된다
위처럼 해주면됨.
클래스 공간할당한 직후 상태
좌측은 스택 우측은 힙이다.
축약하자면 이렇다.
Stack, Heap 스택 힙
1. stack: 값타입,매개변서,지역변수 빨리 만들어졌다 빨리사라질거 넣음
2. Heap : 참조타입,배열,클래스로 만들어진 객체
메서드와 프로퍼티
이런식으로 private 의 데이터형도 메서드를 만들어서 바꿀수있따.
다만 함부로 바꾸면 안된다는 경고와 함께 객관적인 동작 명칭을 지정 해 줄 수 있으므로 가독성??이 좋아진다.
프로퍼티(속성)
이런식으로 쓴다고한다.
매개변수와 차이는?
매개변수는 그냥 넣는대로 넣거나 넣을때 조건을 넣고 복잡하게 넣지만?
.
프로퍼티 내에서는 이렇게 거쳐서 넣을수있다.
이렇게 하면 콘솔좌표값을 넘어가거나 배열인덱스를 넘어가는것처럼 뭔가 제한이 필요한경우 따로 if문 추가로 더 쓸필요없이 사용할떄마다 지정해둔 코드대로 넣고 안넣고 하니 좋다.
이렇게 5만을 입력해도 넣고나서 안에서 걸려주기 때문에 프로그래머가 설정한 값까지만 나온다.
그리고 값을 받기만 하고 수정은 하고 싶지 않으면
내부에 있는 set을 안 쓰면 된다.
PosX 를 예시로 들면
public int POSX
{
get
{
return posX;
}
}
이렇게 쓰면 수정이 불가능해진다.
그러므로 일종의 필터링 역활도 하고 있다고 보면된다.
자동 구현 프로퍼티
매번 매개변수를 만들고 또 프로퍼티를 구현하기 귀찮으면 이런식으로도 사용할수있다.
물론 이안에서 get set 중 하나를 지우고 써도 된다.
필요할때만 쓰면되고 잘쓰이지는 않는 문법이다.
생성자
클래스가 new를 통해서 만들어질떄 자동으로 실행되는 것을 생성자라 한다.
이렇게 생성하자마자 넣을수도 있다.
예를들어 어떻게 바뀌는지 보여주겠다..
아래처럼 해야하던걸 생성자를 쓰면 이렇게 쓸수있따.
우리가 이렇게 생성자를 따로 생성하지않으면
나오는것이 기본생성자 라고한다.
우리가 직접 생성자를 만드는순간 기본생성자는 사라지고 만든 현재 생성자만 생긴다.
오버로딩
함수명이 같은데 인자를 다르게 넣고 다르게 구동하는걸 [오버로딩]이라고 한다.
같은 함수명을 [초과하여 여러번 사용한다]이런 뜻.
대표적인 예시가
Console.WriteLine() 가 있따. 19개정도의 오버로딩이 되어잇더라.
요약본
메소드 : 클래스 내부에서 사용하는 함수, 객체가 쓸 기능들
필드 : 클래스 내부 각종 요소들, 객체가 쓸 요소들
클래스 : 메소드와 필드 합쳐져 만들어짐
프로퍼티 : 클래스 요소들을 안전하게 다루기 위해 제공도는 문법
정보 은닉 : 외부에 공개될 필요 없는 멤버 변수를 숨긴다.
이런식으로 int를 해준뒤 변수명만 다르게 한다해도 컴퓨터가 오버로드 메서드를 호출한다 쳐도
이런식으로 모호하다. 즉? 컴퓨터는 같은 정수이고 변수명은 다르니 어떤걸 고르라는거냐 모호하다 라고 출력해주는것이다.
고로 인자값들은 변수명보단 데이터형이 같은위치에 있는건 안된다.
매개변수 디폴트값
위와 아래의 차이는 생성할때 값을 넣냐 안넣냐의 차이가 있지만,
입력값이 없을때 우리가 생성자에서 생성해둔걸로 생성해주는걸
매개변수 디폴트값 이라고 한다.
주의할점은
이렇게 하면 0이 나온다.
즉 아무값도 안들어갈수도 있으니 주의
디폴트 매개변수는 뒤에서부터 채워야함.
이런식으로 쓰면 안된다.
만약 뒤에껄 비워야하는 경우 앞뒤로 순서만 바꾸는게 베스트다.
배열에 [new]를 쓰면 [힙 영역] 어딘가에 공간을 빌린 후 [주소값]이 반환됨.
클래스에 [new]를 쓰면 해당하는 [생성자도] 부르고, [힙] 어딘가에 공간을 빌린후 , [주소값이 반환]됨.
구조체에 [new]를 쓰면 해당하는 생성자를 불러서 [임시 구조체]를 생성후 ㅡ 그 [구조체 반환]
Partial class 파셜클래스
클래스를 쪼개서 두 개이상의 cs를 사용해서 쓸수있음.
나중에 협업시 같은 cs안에 안쓰면 충돌체크가 쉽다.
이런식으로 양쪽 다 클래스 앞에 partial 써야 한다.
클래스 내부에 메서드만 따로 뺴든지 프로퍼티만 뺴든지 사람 취향에 따라 나눈다.
개인적으로 필드들만 내뚠 클래스와 메서드만 내뚠 클래스를 나누는게 좋긴할거같다.
c#은 가비지 컬렉터때문에 언제 사라질지 모르기에 소멸자는 안쓴다.
그렇지만 알고는 있어야 하지 않겠는가?
사용법은 아래와 같다.
~Player()
{
Console.WriteLine("나 소멸");
}
'IT > 학습' 카테고리의 다른 글
Static -2 static 프로퍼티 (1) | 2024.12.11 |
---|---|
Static -1. static 필드와 static 참조형 필드 (0) | 2024.12.11 |
Git 버전관리 (1) | 2024.12.06 |
재귀함수 (0) | 2024.11.29 |
main 함수의 인자 값 (0) | 2024.11.29 |