🦁 걸어봐 위엄 라잌어 라이옹/👀 주차별 과제

[대학교멋사🦁/OOD] 1. 객체 | 캡슐화

우주수첩 2023. 5. 4. 16:08
728x90

1. 서론

2. 절차지햔 VS 객체지햔

3. 객체

4. 캡슐화

 


 

1. 서론 

 

# 소프트웨어를 유지보수하는 이유

  • 변화하는 세계에서 여전히 유용한 소프트웨어가 되도록 하기 위함이다.
  • ==> 바뀌어가는 환경에 알맞게 소프트웨어 또한 변경되어야 한다.

 

 

??? 낮은 비용으로 소프트웨어를 변화시키기 위한 방법에는 어떤 것이 있을까?

  • 객체지향 프로그래밍 = 캡슐화 + 다형성(추상화) 

 


 

2. 절차 지향 vs 객체 지향

 

# 절차지향

  • 절차 지향의 장점
    • 코드 구현 시 작성하기 쉽고 시간이 적게 소요됨

 

  • 절차 지향의 단점
    • 대개 위에서 선언한 data 값을 아래에서 공유하는 방식을 사용
      • 코드의 중복 사용 및 데이터 공유의 현상이 발생  
      • 코드 수정의 어려움을 야기
      • => 비용적으로 좋지 않음.

 

 

# 객체지향

 

  • 객체지향의 특징
    • 데이터와 프로시저를 객체라는 단위로 묶는다.
    • 특정 객체가 갖고 있는 데이터는 해당 객체의 프로시저만 접근할 수 있도록 설계한다.
      • == 다른 객체는 접근할 수 없음.
    • 객체와 객체는 서로 데이터를 주고 받지는 않음
      • 그들은 서로의 프로시저를 호출하는 방식을 통해 서로 연결

 


 

3. 객체

 

#  그래서 객체가 뭐야?

  • 하나의 기능을 수행하고 있는 한 묶음 
    • 객체는 기능 제공을 기준으로 정의된다.
    • 그 객체가 어떤 기능을 제공하느냐!!!!

 

# 기능 명세

  • 메소드(operation) 이용
  • 이름, 파라미터, 결과로 구성

 

# 그럼 위에서 말한 객체와 객체 사이에서 기능을 사용하여 연결을 하는 방법은 멀까?

  • 기능 사용 == 메소드 호출
  • 메세지
    • 객체와 객체가 상호작용 한다 == 메세지를 주고 받는다

 

+) 필드 data에 대한 get, set 메소드만 있는 경우의 클래스는 data class라고 많이 표현

  • C언어의 구조체 같은 바이브...
  • 그 외의 어떠한 기능도 하지 않는 경우

 


 

4. 캡슐화

 

# 캡슐화란?

  • 데이터와 해당 데이터와 관련된 기능을 묶는 것.
    • 기능의 구현및 구현에 사용된 데이터의 상세 내용을 외부로부터 감춤 
    • ex) data가 어떤 타입인지 어떤 값을 사용하는지 등
    • 정보 은닉(Information Hiding)의 의미 포함

 

 

# 그래서 이걸 왜 해?

  • 외부의 영향 없이 객체 내부의 구현을 변경할 수 있다!
  • 기능을 사용하는 코드에 영향을 주지 않거나 최소화 하며 내부 구현을 변경할 수 있는 유연함이 생김
    • 수정에 드는 비용을 낮출 수 있는 경우가 높아짐

 

 

# 캡슐화 유뮤 상황 비교

  • 상황 : 요구사항이 변경되어 데이터구조 및 사용에 변화가 발생하였을 경우
  • 캡슐화 X
    • 해당 데이터를 사용하는 무수히 많은 코드를 일일히 수정하여 작업을 진행해야 함
    • ==> 데이터를 공유하는 절차 지향 방식의 단점.
  • 캡슐화 O 
    • 변경하고자 하는 기능의 메소드만 변경하면 됨
    • 해당 메소드를 호출함으로써 사용하는 다른 코드들은 변경되지 않음

 

 

# 캡슐화의 장점

  • 캡슐화 진행시 요구사항 변경 발생 시 연쇄적으로변경이 전파되는 것을 최소화 할 수 있음.
  • 기능에 대한 이해도를 높일 수 있음 : 코드의 의도를 파악하게 됨. 
    • 메소드를 구현한 목적에 대하여 생각 할 수 있음 

 

# 캡슐화 의 두가지 원칙

 

1. Tell, don't Ask

  • 데이터를 달라고 하지 말고
  • 그 데이터를 가지고 있는 객체의 메소드를 호출하여 그 친구를 어떻게 하게 해줘! 를 요구

 

2. Demeter's Law 데미테르의 법칙

  • 메서드에서 생성한 객체의 메소드만 호출
  • 파라미터로 받은 객체의 메소드만 호출
  • 필드로 참조하느 객체의 메소드만 호출.
    • 메소드 하나만 호출할 수 있도록 변경해라
    • 얘를 하다보면 기능의 캡슐화가 진행 될 가능성 有
    • ex) 객체.메소드().메소드() 와 같이 연속적으로 진행하는 경우가 아닌 객체.method()와 같이 특정 메소드 하나로 호출할 수 있게끔 해야함

 

 

728x90