Programming Language/C#

C# - 클래스(1)

hustle_D 2025. 6. 21. 16:28
반응형

C#에서 클래스(Class) 는 객체 지향 프로그래밍(OOP)의 핵심 개념으로 데이터(필드)동작(메서드) 을 하나로 묶어 표현하는 사용자 정의 자료형이다.

용도적으로 설명하자면 클래스는 어떤 사물이나 개념을 코드로 표현해 놓은 설계도 라고 할 수 있다.

 

이중 기존에 닷넷에서 이미 만들어서 제공되는 클래스인 Console, Math, String 과 같은 클래스를 내장 자료형이라고 하고 우리가 직접 Class 로 만들었던 Program과 같은 클래스를 사용자 정의 자료형이라고 한다.

 

클래스는 어떤 사물이나 개념을 코드로 구현해둔 설계도로 이 클래스를 사용해서 객체를 만들어 낸다.

 

클래스의 선언

클래스를 구성하는 요소는 데이터와 동작으로 각각 멤버 필드와 메서드로 구현이 된다.

기본적인 형태의 클래스의 구성도는 아래와 같다.

[접근제한자] class 클래스이름
{
 
}

 

이 내부에 멤버 필드, 메서드들이 추가됨으로써 해당 클래스가 어떤 정보를 담을 수 있고, 어떤 기능을 하는지가 결정이 난다.

[접근제한자] class 클래스이름
{
    // 필드(Field) : 데이터를 담는 변수
    타입 필드명;

    // 생성자(Constructor) : 객체 생성 시 호출되는 특수 메서드
    public 클래스이름()
    {
        // 초기화 코드
    }

    // 메서드(Method) : 동작을 정의
    반환형 메서드명(매개변수들)
    {
        // 실행 코드
    }

    // 프로퍼티(Property) : 필드를 외부에 안전하게 공개하기 위한 기능
    public 타입 프로퍼티명 { get; set; }
}

 

여기서는 구체적인 정보는 일단 건너 뛰고 클래스의 전체적인 그림을 알아보도록 하자

(생성자나 프로퍼티 같은 개념은 익숙하지 않은개념이니..잠깐 건너 뛰자.)

 

클래스의 메서드 호출하기

먼저 클래스를 하나 생성해보자.

이렇게 자동차 클래스를 하나 생성하고 내부에 Move라는 함수를 만들어줬다.

 

이 함수를 본인 클래스 내부에서 호출하는 방법은 

이렇게 그냥 메서드명만 사용해주면 함수가 호출 된다.

이렇게 메서드명만 사용 가능한 것은 같은 클래스 내부에서 호출되는 경우에만 해당한다.

만약 다른 클래스에서 해당 메서드를 호출하기 위해서는 클래스명.메서드명 을 통해서 호출해야만 한다.

물론 이때는 해당 함수가 public으로 구현되어 있어야만 저렇게 외부 클래스에서도 호출이 가능하다.

동일한 클래스에서는 물론 public으로 구현되어 있지 않아도 클래스명.메서드명 으로 호출이 가능하다.

 

static과 정적 메서드

C#에서는 static키워드를 통해서 정적인 무언가를 표현하는데 이는 그냥 다른 말로 공유 한다라고 생각하면 된다.

클래스의 내부에 static이 붙는 멤버를 정적멤버라고 하며 이 멤버는 해당 클래스 내에서 누구나 접근해서 사용하는 것이 가능해진다.

또한 메서드에 static이 붙으면 이를 정적 메서드라고 하고 다른 말로는 공유 메서드라고 한다.

 

이렇게 static이 붙은 메서드는 class를 사용해서 객체를 생성하는 인스턴스화가 진행되지 않더라도 사용이 가능하다.

 

보통의 클래스의 메서드의 경우는 아래와 같이 인스턴스화가 진행된 이후에

