티스토리 뷰

객체지향 프로그래밍의 주요 특징 4가지

  • 캡슐화
  • 상속
  • 다형성
  • 추상화

1. 캡슐화(Encapsulation)

- 객체의 데이터(속성)와 메서드(데이터를 처리하는 행위)를 하나로 묶는다.

- 실제 구현 내용 일부를 내부에 감추어 은닉한다.

- 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화하는 추상화의 한 종류이다.

위의 사진처럼 데이터와 데이터를 처리하는 행위를 묶었다.

데이터를 처리하는 행위를 다른 클래스에서 하게 되면 어떻게 될까?

할인율을 0.9%에서 0.85%로 변경한다고 가정해보자.

Product에 의존하고 있는 Store는 0.9 -> 0.85로 변경해야 한다.

예시에서는 하나의 Store 클래스이기 때문에 코드를 한 번만 바꾸면 되지만 많은 클래스들이 Product에 의존한다면,

바꿔야 할 코드량이 많아진다.--> 유지보수가 어려워진다.

 

위의 코드는 단순한 캡슐화에 대해서 설명했다.

만약 위의 코드에서 Product 클래스가 리펙토링 된다면 어떻게 될까?

데이터와 데이터를 처리하는 행위를 묶었음에도 불구하고 Product의 메서드명이 달라지니 Store도 코드를 변경해야 한다.

한 개의 클래스는 그럴 수 있다고 넘어가겠지만, 많은 클래스가 Product를 의존한다면 변경해야 할 코드량이 많아진다.

효율적인 프로그래밍은 개발 도중 또는 개발 후에 클라이언트의 요구사항이 새롭게 추가되거나 바뀌었을 때, 기존의 코드를 변경하는 일이

적은 프로그래밍이다.

Product의 코드가 변경되어도 Store의 코드는 변경되게 하지 않으려면 어떻게 해야 할까?

이를 도와주는 객체 지향 프로그래밍의 특징은 프로토콜과 구현이다.

  • 프로토콜 : 외부에서 접근 가능한 객체의 행동, 변경이 거의 없음
  • 구현 : 내부에서 구현하며, 외부에서는 구현이 어떻게 되었는지 알 수가 없다.

/* */ : 변경된 부분

Calculate라는 프로토콜을 선언한다.

Product는 Calculate를 채택하고 프로토콜 메서드를 구현한다.

Store 클래스는 Product에 의존하지 않고 Calculate에 의존한다.

Store 클래스는 Product에 접근할 수 없고 오직 Calculate에 접근 가능하다.

Product 클래스는 아무리 코드를 바꾸더라도 Calculate 프로토콜만 채택하면 Store 코드는 변경할 일이 없다.

Store 클래스는 Product가 어떻게 구현이 되었는지는 알 필요가 없다.

 

즉,  객체 내부에 캡슐화해야 하는 것은 변경될 수 있는 모든 것들(데이터, 데이터를 가공하는 행위)이고

외부에 공개해야 하는 것은 변경되지 않는 것들이다.

 

응집도와 결합도

더보기

응집도가 높고, 결합도가 낮은 애플리케이션을 개발해야 한다!!??

 

응집도란??

 

응집도는 모듈에 포함된 내부 요소들이 연관돼 있는 정도를 나타낸다.

모듈 내의 요소들이 하나의 목적을 위해 긴밀하게 협력한다면 그 모듈은 높은 응집도를 갖는것이다.

반대로 모듈 내의 요소들이 서로 다른 목적을 추가한다면 그 모듈은 응집도가 낮아지게 된다.

응집도가 높은지 검사해보는 가장 좋은 방법은 모든 메서드들에 대하여 인스턴스 변수를 사용하는 비율이 높은지 보는 것이다.

어떤 클래스의 응집도가 높다면 메서드와 변수가 서로 의존하고 있을 것이고, 응집도가 낮다면 상태와 기능의 논리적 연결이 약할 것이고, 이는 클래스를 더욱 분리할 수 있음을 암시한다.

 

결합도란??

 

결합도는 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 지식을 갖고 있는지를 나타내는 척도이다.

어떤 모듈이 다른 모듈에 대해 너무 자세히 알고 있다면 두 모듈은 높은 결합도를 가진다.

