객체지향의 특성

2021. 8. 13. 17:49Programming Language/언어 기본

1. 추상화

2. 캡슐화

3. 상속

4. 다형성

 


 

1. 추상화

심 대상들로부터 공통적인 기능, 특성들을 추출해 한 곳에 모은 것.

프로그래밍에서는 객체들로부터 공통의 메소드/특성을 뽑아 인터페이스/추상클래스 등으로 정의하는 을 의미한다.

자바의 경우를 예로 들면, 인터페이스와 추상 클래스가 해당이 된다.

대표적인 인터페이스인 Collection은 (https://docs.oracle.com/javase/7/docs/api/),  set, list, queue 등 여러 개의 객체를 하나의 객체에 담아 처리하는 클래스들의 공통 메서드들을 선언하였고, 해당 클래스들은 Collection의 메서드들을 구현함으로써 그에 해당하는 기능을 수행할 수 있다. 

 


 

2. 캡슐화

 

함수 혹은 특성들을 하나의 단위로 묶어 처리하는 것. 보통 하나의 클래스로 묶어 처리한다. 데이터 번들링의 개념이다.

 

추상화와 혼동될 수 있는데, 추상화와 차이점을 예로 들자면,

아이폰 클래스와 갤럭시 클래스를 구현한다고 치자. 이 두 클래스간 공통적인 기능(전화 걸기, 문자 보내기 등)을 빼서 '휴대폰 인터페이스' 를 만드는 것이 추상화이다. 또한 각각의 휴대폰 클래스는 운영 체제, 기종, 휴대폰 주인 등의 정보를 하나로 묶어서 처리할 수 있는데, 이렇게 처리하는 방식이 캡슐화이다.

 

이렇게 정보를 하나로 묶어 처리할 시, 클래스 내 세부 정보를 외부로 드러내지 않는 것을 정보 은닉이라고 한다. 즉, 필요한 정보만 외부로 노출시키고, 내부 동작은 숨기는 것이다.

이렇게 정보 은닉을 할 시 두가지 이점이 있는데, 첫번째는 보안적으로 안전해 진다는 것이며 두번째는 높은 응집도 & 낮은 결합성 원칙으로 유지 보수가 훨씬 용이해진다는 점이다. 

보통 public, protected, private 등의 접근 제어자를 통해서 구현된다.

 


 

3. 상속

자식 클래스가 부모 클래스의 특성 & 기능을 그대로 물려 받는 것.

X is a Y 관계가 성립한다. IPhone is a Phone 관계가 성립하는 것을 예로 들 수 있는데, 여기선 Phone 이 부모 클래스고 IPhone 이 자식 클래스가 되는 것을 알 수 있다. 당연히 역은 성립하지는 않는다.

상속 받은 자식 클래스가 부모 클래스의 특정 기능을 필요 시 수정해서 사용할 수 있는데, 이렇게 메서드를 다시 재정의하여 덮어 쓰는(Overriding) 작업을 메서드 오버라이딩이라고 한다.

 


 

4. 다형성

하나의 변수 혹은 메서드가 상황에 따라 다르게 동작하는 것을 의미한다.

예로 들어, 휴대폰 클래스가 있고 운영체제 이름을 프린트하는 printOperSystemName 메서드가 구현되어 있다고 하자.

 

class Phone
{
  public:
    virtual void printOperSystemName()
    { 
      cout << "그냥 폰입니다." << '\n';
    }
}

 

또한 갤럭시 클래스와 아이폰 클래스가 휴대폰 클래스를 상속 받고 각각 printOperSystemName 메서드를 오버라이딩한다고 하자. 

class GalaxyPhone : public Phone
{
  public:
    void printOperSystemName()
    {
      cout << "안드로이드" << '\n';
    }
}

class IPhone : public Phone
{
  public:
    void printOperSystemName()
    {
      cout << "IOS" << '\n';
    }
}

 

갤럭시와 아이폰 각각의 객체를 만들어 Phone 클래스 변수에 저장하고, 똑같이 printOperSystem 함수 호출 시 Phone 클래스의 printOperSystem 함수가 호출되는 것이 아닌, 각각의 오버라이딩 된 printOperSystem 함수가 호출된다.

 

int main(void)
{
  Phone* phone = new Phone;
  Phone* galaxy = new GalaxyPhone;
  Phone* iPhone = new IPhone;
  
  phone->printOperSystemName();
  galaxy->printOperSystemName();
  iPhone->printOperSystemName();

  return 0;
}

/*
차례대로

그냥 폰입니다.
안드로이드
IOS

가 프린트됨.
*/

 

이처럼 같은 함수를 호출하더라도, 상황에 따라 각기 다른(오버라이딩된) 메서드들이 호출되는 것을 다형성이라고 한다.

자바의 경우, 자식 클래스 객체를 부모 클래스 변수에 참조 값을 저장하는 형 변환을 하더라도 호출되는 메서드는 실제 객체의 메서드이다. 즉, 자식 클래스의 메서드이다.

하지만 C++의 경우엔, 참조 변수를 기반으로 메서드가 호출된다. 즉, 자식 클래스 객체 참조를 부모 클래스 변수에 담을 시, 호출되는 함수는 부모 클래스의 메서드이다. 이 때, 자바처럼 실제 객체에 따라 메서드를 호출하기 위해선 부모 클래스 메서드 앞에 virtual 키워드를 넣어주면 된다.

'Programming Language > 언어 기본' 카테고리의 다른 글

객체 지향 설계 5원칙 - SOLID  (0) 2021.10.18
Parameter VS Argument  (0) 2021.06.18