본문 바로가기

#기본개념

#객체지향 프로그래밍이란?

반응형

#객체지향 프로그래밍이란 무엇일까? 

 

 

정의

 

 객체지향 프로그래밍(Object Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체 로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
 JAVA, C# 등이 대표적인 객체지향 프로그래밍 언어입니다.











[작성자의 다른 글 보러가기: '그래서 Java가 뭐야?']

 





#그렇다면 객체란 무엇일까?

 

객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장하는 변수와 작업을 수행할

메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.

 

객체지향 프로그래밍을 조립품에 빗대 표현할 수 있는데, 객체가 조립품의 부품조각이 될 것이고 각 부품조각을 조립해서 조립품을 완성하는 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.

 


 

#객체지향 프로그래밍 언어의 종류

객체지향 프로그래밍을 지원하는 언어로는 C++, C#, Java, Python, JavaScript, Ruby, Swift 등이 있다.

 

 


 

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

객체지향 프로그래밍은 크게 추상화, 캡슐화, 상속, 다형성 네 가지 특징을 가진다.

 


추상화

  •  객체에 공통된 속성행위를 추출 하는 것
  •  공통의 속성 행위를 찾아서 타입을 정의하는 과정
  • 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만든다.

ex>  구찌, 루이비통, 디올은 모두 '패션브랜드'에 해당된다. 패션브랜드라는 추상화 집합을 만들어두고 패션브랜드들이 

가진 공통적인 특징들을 만들어서 활용한다.

 

 

Q.추상화가 왜 필요한가요?

 

    만약 위에 언급했던 프로그래밍에 '에르메스'라는 패션 브랜드를 추가하게 될 경우, 추상화로 '패션브랜드'를 구현해놓았다면,

    다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다. 

 

 

캡슐화

  • 데이터 구조데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
  • 낮은 결합도유지할 수 있도록 설계하는 것

 

 

상속

  • 클래스의 속성과 행위하위 클래스에 물려주거나 하위 클래스상위 클래스의 속성과 행위를                                물려 받는 것을 말한다.
  • 새로운 클래스기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능

 

 

상속을 하게 된다면 장단좀이 존재하는데 이는 다음과 같다.                   

장점 단점
재사용으로 인한 코드가 줄어든다 상위 클래스의 변경이 어려워진다
범용적인 사용이 가능하다 불필요한 클래스가 증가할 수 있다
자료와 메서드의 자유로운 사용 및 추가가 가능하다 상속이 잘못 사용될 수 있다

 

 

 

 

다형성

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

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

 


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

 

장점

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

단점

  • 처리속도가 상대적으로 느리다.
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
  • 설계 시 많은 시간과 노력이 필요하게 될 수 있다.

 


#객체지향 설계 원칙 (SOLID)

객체 지향적으로 설계하기 위해 SOLID라 불리는 다섯 가지 원칙이 있다.

 

 

1. 단일 책임 원칙(SRP, Single Responsibility Principle)

  • 하나의 클래스는 단 하나의 책임만 가져야 한다.
  • 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 과련된 코드에 영향이 갈 수 있다.

 

2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.

 

3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

  • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

 

4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)

  • 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
  • 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.

 

5. 의존관계 역전 원칙 (DIP), Dependency Inversion Principle)

  • 추상화에 의존해야지 구체화에 의존하면 안된다.
  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상타입에 의존해야 한다.