반대로 어떤 모듈이 다른 모듈에 대해 꼭 필요한 지식만 알고 있다면, 두 모듈은 낮은 결합도를 가진다.

객체 지향의 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타낸다.

 

Store 클래스의 calculate를 인터페이스에 의존하지 않고 Product 클래스에 의존하게 된다면

Store 클래스는 discountPrice 메서드뿐만 아니라, Product의 다른 인스턴스 변수에도 접근이 가능하다.

이는 꼭 필요한 지식만 알고 있는 것이 아니기 때문에 높은 결합도를 갖는다. 

 

2. 상속(Inheritance)

상속이란, 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.

상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메서드를 물려받아, 새로운 클래스를 생성할 수 있다.

이때 기존에 정의되어 있던 클래스를 부모 클래스(Parent Class) 또는 상위 클래스(Super Class), 기초 클래스(Base Class)라고도 한다.

상속을 통해 새롭게 작성되는 클래스를 자식 클래스(Child Class) 또는 하위 클래스(Sub Class), 파생 클래스(Derived Class)라고도 한다.

상속의 장점은

  • 기존에 작성된 클래스를 재활용할 수 있다.
  • 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
  • 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련한다.

상속을 통해 부모 클래스로부터 name 필드를 물려받아 자식 클래스에서 getSubscribeName이라는 기능을 추가하였다.

 

3. 다형성(Polymorphis)

다형성이란, 크게 두 가지로 분류된다.

  • 객체의 다형성
  • 메서드의 다형성

1) 객체의 다형성

객체의 다형성이란, 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.

부모 클래스와 자식 클래스가 있다.

oneProperty는 Child의 타입을 갖고 있는 참조 변수여서 Parent 타입의 인스턴스를 참조할 수 없다. 

twoProperty는 Parent의 타입을 갖고 있는 참조 변수여서 Child 타입의 인스턴스를 참조할 수 있다.

즉, 참조 변수가 사용할 수 있는 멤버의 개수가 실제 인스턴스의 멤버 개수보다 같거나 작아야 참조할 수 있다.

 

참조 변수와 타입 변환에 대한 포스팅 -->

2) 메서드의 다형성

  • 오버 로딩(Overloading)
  • 오버 라이딩(Overriding)

 2-1) 오버 로딩(Overloading)

 메서드 오버 로딩이란? 메서드명이 같고 매개변수 인자가 다르거나 반환 타입이 다르면, 문법적으로 허용이 된다.(Swift 기준)

2-2) 오버 라이딩(Overriding)

메서드 오버 라이딩이란? 부모 클래스를 상속받은 자식 클래스에서 부모 클래스의 메서드를 같은 이름, 같은 반환 값, 같은 매개변수 인자로

메서드 내의 로직들을 새롭게 정의하는 것을 말한다.

이는 하나의 부모 클래스를 상속받는 다수의 자식 클래스는 부모 클래스의 메서드를 자식 클래스마다 다르게 구현할 수 있음을 의미한다.

 

4. 추상화

공통의 데이터나 행위를 묶어 이름을 붙이는 것으로, 객체 지향적 관점에서 클래스를 정의하는 것을 추상화라고 한다.

불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것, 즉 모델화하는 것으로 데이터의 공통된 성질을

추출하여 슈퍼클래스를 선정하는 개념이다.

 

추상화를 해야 하는 이유

  • 코드의 재사용성
  • 가독성을 높임
  • 생산성의 증가
  • 에러 감소
  • 유지 보수 이점

 

참고


https://mangkyu.tistory.com/195

 

[OOP] 객체지향 캡슐화(Encapsulation), 응집도(Cohension)와 결합도(Coupling)

프로그래밍을 하다보면 추상화를 이용하고, 응집도가 높고 결합도는 낮은 애플리케이션을 개발해야 한다는 얘기를 많이 듣습니다. 그래서 이번에는 객체 지향 프로그래밍의 핵심 특징들인 캡

mangkyu.tistory.com

 

'CS' 카테고리의 다른 글

Xcode TCP ACK 확인  (0) 2023.03.09
OOP-객체 지향 프로그래밍의 이해  (0) 2022.09.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함