[면접대비] C# 기초
혼자 공부하면서 적어둔 것이라 틀린 내용이 있을 수 있습니다.
컴파일러와 인터프리터 차이
컴파일러는 전체 코드를 한 번에 기계어로 변환 후 실행하고 인터프리터는 코드를 한 줄씩 읽으면서 즉시 실행하는 방식입니다.
C# 주요 특징
C#은 객체지향 기반의 정적 타입 언어입니다. 타입 안정성이 높고 가비지 컬렉터를 통해 메모리를 자동으로 관리한다는 특징이 있습니다. 람다, 제네릭, LINQ같은 다양한 기능을 제공해서 간결하고 읽기 쉬운 코드 작성이 특징입니다.
.NET이란
마이크로소프트가 만든 소프트웨어 플랫폼으로 프로그램을 만들고 실행하기 위한 도구와 라이브러리 모음입니다. Windows, macOS, Linux 등 다양한 운영체제에서 실행 가능합니다.
빌드란
소스 코드를 실행 가능한 프로그램으로 변환하는 과정
리터럴이란
코드에 직접 작성된 값 자체입니다. 정수, 실수, 문자, 문자열, 불 형식이 있습니다
리터럴과 변수의 차이
리터럴은 코드에 고정된 값이고 변수는 저장하는 공간입니다
string 형식이란
참조형식이지만 값 형식처럼 동작하는 특별한 형식입니다
한번 생성된 문자열은 변경할 수 없다는 특징이 있습니다
C#과 .NET 형식의 관계
C#에서 데이터 형식 키워드는 .NET 구조체 클래스에 대한 별칭입니다.
C#에서 Int는 .NET의 System.Int32로 되어있습니다.
문자열 불변성 특징
문자열은 불변 객체이고 문자열을 변경하는 것처럼 보이는 동작도 실제로는 문자열을 새로 생성하는 것입니다
StringBuilder 클래스란
StringBuilder는 문자열을 반복적으로 수정하거나 연결할 때 사용하는 클래스입니다. string은 불변이라 수정할 때마다 새로운 객체가 생성되지만, StringBuilder는 내부 버퍼를 활용하기 때문에 불필요한 객체 생성을 줄일 수 있습니다. 따라서 반복문이나 문자열을 연결할 때 StringBuilder를 사용해야합니다.
암시적 형식 변환과 명시적 형식 변환 차이
암시적 형식 변환은 작은 타입에서 큰 타입으로 변환할 때 자동으로 수행되는 동작입니다.
명시적 형식 변환은 큰 타입에서 작은 타입으로 변환할 때 캐스트 연산자를 사용하여 수행되는 동작입니다.
명시적 변환은 데이터 손실이 발생할 수 있습니다
var이란?
컴파일러가 초기화 값을 보고 타입을 자동으로 추론하는 키워드입니다.
선언과 동시에 초기화 해야하고 한 번 타입이 결정되면 변경 불가합니다.
직사각형 배열과 가변 배열의 차이
직사각형 배열은 하나의 다차원 배열로 구성되며 각 행과 열의 크기가 일정합니다.
가변 배열은 배열의 각 요소가 다른 배열을 참고하는 구조이기 때문에 각 행의 길이를 다르게 설정할 수 있습니다.
함수는 메서드가 아니다
함수 멤버는 메서드, 프로퍼티, 인덱서 등 동작을 정의하는 멤버의 총칭이다.
함수의 필요성
같은 코드를 여러번 반복해야할 때 필요합니다.
재사용성, 유지보수, 가독성이 좋습니다
함수 오버로드란
함수 중복으로, 같은 이름의 함수를 매개변수를 다르게 하여 여러 개 정의하는 것
매개변수의 개수, 매개변수의 타입, 매개변수의 순서가 달라야합니다
식 본문 메서드란
중괄호 대신 ⇒ 연산자를 사용하여 간결하게 함수를 정의하는 문법입니다
절차 지향 프로그래밍이란
프로그램을 순차적인 명령어의 집합으로 구성하는 패러다임입니다
클래스란
데이터(필드)와 기능(메서드)을 하나로 묶는 단위
클래스와 구조체의 차이
클래스는 참조 형식이고 구조체는 값 형식입니다. 클래스는 객체의 참조를 전달하지만 구조체는 값을 복사하여 전달합니다.
클래스는 복잡한 데이터나 상속이 필요한 경우 사용하고, 구조체는 작고 간단한 데이터, 불변 데이터로 사용됩니다.
클래스의 정적 멤버와 인스턴스 멤버의 차이
정적 멤버는 static으로 정의 된 멤버로 호출할 때 클래스 명으로 호출하지만
인스턴스 멤버는 new 키워드로 개체를 생성한 후 호출해야합니다
클래스 구성 요소
필드, 메서드, 생성자, 소멸자, 프로퍼티, 이벤트, 인덱서 등이 있다
this 키워드란
현재 클래스나 구조체의 인스턴스 자신을 참조하는 키워드입니다
필드란
클래스 내부에 선언된 변수입니다. 객체가 생성될 때 메모리에 할당되며 클래스 전체에서 사용가능합니다
접근 한정자의 종류와 역할
public은 어디서든 접근 가능하고
private은 클래스 내부에서만 접근 가능하고
protected는 클래스 및 상속 받은 클래스에서 접근 가능합니다
생성자란
클래스의 인스턴스가 생성될 때 자동으로 호출되는 메서드
this() 생성자
같은 클래스 내의 다른 생성자를 호출할 수 있는 생성자 이니셜라이저
정적 생성자와 인스턴스 생성자의 차이
정적 생성자는 해당 타입이 처음 사용될 때 한번만 자동 호출되어 정적 멤버를 초기화하고
인스턴스 생성자는 객체가 생성될 때마다 호출되어 인스턴스 멤버를 초기화합니다
readonly 필드
필드 선언할 때나 생성자에서만 값을 할당할 수 있고, 이후에는 값을 변경할 수 없는 읽기 전용 필드입니다
식 본문 생성자
중괄호 대신 ⇒를 사용해 간결하게 표현하는 문법
소멸자란
객체가 메모리에서 해제되기 직전에 자동으로 호출되는 메서드
직접 호출은 안되고 GC가 자동으로 호출합니다
가비지 컬렉터란(GC)
더 이상 사용하지 않는 객체를 자동으로 찾아서 메모리를 해제하는 .NET의 기능
GC 실행 시점
시스템 메모리가 부족할 때, GC 자체 판단에 따라 필요하다고 결정했을 때, GC.Collect()메서드를 명시적으로 호출했을 때


