오늘은 다음주 첫 출근을 대비하여 서버 개발에 대해 공부해 보려고 합니다.
먼저, 채용공고에 올라와 있는 정보는 이 정도입니다.
C#을 사용하여 개발
MySQL, SQL Server 등 RDBMS 사용
이를 토대로, 필요할 것 같은 지식들을 정리해 보도록 하겠습니다.
C# 기초 키워드 정리
abstract / virtual / override
abstract는 순수 가상함수입니다. abstract로 선언된 함수는 혼자서는 사용될 수 없고, 이를 override로 상속받은 자식 클래스에서 구현을 해 줘야만 사용할 수 있습니다. 이와 달리 virtual로 선언된 가상함수는 자식에서 구현하지 않아도 사용할 수 있습니다.
virtual - override 예시
public class Mom
{
public virtual void print()
{
Console.WriteLine("Mom");
}
}
public class Son:Mom
{
public override void print()
{
Console.WriteLine("Son");
}
}
public class Program
{
public static void Main(string[] args)
{
Mom mom1 = new Mom();
mom1.print(); // Mom 출력 (abstract는 이게 안됨)
Son son1 = new Son();
son1.print(); // Son 출력
Mom mom2 = new Son();
mom2.print(); // Son 출력 (업캐스팅)
// Son son2 = new Mom(); 불가
}
}
abstract - override 예시
abstract class Dad
{
public abstract void print(); // abstract는 선언만 가능
}
class Son:Dad
{
public override void print()
{
Console.WriteLine("Son");
}
}
public class Program
{
public static void Main(string[] args)
{
// Dad dad1 = new Dad(); 추상 클래스는 선언할 수 없음
// dad1.print(); 추상 함수는 실행할 수 없음
Son son1 = new Son();
son1.print(); // Son 출력
Dad dad2 = new Son(); // 이런 식으로는 선언 가능 !!
dad2.print(); // Son 출력 (업캐스팅)
// Son son2 = new Dad(); 불가
}
}
interface
interface는 특히 실무면접 때 대답을 못 했어서 더 열심히 찾아보았습니다. 정말 완벽하게 익히고 가서 열심히 준비해왔음을 보여드리고 싶은 마음입니다!
아래는 interface를 사용한 예시입니다. 이것만 보아서는 abstract와 어떤 차이가 있는지 알 수 없습니다.
interface SampleInterface
{
void func();
}
public class Program : SampleInterface
{
void SampleInterface.func()
{
Console.WriteLine("interface");
}
public static void Main(string[] args)
{
SampleInterface obj = new Program();
obj.func(); // interface 출력
}
}
interface는 abstract와 달리, 다중 상속을 할 수 있습니다. 아래 예제를 보면, 여러 인터페이스를 상속하는 것을 볼 수 있습니다.
public class Human : Talkable, Programmer
{
public static void Main(string[] args)
{
Program jeny = new Program();
}
}
그리고 조사를 하며 가장 와 닿았던 설명은 https://myjamong.tistory.com/150 에서 든 예시였습니다. 해당 글에서는 추상 클래스는 정의를 할 때 사용하고, 인터페이스는 기능을 명세할 때 사용한다고 했습니다. 그러면서 아래와 같은 그림을 예로 들었습니다. 아래 그림을 보면 설명 없이도 추상 클래스와 인터페이스의 차이를 이해할 수 있을 것입니다.
LINQ
LINQ를 사용하면, 복잡한 정렬과 검색 없이도 데이터를 SQL처럼 골라낼 수 있습니다. 최근에 접하고 코딩테스트에서 굉장히 유용하게 사용했었는데, 이번 기회에 사용법을 정리해 보도록 하겠습니다.
..
..
라고 썼으나! 이번에 C#을 공부하기 위해 산 교재에 LINQ를 정식으로 소개하는 챕터가 있어서 이 부분은 그때 더 자세히 다루도록 하겠습니다.
박싱과 언박싱
C#의 모든 객체는 object 클래스를 상속하고 있기때문에, object로 선언이 가능하다. object 클래스로 박싱/언박싱을 수행하는 것은 자료형에 상관 없이 데이터를 주고받을 수 있다는 장점이 있습니다.
예를 들면, 아래와 같은 방식으로 선언된 배열에는 string만 넣을 수 있습니다.
String[] ary = new String[10];
// ary[0] = 1; 에러 발생
ary[1] = '2';
하지만, 아래와 같이 object로 선언된 배열에는 string과 int 모두를 넣을 수 있습니다.
Object[] ary = new Object[10];
ary[0] = 1;
ary[1] = '2';
그리고, 아래처럼 매개변수의 타입을 알 수 없을 때에도 용이합니다.
그런데 사실 원하는 대로 코드가 잘 쓰여지지 않아서, 아래 코드도 나중에 경력이 쌓이고 난 후에 보면 고칠 것이 참 많아 보일 것 같습니다...
특히 Console.WriteLine 하는 코드가 두 번 쓰였는데, 이걸 좀 다듬고 싶습니다. 지금은 어떻게 하는지 몰라 아래처럼밖에 작성하지 못했지만 ㅠ_ㅠ C#을 조금 더 공부하면 잘 할수 있게 되겠죠?
public class Girl
{
public int age = 10;
}
public class Woman
{
public int age = 20;
}
public class Program
{
public static void Print(object obj)
{
if (obj.GetType() == typeof(Girl))
{
Girl human = (Girl)obj;
Console.WriteLine(human.age);
}
else if (obj.GetType() == typeof(Woman))
{
Woman human = (Woman)obj;
Console.WriteLine(human.age);
}
else return;
}
public static void Main(string[] args)
{
Girl jeny = new Girl();
Print(jeny); // 10 출력
Woman matilda = new Woman();
Print(matilda); // 20 출력
}
}
[ 이 외에도 공부하고 싶었던 내용 ]
C#으로 소켓 통신하는 방법
C# 멀티스레딩
C# 가비지 컬렉팅
C#으로 MySQL 다루기
SQL Server란?
C# 네이밍 룰
정규 표현식
못다한 내용은 일을 하며 조금씩 정리해 보겠습니다.
'Server > C#' 카테고리의 다른 글
[C#] ??= (0) | 2023.06.20 |
---|---|
[C#] FirstOrDefault (0) | 2023.06.20 |
C# 델리게이트 (0) | 2023.06.09 |
[C# / JetbrainRider / Mac] NLog로 로그 남기는 법 (0) | 2023.06.02 |
static 맴버를 초기화하는 법 (정적 생성자) (0) | 2023.05.22 |