1. 객체지향 프로그래밍에 대해 설명해 주세요.
객체 지향 프로그래밍(OOP)는 객체와 클래스 중심으로 코드를 구성합니다.
추상화, 캡슐화, 상속성, 다형성 개념을 통해 객체 지향 프로그래밍에서 유연하고 확장성을 높일 수 있는 코드를 작성할 수 있습니다.
1.1. 추상화/캡슐화/상속성/다형성
추상화 :
복잡한 개체나 단위를 간결하고 명확하게 표현하기 위해 중요한 특징이나 기능을 간추려 내는 과정을 말합니다.
즉 객체들의 공통적은 특성이나 기능을 강조하며 이를 통해서 세부 기능을 숨겨 표현하며 프로그램을 이해하기 쉽게 만들어주며 관리하기 편하게 만들어준다.
캡슐화 :
데이터를 처리하는 메서드를 하나로 묶는 작업을 말한다. 또한 외부로부터의 데이터를 보호하는 작업이라 볼 수 있으며, 접근을 제한함으로써 오류를 줄이고 유지보수를 용이하게 해 줍니다. 그러므로 외부에서 객체의 내부 구조를 알 수 없으며 객체가 노출되는 UI/UX를 통해서 상호작용만 가능합니다.
상속성 :
객체 지향 프로그래밍에서 객체가 다른 객체의 특성을 물려 받는 작업을 말한다. 상속을 통해 기존에 구현된 클래스의 코드를 재사용이 가능해지며 계층구조를 형성을 하게 된다. 그러므로 재사용성이 증가되며 유지보수 마찬가지로 편해집니다.
다형성 :
동일한 메서드를 호출하지만 매개변수에 따라 다른 작동을 하게 만드는 것입니다. 동일한 메서드 이름을 갖고 있지만 서로 다른 클래스에서 다른 기능을 구현할 수 있습니다. 다형성의 방법은 오버로딩(Overloading)과 오버라이딩(Overriding)이 있습니다.
- 오버로딩(Overloading) : 동일한 메서드 이름을 가지지만 매개변수의 개수나 타입이 다른 여러 메소드를 정의하는 것.
- 오버라이딩(Overriding) : 상속 관계에 있는 부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것
Code)
//추상화, 캡슐화
public abstract class Animal
{
public abstract void Run();
}
public class Cat : Animal
{
private int speed;
public Cat(int x)
{
speed = x;
}
public override void Run()
{
Console.WriteLine("Run Speed : " + speed);
}
}
//상속성, 다형성
public class Dog : Animal
{
private int speed;
private int jump;
public Dog(int w, int h)
{
speed= w;
jump= h;
}
public override void Run()
{
Console.WriteLine("Run Speed : " + speed + " Jump : " + jump);
}
}
public class Program
{
public statci void Main()
{
Animal[] anims = new Animal[2];
anims[0] = new Cat(5);
anims[1] = new Dog(3, 5);
foreach(Animal item in anims)
{
item.Run();
}
}
}
2. 스레드와 프로세스의 차이는 무엇일까요?
쓰레드와 프로세스의 같은 의미로는 컴퓨터에서 실행되는 프로그램의 실행 단위를 나타낸다.
스레드(Thread) :
- 한 프로세스 내에서 실행되는 여러 작업의 흐름으로 프로세스 내에서 실행되는 기능 단위.
- 하나의 프로세스 내에는 여러 스레드가 공유하는 메모리 공간과 자원이 존재한다.
- 여러 스레드는 같은 프로세스 내에 존재하므로 하나의 스레드가 오류가 발생한다면 다른 쓰레드에 영향을 미칠수 있다.
- 쓰레드 간의 통신은 공유 메모리를 통해 빠르게 이루어진다.
- 멀티쓰레딩을 통해서 여러 스레드가 동시에 실행될 수 있다. 이는 프로세스 성능을 높일 수 있지만 스레드 간의 동기화와 공유 자원 관리가 필요하기 때문에 프로그래밍이 복잡해질 수 있다.
프로세스(Process) :
- 운영체제로부터 자원을 할당받는 독립적인 실행 단위
- 프로세스는 자체적으로 메모리공간, 파일 디스크립터, 스레드 등의 자원을 스스로 갖고 있다.
- 프로세스는 다른 프로세스의 오류의 영향을 미치지 않고 독립적으로 실행된다.
- 프로세스의 통신은 별도의 모듈 작업이 필요하며 통신이 느릴 수 있다.
- 여러 프로세스가 동시에 실행되면 운영체제의 스케줄러가 CPU 시간을 분배하여 실행된다.
3. Interface와 abstract에 대해 말해주세요.
인터페이스, 추상클래스는 객체지향프로그래밍에서 추상화를 통해 다형성과 코드 재사용을 가능하게 하지만 목적과 사용에 차이를 가지고 있다.
인터페이스(Interface) :
- 메서드 선언만 하고 기능 구현을 갖지 않은 형태의 클래스입니다.
- 모든 메서드는 추상 메서드로 취급되므로 추상클래스 선언을 사용하지 않아도 된다.
- 인터페이스를 구현하는 클래스는 인터페이스의 모든 메서드를 반드시 구현해야 된다.
- 다중 상속이 허용되므로, 여러 개의 인터페이스를 한 클래스에서 구현할 수 있다.
- 인터페이스는 클래스보다 더 높은 추상화를 제공하며, 다형성을 지원한다.
추상클래스(Abstract Class) :
- 일반클래스와 차이로는 추상 메서드를 포함할 수 있다.
- 추상 메서드는 메서드 선언만 있고, 구현은 하위 클래스에서 이루어진다. 추상 메서드는 "abstract" 키워드를 선언해서 사용해야 합니다.
- 추상 클래스 자체로는 인스턴스를 생성할 수 없다. (직접 객체를 만들어서 사용할 수 없다.)
- 하위 클래스에서 추상 클래스를 상속받게 되면 추상 메서드를 반드시 구현해야 된다.
- 단일 상속만 허용된다. 다중 상속 불가능
4. TCP와 UDP의 차이점에 대해 설명해 주세요.
TCP(Transmission Control Protocol)와 UDP(User Datagram Protocal)은 인터넷 프로토콜 스택에서 사용되는 전송 계층 프로토콜로써 데이터를 패킷으로 나누어서 네트워크를 통해 전송하는 역할을 한다.
TCP(Transmission Control Protocol) :
- 연결 지향성프로토콜로써, 데이터를 전송하기 전에 먼저 연결을 설정하고, 데이터를 전송한 후에 연결을 해제하는 순서로 이루어진다. 이로 인해 신뢰성이 높고, 데이터의 정확성과 순서를 보장한다.
- 데이터 전송 시 수신 측에서 수신 확인(ACK)을 보내는 기능을 통해서 데이터 손실을 최소화하며 정확성을 보장한다.
- 신뢰성을 보장하기 위해 추가적인 기능을 진행하기에 전송 속도는 상대적으로 느리다.
- 흐름 제어와 혼잡 제어를 지원하여 네트워크의 혼잡상태를 감지하며 데이터를 효율적으로 전송한다.
UDP(User Datagram Protocal) :
- 비연결 지향성 프로토콜로써, 데이터를 전송하기 전에 사전에 연결을 설정하지 않습니다. 그러므로 TCP 보다 더 빠르게 데이터를 전송할 수 있다. 하지만 데이터의 손실이나 순서가 보장되지 않는다.
- 데이터를 전송하고 수신여부를 확인하지 않는다. 데이터를 전송하고 손실되거나 순서가 뒤바뀌는 문제가 발생할 수 있다.
- 신뢰성을 보장하지 않기 때문에 데이터 전송이 빠르며 스트리밍 서비스나, 실시간 프로그램에서 많이 사용된다.
- 흐름제어와 혼잡제어 기능이 따로 없으므로 네트워크가 혼잡할 시 데이터 손실이 발생할 수 있다.
5. C# 박싱과 언박싱에 대해 설명해 주세요.
C#에서는 데이터 형식이 명확하게 지정되어야 합니다. 그러나 때로는 다른 형식으로 데이터를 변환해야 하는 경우가 있습니다. 이때 사용되는 방식이 박싱과 언박싱이라는 개념이 사용된다.
박싱(Boxing) :
박싱은 값 형식의 인스턴스를 참조형식으로 변환하는 과정을 말한다. 데이터 형식은 값 형식과 참조 형식으로 나뉜다.
값 형식은 스택에 저장되며, 참조 형식은 힙에 저장됩니다. 값 형식을 힙에 저장되도록 하려면 박싱이 필요하다.
ex)
int num = 11; //값 형식
object boxObj = num; //값 형식을 참조 형식으로 변환
주의 ! 이렇게 박싱 된 값 형식은 메모리 공간을 더 많이 사용하고 성능에 영향을 미칠 수 있으므로 불필요한 박싱은 피해야된다.
언박싱(Unboxing) :
언박싱은 박싱된 값을 다시 원래의 값 형식으로 변환하는 과정을 말한다.
ex)
object boxObj = 11; //박싱 된 값
int num = (int)boxObj; //참조 형식의 값을 값 형식으로 변환
TIP ! C# 2.0부터는 제네릭(Generic)을 사용하여 박싱과 언박싱을 피할 수 있는 방법을 제공하므로 제네릭을 활용하는 것이 좋다.