[CS]OOP : Object-Oriented Programming(객체 지향 프로그래밍)

김피자·2023년 2월 6일
0

CS

목록 보기
8/22

사실 나는 객체를 그냥 간단하게 현실세계에 존재하는 것을 일반화 시킨 것?! 속성과 행위를 가진 클래스!! 정도로만 이해하고 있었다.
오늘 포스팅을 통해 객체지향에 대해 제대로 파볼 예정임ㅎ


객체

객체란 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어 만든 것


객체 지향 프로그래밍(Object-Oriented Programming)

객체 지향 프로그래밍은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법

여기서 중요한 것은 상호작용!!
객체는 또 다른 객체와 상호간에 요청과 응답을 주고받으면서 협력해야하는 사이라는 것


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

  1. 추상화
  2. 캡슐화
  3. 상속
  4. 다형성

1. 추상화 : Abstraction

객체들이 공통적으로 필요로하는 속성이나 동작을 하나로 추출해내고 이를 묶어 이름을 붙이는 것

추상화라는 개념을 항상 생각하며 설계해야 유연함을 갖출 수 있다.
세부적인 사물의 공통 특징을 파악한 후 하나의 묶음으로 만들어 내는 것이 추상화

ex) [볼보, 티코, 벤츠, 모닝, 트럭]는 모두 '자동차'에 해당한다 '자동차'라는 추상화 집합을 만들어두고 이들이 공통적으로 필요로하는 속성이나 동작을 만들어서 활용한다.

[자동차가 움직이기 위해서는 기름이 필요하다]처럼 자동차들은 모두 주유를 필요로 한다. 이렇게 공통적인 속성을 추출해 만들어놓는거임


2. 캡슐화 : Encapsulation

데이터 구조와 데이터를 다루는 방법들을 결합시켜 묶는 것
(변수와 함수를 하나로 묶는 것)

캡슐화의 목적
1. 코드를 재수정 없이 재활용 하는 것
2. 접근 제어자를 통한 정보 은닉

정보 은닉을 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것

설명하면 한 곳에서 변화가 일어나도 다른 곳에 미치는 영향을 최소화 시키는 것을 의미함
즉, 객체 내부의 어떤 동작에 대한 구현이 어떻게 되어있는지 감추는 것을 의미함 > 외부에서 잘못 사용해 객체를 손상시키는 일을 방지

결합도란 어떤 기능을 실행할 때 다른 클래스나 모듈에 얼마나 의존적인지 나타내는 지표 쉽게말해 의존도라고 할 수 있음

객체간 독립성을 강조하기위해 객체지향 프로그래밍이 등장했는데 결합도가 높으면 의미가 없겠쮸?

높은 응집도와 낮은 결합도? (토비의 스프링)
1. 높은 응집도

  • 하나의 모듈, 클래스가 하나의 책임 또는 관심사에만 집중되어 있다는 것
  • 불필요하거나 직접 관련이 없는 외부의 관심과 책임이 얽혀 있지 않으며, 하나의 공통 관심사는 한 클래스에 모여 있음
  • 변화가 일어날 때 해당 모듈에서 변하는 부분이 크다는 것
  1. 낮은 결합도
  • 책임과 관심사가 다른 오브젝트 또는 모듈과는 낮은 결합도, 즉 느슨하게 연결된 형태를 유지하는 것
  • 느슨한 연결은 관계를 유지하는 데 꼭 필요한 최소한의 방법만 간접적인 형태로 제공하고 나머지는 서로 독립적이고 알 필요도 없게 하는 것

객체 내의 모듈 간 요소가 밀접한 관련이 있는 것으로 구성하여 응집도를 높이고 결합도를 줄여야 요구사항 변경에 대처가 가능한 좋은 설계라고 할 수 있다.

높은 응집도와 낮은 결합도는 '은닉화'를 통해 이룰 수 있음
외부에서 접근할 필요 없는 것들은 private처럼 접근 제어자를 통해 접근을 막아버림

외부 객체는 객체 내부의 구조를 모르게하고 해당 객체가 노출을 허락한 필드와 메소드만을 이용하게 하여 의도하지 않은 동작 오류를 방지하고 유지보수 효율을 높임

객체 지향 프로그래밍에서 기능과 특성의 모음을 '클래스'라는 캡슐에 분류해 넣는 것이 캡슐화
객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다


상속 : Inheritance

부모 클래스의 속성과 기능을 그~대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것

상속의 장, 단점

장점

  • 재사용으로 코드가 줄어든다
  • 범용적 사용이 가능하다
  • 자료와 메소드의 자유로운 사용 및 추가가 가능하다

단점

  • 상위 클래스의 변경이 어려워진다
    : 부모에 의존하는 자식이 많을 때 부모의 변경이 필요하다면, 이를 의존하는 자식들에게 영향 많음
  • 불필요한 클래스가 증가할 수 있다
    : 유사 기능 확장 시, 필요 이상의 불필요한 클래스를 만들어야할 수 있음
  • 상속이 잘못 사용될 수 있다
    : 같은 종류가 아닌 클래스의 구현을 재사용하기 위해 상속을 받게되면 문제가 발생할 수 있음

상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종임


다형성 : Polymorphism

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것
어떤 요소에 여러 개념을 넣어 놓는 것

즉, 오버라이딩, 오버로딩이 가능하다는 이야기임

객체 지향 프로그래밍은 하나의 클래스 내부에 같은 여러 이름의 행위를 여러개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있기 때문에 다형성이라는 특징을 갖음

  • 오버라이딩 : Overriding
    부모 클래스의 메소드와 같은 이름, 매개변수를 재정의 하는 것
  • 오버로딩 : Overloading
    같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것

객체 지향 프로그래밍의 장, 단점

지금까지 객체 지향 프로그래밍의 4가지 특징에 대해 알아봤다.
그럼 이제 객체 지향 프로그래밍의 장, 단점을 알아보자

장점

  • 클래스 단위로 모듈화시켜 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합
  • 클래스 단위의 수정이 가능해 유지보수가 편리
  • 클래스 재사용이나 상속을 통한 확장으로 코드 재사용이 용이

단점

  • 처리속도 상대적으로 느림
  • 객체 수가 많아지면 용량도 커짐
  • 설계시 많은 시간과 노력이 필요함

글을 마치며
어렵다 어려워 객체 지향
레고처럼 조립하여 사용할 수 있다??? 설계하고 구현할때 얼마나 많은 것들을 생각하면서 코드를 작성해야하는지 알 수 있었다. 특히 추상화.. 개념은 알겠는데 개념은......
공부가 더 필요하다 느꼈다 ^_^


출처
https://jongminfire.dev/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80
https://velog.io/@msung99/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%9D%84-%EC%95%84%EB%8A%94%EC%B2%99%ED%95%98%EC%A7%80-%EB%A7%90%EC%9E%90-%EC%9A%B0%EB%A6%AC%EA%B0%80-%EC%98%A4%ED%95%B4%ED%95%98%EA%B3%A0-%EC%9E%88%EC%97%88%EB%8D%98-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5%EC%97%90-%EB%8C%80%ED%95%B4
https://jeong-pro.tistory.com/95
https://velog.io/@haero_kim/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

profile
제로부터시작하는코딩생활

0개의 댓글