인스턴스화된 객체를 통해서 함수에 접근을 하게되고 이러한 함수를 인스턴스 함수라고 한다.

 

그러나 static 함수의 경우는 인스턴스화 이후 객체를 통해서 접근하려고 하면 에러가 난다.

이는 해당 함수가 인스턴스에 속해있지 않기 때문이다.

 

정적함수는 그 클래스명을 통해서 접근해야만 사용이 가능하다.

 

클래스 시그니처

클래스 시그니처(class signature) 란 클래스를 정의할 때 클래스의 선언부 정보를 통틀어 부르는 말이다.

쉽게 말해 클래스의 머릿말을 의미한다.

이 내부에는 사실 아직 안본 상속 여부, 구현 인터페이스라는 정보들이 포함된다.

 

기본적으로 클래스는 아래와 같은 시그니쳐를 가진다.

public class Car { }

 

클래스의 기본적인 접근제한자internal이다.

위에서는 public이라는 접근제한자를 사용했으나 C#에서 클래스는 아무 것도 안 쓰면 기본적으로 internal(같은 프로젝트 내부에서만 접근 가능)을 가진다.

 

클래스의 이름은 항상 대문자로 시작하는 명사를 사용한다.

car     => X  , Car     => O
person  => X  , Person  => O
product => X  , Product => O

또한 클래스의 이름은 의미가 있는 형태의 이름이 좋다.

클래스의 이름을 지을때는 축약해서 사용하거나 특정 접두사, 언더 스코어(_)등의 특수문자를 사용하지 않는다.

이는 이렇게 안하면 구현이 안되는게 아니라 그냥 약속과도 같은 것이나, 이렇게 해야만 나중에 스트레스를 안받을 것이다.

대부분의 언어들이 비슷하다고 보면 된다.

 

클래스의 바디에는 위에서 확인했던 메서드 뿐만 아니라 필드, 프로퍼티, 생성자, 소멸자등이 올 수 있고 이 내부에 들어오는 모든걸 통틀어서 멤버라고 부른다.

 

클래스의 주요 구성요소

클래스의 주 구성요소는 필드, 메서드, 생성자, 소멸자, 프로퍼티(속성)이다.

각각은 

//필드(Field)
클래스의 내부에 선언된 변수로 객체의 상태(데이터)를 저장한다
ex) 이름, 나이, 색상, ID등..

private int age;
private string name;

//메서드(Method)
클래스의 동작이나 기능을 정의한다.
정확하게는 해당 클래스로 구현될 객체의 동작이나 기능을 담당한다.

public void Drive()
{
    Console.WriteLine("차가 달립니다!");
}

//생성자(Constructor)
클래스를 이용해서 객체를 만들때 필드를 초기화하는 특수한 메서드로 
생성자의 이름은 클래스의 이름과 동일하고 반환형이 없는 형태로 구현된다.

public Car(string model)
{
    this.model = model;
}

//소멸자(Destructor)
클래스를 이용해서 생성한 객체가 메모리 상에서 제거 될때 실행되는 함수로
자원을 해제하는 용도로 사용된다.
C#이나 자바에서는 이를 가비지 컬렉터가 처리해주기 때문에 그다지 사용되진 않는다.

~Car()
{
    Console.WriteLine("소멸자 호출됨");
}

//속성(Property)
외부에서 클래스의 필드에 안전하게 접근하기 위한 함수로
자바에서의 getter/setter와 동일한 기능을 한다.
이는 색상, 크기, 형태 같은 값을 다루고 외부에서 값을 조작하기 
위해서 사용된다.

// 속성 전체 형태
public string Color
{
    get
    {
        return color;
    }
    set
    {
        color = value;
    }
}

기본적으로 속성의 형태는 위와 같이 구현되나 아래와 같이 축약형을 사용하는 것도 가능하다
이를 내부적으로 위와 같은 형태로 변경해준다.

public string Color { get; set; }

 

반응형