객체 지향(OOP)에 대해 설명하시오

우창민·2023년 9월 27일
0

기술면접

목록 보기
1/4
post-thumbnail

객체지향 프로그래밍이란?

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 말그대로 객체를 중심으로 프로그래밍을 하는것!

<장점>

  • 코드 재사용이 용이
  • 유지 보수가 쉬움
  • 대형프로젝트에 적합

<단점>

  • 처리속도가 절차지향에 비해 느리다.
  • 객체가 많으면 용량이 커질수 있다.
  • 기본 설계시에 많은 시간과 구상이 필요함

상추캡다 (상속 추상화 캡슐화 다형성)

<캡슐화>

  • 사용목적
  1. 클래스 내의 정보를 보호/보완/외부접근제한
  2. 유효성 검사
  • 사용방법 :class내의 변수나 클래스 메서드 등에 접근제한자를 사용함으로써 사용
    private(외부에서접근불가)
    public(외부에서 접근가능)
    protected(클래스내부 / 파생클래스 에서 접근이가능)
    internal(동일 어셈블리내에서 public에 준하는효과(동일어셈블리 = 같은 namespace)

은닉된 클래스 내의 자료형이나 오브젝트의 설정/ 접근이 필요할경우 프로퍼티의 사용이 가능하다.

Class Test(){
	private int forTest = 10;
    public int ForTest{
    get {return forTest;}
    set {forTest = value;}
    }
}

<상속>

  • 사용목적
  1. 기존의 부모클래스에서 정의된 메서드와 필드를 물려받아 생성하기에 중복적인 코드 방지
  2. 중복적인 코드의 방지가 있기에 공통적인 코드의 수정과 보완이 용이함.
  • 사용방법
    단순히 해당 클래스 뒤에 :부모클래스 만 추가하면 사용이 가능함.
public class Animal
{
	int hp = 30;
    float speed = 3.0f;
    protected void Attack(){
    Console.Writline("공격하기");
    }
}
public class Monkey : Animal
{
	public void Runaway(){
    Console.Writline("도망가기");
    }
}
static void Main(string[] args)
{
	Monkey monkey = new Monkey();
    Monkey.Attack();
}

이런 코드가 구현될경우 Monkey내에선 attack을 정의하지 않지만 부모클래스에서 정의하였으므로 Attack 함수의 사용이 가능하다.


<다형성>

  • 사용목적
  1. 특정 부모에게서 파생된 오브젝트의 형태를 다양하게 사용하기 위해 사용함
  2. 하나의 리스트에 서로다른 형태의 자료들 저장 가능.
  • 사용방법
    위의 Monkey코드 활용
Animal monkey_a = new Monkey();
Monkey monkey_m = new Monkey();
List<Animal> animalList = new List();
animalList.Add(monkey_a);
animalList.Add(monkey_m);
foreach(Animal anim in animalList)
{
	anim.Attack();
}

일 경우 자료형이 다른 각각의 monkey_a, monkey_m이지만 동일한 부모의 메서드인 attack 함수가 실행이 된다.


<추상화>

  • 특정 세부 정보를 숨기고 사용자에게 필수 정보만 표시 목적
  • 사용방법 abstract class // abstract method
abstract class Site
{
	public abstract void host(); // 추상 메서드 구현불가
    public void greeting()
    {	
    	Console.WriteLine("놀러오세요");
    ]
}
Site my = new Site(); //에러 추상클래스로는 객체의 생성이 불가능함
// 사용하는 방법 서브 클래스 이용
class My : Site
{
	public override void host()
    {
    	Console.WriteLine("Homzzang.com");
    }
}

static void Main()
{
	My my = new My(); //추상클래스의 파생클래스는 재정의가 가능
    my.host(); 		// 오버라이딩 한 추상메서드
    my.greeting(); //추상클래스 내의 일반 메서드
}

가상화

다형성에서의 연장선상에서
부모함수에 virtual함수를 구현해주고

class Animal
{
	public virtual void Sound()
    {
    	Console.WriteLine("동물소리");
    }
}
class Monkey : Animal
{
	public override void Sound()
    {
    	Console.WriteLine("끽끽");
    }
}
class Tiger : Animal
{
	public overrdie void Sound()
    {
    	Console.WriteLine("어흥");
    }
}
static void Main()
{
	Monkey monkey = new Monkey();
    Tiger tiger = new Tiger();
    
	List<Animal> animalList = new List<Animal>();
    animalList.Add(monkey);
    animalList.Add(tiger);
    foreach(var a in animal)
    {
    	a.Sound(); //output : 끽끽 \n어흥
    }
}

오버라이딩을 통해 구현을 할 경우 다형성의 원칙에 따라 monkey와 tiger를 animal 형식의 리스트에 넣을 수도 있고 해당 리스트내의 Sound를 실행 할 경우 파생클래스에서의 overrding된 함수가 실행된다.

profile
더 편하게 더 간단하게

0개의 댓글