정적(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
'Embedded > 3. C, C#, Python' 카테고리의 다른 글
C# - 코딩 연습 / 1. Lotto 제작 / 2. 가위바위보 게임 (0) | 2024.04.22 |
---|---|
C - 헷갈리는 개념 정리 (0) | 2024.04.17 |
C# - 구조체 / 열거형 (0) | 2024.04.15 |
C# - 코드 작성 연습 (숫자 맞추기 게임) (0) | 2024.04.10 |
C# - 배열, 함수 (코드 작성 연습) (0) | 2024.04.08 |