7장_클래스

CJB_ny·2022년 5월 28일
0

C#

목록 보기
9/9
post-thumbnail

클래스 -> 세상을 그려라

7.1 객체지향 프로그래밍과 클래스

Object Oriented Programming

객체는 속성과 기능을 가진다.

속성은 데이터로 기능은 메소드로 표현.

객체 = 데이터 + 메소드

객체 == 인스턴스 라고 부름.

string a = "123;
string b = "Hello"

string은 C#에서 이미 정의된 문자열을 다루는 클래스이고,

a, b는 객체이다.

string은 문자열을 담는 "객체"를 위한 청사진이고

a와 b는 실제로 데이터를 담을 수 있는 "실제 객체"이다.

a와 b를 string의 인스턴스라고도 부른다.

클래스는 복합 데이터 형식이다.

7.2 클래스의 선언과 객체의 생성

클래스 안에 선언된 변수 = 필드.

필드와 메소드를 비롯하여 프로퍼티, 이벤트등을 클래스의 멤버 라고함.

객체 생성

Cat kitty = new Cat()

이라고 인스턴스를 만드는데

new Cat()에서 Cat()은 "생성자"라고 하는 특별한 메소드 이다.

생성자는 클래스의 이름과 동일한 이름을 가지며, 객체를 생성하는 역할을 함.

new 키워드는 생성자를 호출해서 객체를 생성하는 데 사용하는 "연산자"이다.

모든 클래스는 복합 데이터 형식이다.

따라서

Cat Kitty;

에서 Kitty는 null을 가진다.

Kitty 자체에 메모리가 할당되는 것이 아니고 Kitty는 "참조"로써 객체가 있는 곳을

가르킬 뿐이다.

그래서 new 연산자와 생성자가 필요함.

new 연산자와 생성자를 통해 Heap에 객체를 생성하고, Kitty는 생성자가 Heap에 생성한 객체를 가리키는 것이다.


복합 데이터 형식은 == 참조 형식 => Heap메모리 영역

new 연산자와 생성자

는 "모든 데이터 형식에 사용할 수 있다."

C#에서는 int, float string등등 데이터 형식도 생성자를 가지고있다.

따라서

int a = new int();
a = 3;

string b = new string( new char ;

이런게 가능함.

근데 뭐하러 이래함? => 귀찮다.


7.3 객체의 삶과 죽음에 대하여 : 생성자와 호출자.

생성자

이딴식으로

종료자

클래스이름 앞에 ~ 붙인다.

매개변수 없고, 한정자도 없다, 오버로딩 불가능, 직접 호출 불가능.

CLR의 가비지 컬렉터가 소멸되는 시점 판단 => 종료자 호출함.

언제 CLR의 가비지 컬렉터가 수거 해갈지 모름.

~Cat()
{
	
}

정적 필드와 메소드

  • static :

    "정작이다" -> 움직이지 않는다.
    C#에서는 메소드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지칭하는 한정자이다.

파일에서 클래스는 유일하다.

static으로 한정하지 않은 필드는 자동으로 인스턴스에 소속되며,

static으로 한정한 필드는 클래스에 소속된다.



이게 static과 그 예제인데

내가 알아야 할것은 지금

Test2의 a의 경우 클래스 자체의 소속이기 때문에 "객체"를 만들지 않고

지금 이렇게 Test2.a를 출력이 가능한 것이다.

즉, static으로 수식한 "필드"는 프로그램에서 하나밖에 없다.

그래서 프로그램에서 딱 하나밖에 없는거 만들려면

"정적 필드" == static사용하면된다.


  • method

  • 정적 메소드

    클래스 자체에 소속 -> 객체 만들어서 호출 안해도된다.

정적 메소드 반댓말 -> 동적 메소드?? => ㄴㄴ

인스턴스 메소드 == 즉, 객체를 만들어야만 사용할 수 있는거

  • 인스턴스 메소드

메소드 정리

보통 객체 내부의 데이터를 이용해야 하는 경우

"인스턴스 메소드"를 사용하고,

클래스의 내부 데이터를 사용할 일이 없다면

메소드를 정적으로 선언하여 준다.

7.5 깊은 복사, 얕은 복사

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글