나 개발자 진짜 되냐?

[ C# 기본 문법 15 ] 클래스란? 객체란? 본문

C# 을 맛보았어요!/문법정리를 해보았어요!

[ C# 기본 문법 15 ] 클래스란? 객체란?

Snow Rabbit 2024. 9. 23. 12:55

 

늘 클래스가 뭔가..

에 대해 검색하고 찾아보는 일이 진짜 많았다.

 

오늘 진짜 진짜

머리에 다 넣을거다!!!


🌟 클래스란? 🌟

 

객체를 생성하기 위한 템플릿 또는 설계도

클래스는 속성과 동작을 가진다

속성은 필드로, 동작은 메서드로 표현

 

클래스(Class)는 데이터메서드를 하나로 묶은 사용자 정의 타입

 

객체를 생성하기 위해서는 클래스를 사용하여 인스턴스를 만들어야 한다.

 

 

객체? 객체는 뭘까

 

🌟 객체란? 🌟

 

객체클래스인스턴스

클래스의 실체화된 형태

 

누가 객체클래스 인스턴스 차이를

한 문장으로 정리했던 게 생각나서 가져왔다.

 

클래스 : 아만떼 설계도

객체 : 실제 아반떼

인스턴스 :  실제 아반떼 중 단 하나(우리 엄마 아반떼)

 

객체 클래스로부터 생성되며,

객체는 독립적인 상태를 가지고 있다.

즉, 객체마다 고유한 데이터를 가질 수 있다.

 

 

클래스구조체인가?

NO!

비슷한 듯 다르다.

 

 구조체클래스모두 사용자 정의 형식을 만드는 데 사용

유일한 공통점

 

하지만..!!

 

구조체값 형식이며, 스택에 할당되고 복사될 때 값이 복사

즉 컴퓨터가 알아서 저장공간을 만들어준다.

 

클래스참조 형식이며,

힙에 할당되고 참조로 전달되므로 성능 측면에서 다소 차이

 

구조체는 상속을 받을 수 없지만

클래스는 단일 상속 및 다중 상속이 가능

 

구조체

 

작은 크기의 데이터 저장이나

단순한 데이터 구조에 적합하며,

 

클래스는

더 복잡한 객체를 표현하고

다양한 기능을 제공하기 위해 사용됩니다.

 

구조체struct로 선언하고

호출 시

int i처럼

구조체 구조체변수

 

이지만

 

클래스class로 선언하고

호출 시 

new라는 친구를 사용해서

클래스 클래스변수 = new 클래스();

형식이다.

 

 

이 이유는 

클래스가 레퍼런스타입이어서 그렇다

 

레퍼런스타입? 그게 뭐지

 

레퍼런스타입

참조라는 뜻으로

 

객체의 메모리 주소를 저장하는 타입이다.

 

 

데이터가 생성된 게 아니라

데이터가 저장되어 있는 메모리 주소를 가리키는 친구다.

 

클래스는

레퍼런스타입이기 때문에

new를 써줘서

 

네가 new로 불러주면 그제야

 

공간을 하나 만들게

근데 그 공간에는 주소를 넣을 거야!

 

이렇게 불러줘야

공간을 만들어주는 친구를 우리는

동적할당이라고 한다.

 

 

🌟 클래스의 구성요소 🌟

 

1. 필드 (Fields)

클래스의 멤버 변수로 선언

 

객체의 상태를 저장하기 위해 사용하고

보통 필드는 private 접근 제한자를 사용

 

2. 메서드 (Methods)

클래스의 멤버 함수로 선언

 

클래스에서 수행되는 동작

객체의 행동이나 동작을 구현

 

3. 생성자 (Constructor)

 

객체가 생성될 때 호출되는 특별한 메서드

 

클래스인스턴스(=객체)를 초기화하고,

필요한 초기값을 설정하는 역할을 수행

 

객체가 생성될 때 자동으로 호출되며

필드를 초기화하는 등의 작업 수행

 

생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없다.

 

new 키워드와 함께 호출!!

 

생성자여러 개 정의할 수 있으며,

매개변수의 개수와 타입에 따라

다른 생성자를 호출할 수 있다.

 

이를 생성자오버로딩 이라고 한다.

 

기본적으로 매개변수가 없는

디폴트 생성자 가 클래스에 자동으로 생성되지만,

 

사용자가 직접 정의한 생성자가 있는 경우

디폴트 생성자가 자동으로 생성되지 않는다.

 

class Person
{
    private string name;
    private int age;

    // 매개변수가 없는 디폴트 생성자
    // 매개변수가 더이상없다면 이건 자동으로 생성된다. 안에 필드는 자동아늼!!
    public Person()
    {
        name = "Unknown";
        age = 0;
    }

    // 매개변수를 받는 생성자
    public Person(string newName, int newAge)
    {
        name = newName;
        age = newAge;
    }

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

Person person1 = new Person();                     // 디폴트 생성자 호출
Person person2 = new Person("John", 25);           // 매개변수를 받는 생성자 호출

 

4. 소멸자 (Destructor)

객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드

메모리나 리소스의 해제 작업 수행

 

클래스와 동일한 이름을 가지며,

이름 앞에 ~ 기호를 붙여 표현

 

요즘은 세상이 좋아져서 굳이 쓰지 않아도

알아서 조용히 만들어지는 편

 

class Person
{
    private string name;

    public Person(string newName)
    {
        name = newName;
        Console.WriteLine("Person 객체 생성");
    }

    ~Person()
    {
        Console.WriteLine("Person 객체 소멸");
    }
}

 

 

=>

생성자소멸자

메서드기 때문에

 

클래스 구성요소는

필드와 메서드 

둘 뿐이라고 생각해 주면 편하다.

 

 

🌟 접근 제한자 🌟

 

클래스의 접근 권한을 지정하여 데이터를 보호

 

public: 외부에서 자유롭게 접근이 가능

private: 같은 클래스 내부에서만 접근 가능

protected: 같은 클래스 내부와 상속받은 클래스에서만 접근 가능

 

 

접근 제한자를 적절히 사용하여

필요한 부분만 외부에서 접근 가능하도록 설정하는 것이 좋다!!

 

🌟 Property 🌟

 

이 친구는 뭐지?

 

우리는 객체의 필드 값들을

private로 설정해 놔서

접근을 못하는데

 

외부로 노출될 수 있도록 해주는

중간다리 역할친구가 있다.

 

견우와 직녀 까마귀 역할인 

프로퍼티는

직접적으로 만나게는 못하긴 하지만

간접적으로 접근해서

 

데이터 유효한지, 뭐 존재하는지

쓸 수 있도록 또는 쓸수 없게

해주는 친구이다.

 

프로퍼티.. 이름은 꽤나 생소하지만

 

코드를 보면

엇..! 많이 본 건데 싶다

 

[접근 제한자] [데이터 타입] 프로퍼티명
{
    get
    {
        // 필드를 반환하거나 다른 로직 수행
    }
    set
    {
        // 필드에 값을 설정하거나 다른 로직 수행
    }
}

 

바로바로 GET & SET이다.

GET : 프로퍼티 값 반환 즉 return이 목적

SET : 프로퍼티 값 설정 즉 value 설정 및 저장

 

 

class Person
{
    private string name;
    private int age;

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

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
}


Person person = new Person();
person.Name = "John";   // Name 프로퍼티에 값 설정 SET
person.Age = 25;        // Age 프로퍼티에 값 설정 SET

Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// person.Name의 리턴값을 적는다.

 

자 name과 age는 

private로 설정해서 접근이 안되니까

 

public Name을 만들고

get set을 통해 값을 가져와서

 

person.name 이 발동하면

프로퍼티에 의해 값을

value에 넣고

return 해준다.

 

반대로 막아주는 코드도 있다.

 

class Person
{
    private string name;
    private int age;

    public string Name //프로퍼티를 설정했지만,
    {
        get { return name; }
        private set { name = value; } // 그 안에서도 못나가게 막기
        //그래서 이 메서드는 get만 실행 될 예정!
    }

    public int Age
    {
        get { return age; }
        set // if문으로 유효성 검사 
        {
            if (value >= 0)
                age = value;
        }
    }
}

Person person = new Person();
person.Name = "John";     // 컴파일 오류: Name 프로퍼티의 set 접근자는 private입니다.
person.Age = -10;         // 유효성 검사에 의해 나이 값이 설정되지 않습니다.

Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// Name과 Age 프로퍼티에 접근하여 값을 출력합니다.

 

이 모든 걸 자동으로 해주 간단한 코드가 있다?

 

[접근 제한자] [데이터 타입] 프로퍼티명 { get; set; }

 

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Person person = new Person();
person.Name = "John";     // 값을 설정
person.Age = 25;          // 값을 설정

Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");  // 값을 읽어 출력