기초 메모지

객체 지향 프로그래밍 - OOP : Object Oriented Programming 본문

토막글

객체 지향 프로그래밍 - OOP : Object Oriented Programming

라큐브 2022. 7. 11. 17:34

객체 지향 언어를 사용하면서 객체 지향을 뭔지 모른다면 효율이 떨어지는 것은 당연하다. 

 

객체지향은 4가지 특징을 가지고 있다.

 

  1. 캡슐화 (Encapsulation)
  2. 추상화 (Abstraction)
  3. 상속성 (Inheritance)
  4. 다형성 (Polymorphism)

캡슐화 (Encapsulation)

약국에서 캡슐화는 캡슐에 약을 담는 것이다. 

컴퓨터에서 캡슐화는 캡슐인 인터페이스(Interface)에  약인 클래스(Class)를 담는 것이다. 

 

- 캡슐에 약을 담으면 약이 안보인다. 은닉화(Hiding)다.

- 캡슐인 인터페이스(Interface)에 약인 클래스(Class) 담으면 안보인다. 은닉화(Hiding)다.

클래스(Class)가 인터페이스 척(?) 할 수 있다.

즉, 인터페이스 타입에 클래스를 집어넣을 수 있다!!

이 개념이 중요한 이유는 다음 코드에서 확인해보자.

class Switch
{
    public void SwitchTurnOff(Computer Device)
    {
        Device.TurnOff();
    }
    public void SwitchTurnOn(Computer Device)
    {
        Device.TurnOn();
    }
}

 

 

 

 

 

 

 

SwitchTurnOff, SwitchTurnOn 메서드의 매개변수는 Computer 타입만 받을 수 있다. 

다른 타입을 받으려면 각 타입마다 오버로딩(Overloding)을 해야한다. 

class Switch
{
    public void SwitchTurnOff(Computer Device)
    {
        Device.TurnOff();
    }
    public void SwitchTurnOn(Computer Device)
    {
        Device.TurnOn();
    }
    
    public void SwitchTurnOff(SmartPhone Device)
    {
        Device.TurnOff();
    }
    public void SwitchTurnOn(SmartPhone Device)
    {
        Device.TurnOn();
    }
    
    public void SwitchTurnOff(Notebook Device)
    {
        Device.TurnOff();
    }
    public void SwitchTurnOn(Notebook Device)
    {
        Device.TurnOn();
    }
}

중복된 코드가 가독성과 효율성을 떨어트린다.

인터페이스 타입을 특정 클래스로 사용할 수 있다면?

class Switch
{
    public void SwitchTurnOff(IPower Device)
    {
        Device.TurnOff();
    }
    public void SwitchTurnOn(IPower Device)
    {
        Device.TurnOn();
    }
}

하위 클래스 상위 타입(인터페이스)으로 형변환이 가능하다는 원리에 따라 인터페이스를 구현하는 모든 타입을 받을 수가 있다. 각 클래스가 재정의(구체화)한 메소드가 실행된다.


캡슐화는 중복된 코드 생성을 방지하고 의존도 낮은 코드를 만든다.


클래스 타입을 갖는다.         > 의존도가 높다.

인터페이스 타입을 갖는다.  > 의존도가 낮다.

추상화 (Abstraction)

추상화(Abstraction), 일반화(Generalization) 모두 클래스간 공통점을 찾아서 그룹을 만드는 작업이다.

예를 들어 노트북과 스마트폰을 컴퓨터라고 볼 수 있다. 

노트북(Notebook) 클래스와 스마트폰(SmartPhone) 클래스를 추상화하면 컴퓨터(Computer) 클래스를 만들 수 있다.

public abstract class Computer
{
    /// <summary>
    /// 모델명
    /// </summary>
    public string ModelName { get; set; }

    /// <summary>
    /// 제조사
    /// </summary>
    public string Manufacturer { get; set; }

    /// <summary>
    /// 운영체제
    /// </summary>
    public string OS { get; set; }

    /// <summary>
    /// 중앙처리장치
    /// </summary>
    public string CPU { get; set; }

    /// <summary>
    /// 그래픽처리장치
    /// </summary>
    public string GPU { get; set; }

    /// <summary>
    /// 메모리
    /// </summary>
    public string Memory { get; set; }

    /// <summary>
    /// 저장장치
    /// </summary>
    public string Storage { get; set; }

    public void Calculation()
    {
        Console.WriteLine("Calculation!");
    }
}

 

 

 

 

추상 클래스라고 명시해주는게 abstract 키워드이다. 

추상 클래스니 반드시 상속해서 구체화 시키라는 뜻이다. 

상속성 (Inheritance)

상속성은 클래스를 구현하고 확장하는 작업이다.

상위 클래스의 특성에 하위 클래스(자신)만의 특성을 추가하는 것이다. 

 

상위 클래스(Computer) 기능을 포함하고 하위 클래스(SmartPhone)에서 전화, 카메라, 인터넷 기능을 추가했다.

    /// <summary>
    /// 상속을 통해 클래스를 구현, 확장하는 작업.
    /// Computer를 SmartPhone로 구체화.
    /// </summary>
    public class SmartPhone : Computer, IPower
    {
        public void TurnOff()
        {
            Console.WriteLine("휴대폰을 종료하려면 오른쪽 상단에 있는 버튼을 꾹 눌러주세요.");
        }

        public void TurnOn()
        {
            Console.WriteLine("휴대폰을 부팅하려면 오른쪽 상단에 있는 버튼을 꾹 눌러주세요.");
        }

        /// <summary>
        /// 전화
        /// </summary>
        public virtual void Call()
        {
            Console.WriteLine("전화 걸기 및 받기");
        }

        /// <summary>
        /// 카메라
        /// </summary>
        public void Camera()
        {
            Console.WriteLine("사진 또는 동영상 촬영");
        }

        /// <summary>
        /// 인터넷
        /// </summary>
        public void Internet()
        {
            Console.WriteLine("웹 서핑");
        }

        public virtual void Sending()
        {
            Console.WriteLine("문자 보내기");
        }
    }

다형성 (Polymorphism)

상위 클래스 메서드를 `다`양한 `형`태로 이용할 수 있는 `성`질.
스마트폰(SmartPhone)을 갤럭시(Galaxy), 아이폰(iPhone)으로 다향한 형태로 이용할 수 있다. 

스마트폰(SmartPhone)을 갤럭시(Galaxy)로 이용.

public class Galaxy : SmartPhone
{
    /// <summary>
    /// 다형성 - 상위 클래스 메서드를 다양한 형태로 이용할 수 있는 성질
    /// </summary>
    public override void Call()
    {
        Console.WriteLine("갤럭시 휴대폰 전화 걸기 및 받기");
    }

    public override void Sending()
    {
        Console.WriteLine("메시지 +");
    }

    public void SamsungPay()
    {
        Console.WriteLine("삼성페이");
    }
}

스마트폰(SmartPhone)을 아이폰(iPhone)로 이용.

public class iPhone : SmartPhone
{
    /// <summary>
    /// 다형성 - 상위 클래스 메서드를 다양한 형태로 이용할 수 있는 성질
    /// </summary>
    public override void Call()
    {
        Console.WriteLine("아이폰 휴대폰 전화 걸기 및 받기");
    }

    public override void Sending()
    {
        Console.WriteLine("i 메시지");
    }

    public void MacSafe()
    {
        Console.WriteLine("맥 세이프");
    }
}
반응형
Comments