Embedded/3. C, C#, Python

C# - 클래스

잇(IT) 2024. 4. 15. 16:08

정적(Static)과 인스턴스(Instance)

자주 사용되는 내장 클래스

또 다른 exe 파일 실행하기

액세스 한정자

값 형식(Value Type)과 참조 형식(Reference Type)

박싱(Boxing)과 언박싱(Unboxing)


 

정적(Static)과 인스턴스(Instance)

Static을 붙이면 객체 생성 필요없이 해당 클래스 내부에 있는 메서드를 사용할 수 있다.

그냥 Instance 메서드의 경우 해당 클래스의 객체를 생성한 뒤 해당 메서드를 사용해야 한다.

 

static / instance 코드 예제

using System;

class MyFirstClass
{
    static void StaticMethod() => Console.WriteLine("[1] 정적 메서드");

    void InstanceMethod() => Console.WriteLine("[2] 인스턴스 메서드");

    static void Main()
    {
        //[1] 정적 메서드 호출
        MyFirstClass.StaticMethod();
        //[2] 인스턴스 메서드 호출: new 키워드로 새로운 개체 생성하는 코드 모양
        MyFirstClass my = new MyFirstClass();
        my.InstanceMethod(); 
    }
}

StaticMethod()의 경우 static 정적 메서드이기 때문에 객체 생성 필요없이 바로 사용할 수 있지만, InstanceMethod()의 경우 인스턴스이기 때문에 MyFirstClass 객체를 생성해야 해당 메서드를 사용할 수 있다.


여러 개의 클래스 만들기

1. static 메서드를 사용할 경우

namespace classPrac
{
    public class MyClass
    {
        public static void MyMethod()
        {
            Console.WriteLine("클래스");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass.MyMethod();
        }
    }
}

MyClass 클래스 안에 public static으로 생성된 MyMethod() 메서드가 존재하기 때문에 객체를 생성하지 않고 MyClass.MyMethod()를 바로 사용할 수 있다.

 

2. 인스턴스 메서드를 사용할 경우

namespace classPrac
{
    public class MyClass
    {
        public void MyMethod()
        {
            Console.WriteLine("클래스");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            mc.MyMethod();
        }
    }
}

MyMethod()가 static이 붙지 않아 인스턴스 메서드로 생성된 경우 이전에 작성한 MyClass.MyMethod()처럼 바로 사용할 수 없고, MyClass mc = new MyClass(); 처럼 객체를 생성해주어야 인스턴스 메서드에 해당하는 MyMethod()를 사용할 수 있는 것을 확인할 수 있다.


클래스와 멤버

using System;

// [1][1] 클래스 생성
public class ClassName
{
    // [1][2] 멤버 생성: 메서드 멤버 생성
    public static void MemberName()
    {
        Console.WriteLine("클래스의 멤버가 호출되어 실행됩니다.");
    }
}

public class ClassAndMember
{
    public static void Main()
    {
        // [2][1] 클래스 사용
        ClassName.MemberName(); // 정적(Static) 멤버 접근
    }
}

Main() 작성된 코드중에 가장 먼저 실행되야 하는 코드에 해당한다.

Main() 메서드는 프로그램의 진입점(entry point)이며, 프로그램이 실행될 때 처음으로 호출되는 메서드이다. Main() 메서드는 반드시 static으로 선언되어야 한다.


자주 사용되는 내장 클래스

 

  • String 클래스: 프로그램 작성시 가장 많이 사용되는 문자열 처리 관련된 속성 및 메서드를 풍부하게 제공한다.
  • StringBuilder 클래스: 대용량 문자열 처리 관련된 속성 및 메서드를 제공, 일반적인 경우에는 string을 사용하여 문자열을 저장하고 큰 규모의 문자열 저장이 필요한 경우에는 StringBuilder 클래스 사용을 권장한다. StringBuilder 클래스는 System.Text 네임스페이스에 들어 있다.
  • Array 클래스: 배열 관련된 주요 속성 및 메서드를 제공한다.

또 다른 exe 파일 실행하기

namespace classPrac
{
    class Program
    {
        static void Main(string[] args)
        {
            //[1] 메모장을 실행합니다. 
            Process.Start("Notepad.exe");
            //[2] 웹 브라우저를 열고 매개 변수로 URL을 절달합니다.
            Process.Start("Explorer.exe", "https://dotnetkorea.com");
        }
    }
}

 

Process 내장 클래스를 위와 같이 활용할 수 있다.

 


액세스 한정자

 

클래스를 생성할 때 public, private, protected, internal, abstract, sealed와 같은 키워드를 붙일 수 있다. 이를 액세스 한정자(Access Modifier)라고 한다.

액세스 한정자는 클래스에 접근할 수 있는 범위를 결정하는데 도움이 된다.

 

public : 해당 클래스 또는 멤버를 다른 클래스에서 자유롭게 접근할 수 있도록 허용한다.

private : 해당 클래스 또는 멤버를 선언한 클래스 내부에서만 접근할 수 있도록 제한한다.

protected : 동일한 클래스 또는 해당 클래스를 상속하는 파생 클래스 내에서만 접근할 수 있다. 외부에서는 접근할 수 없다.

 

internal : 같은 어셈블리 내의 다른 클래스에서는 접근할 수 있지만, 다른 어셈블리에서는 접근할 수 없도록 제한한다.

abstract : 추상 클래스 또는 멤버를 나타낸다. 추상 클래스는 자체로 인스턴스화될 수 없으며, 하나 이상의 추상 멤버를 포함한다. 추상 멤버는 구현이 없는 멤버로 파생 클래스에서 구현해야 한다.

sealed : 클래스를 파생 클래스로부터 봉인하여 더 이상 상속되지 않도록 한다. 즉, 해당 클래스는 다른 클래스에서 상속될 수 없다.

 


값 형식(Value Type)과 참조 형식(Reference Type)

 

값 형식 : int, double과 같은 데이터 구조는 내부적으로 구조체로 되어 있고 전형적인 값 형식의 데이터 구조이다.

-> 값 형식은 개체에 값 자체를 담고 있는 구조다.

참조 형식 : 모든 클래스의 부모 역할을 하는 최상위 클래스인 Object 클래스와 이를 나타내는 object 키워드는 전형적인 참조 형식의 데이터 구조이다.

-> 참조 형식은 개체가 값을 담고 있는 또 다른 개체를 포인터로 바라보는 구조이다. 여러값들이 동일한 개체를 가리킬 수 있다.

 


박싱(Boxing)과 언박싱(Unboxing)

 

박싱 : C#에서 박싱은 값 형식의 데이터를 참조 형식으로 변환하는 작업을 말한다. 스택 메모리 영역에 저장된 값 형식의 데이터를 힙 메모리 영역에 저장하는 단계를 거치기 때문에 시간과 공간이 소비되는 비용이 발생한다.

int i = 123;
object o = i;
o
//1234

 

언박싱 : 참조 형식의 데이터를 값 형식의 데이터로 변환하는 과정을 언박싱이라고 부른다. 언박싱을 캐스트(Cast) 또는 캐스팅(Casting)으로도 표현한다.

object o = 1234;
int i = (int) o;
i
//1234
728x90