기초 포스팅인데도 실무나 면접에 꼭 필요한 알짜배기 내용들이 가득하네요! 본문에 GC.Collect()를 명시적으로 호출할 수 있다고 적어주신 부분이 눈에 띄는데, 혹시 면접에서 '그럼 GC.Collect()는 평소에 우리가 코드에서 직접 호출하는 게 좋을까요, 아니면 프레임워크가 알아서 하도록 내버려두는 게 좋을까요?' 같은 실무적인 질문이 나오면 뭐라고 대답하면 좋을까요? ㅎㅎ 오늘도 잘 읽고 갑니다!
댓글 감사합니다. 저는 GC를 직접 호출하지 않고 그냥 내버려두는게 좋다고만 알고 있어서, 말씀하신 질문이 나왔을 때 많이 당황했을 것 같습니다. 덕분에 해당 질문에 대해 'GC는 기본적으로 직접 호출하지 않고 프레임워크가 알아서 하도록 내버려두는게 좋습니다. GC는 메모리를 회수하는 과정에서 성능을 많이 잡아먹기 때문입니다. 하지만 대량의 객체가 한꺼번에 불필요해진 것이 명확하고, 즉시 메모리 회수가 필요한 예외적인 상황에서는 직접 호출을 고려할 수 있습니다.'라고 대답할 것 같습니다.