프로그래밍 공부/Java

[OOP] 객체지향 프로그래밍

1. OOP란?

OOP란 객체지향 프로그래밍 (Object Oriented Programming)의 약자로,

 

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 취급하여 프로그램에 반영하고, 순차적으로 프로그램이 동작하는 것과는 다르게 객체의 상호작용을 통해 프로그램이 동작하는 것을 말한다.

 

객체를 연결시켜 프로그래밍하면 상속, 캡슐화, 다형성을 이용해 코드 재사용을 증가시키고, 높은 유지보수성과 더불어 객체들끼리 서로 메시지를 주고받으며 동작할 수 있게 된다.

 

2. OOP의 장단점

2.1 장점

  • 코드 재사용이 용이
    남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다.
  • 쉬운 유지보수
    절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
  • 대형 프로젝트에 적합
    클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽다.

2.2 단점

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

 

3. OOP의 5대 원칙, SOLID

  • S: 단일 책임 원칙(SRP, Single Responsibility Principle)
    • 객체는 단 하나의 책임만 가져야 한다. = 변경의 이유는 단 하나여야 한다.
  • O: 개방-폐쇄 원칙(OCP, Open Closed Principle)
    • 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
    • 확장에는 열려있어야 하고, 변경에는 닫혀있어야 한다.
  • L: 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
    • (일반화 관련) 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.
    • 상위타입 객체를 하위타입의 객체로 치환해도 상위타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  • I: 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
    • 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.
  • D: 의존 역전 원칙(DIP, Dependency Inversion Principle)
    • 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.

 

4. OOP의 4가지 특징

4.1 추상화

구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것

4.2 캡슐화

캡슐화의 목적 2가지

  1. 코드를 재수정 없이 재활용하는 것.
  2. 접근 제어자를 통한 정보 은닉 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것

= 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가

 

캡슐화를 통해 객체가 외부에 노출하지 않아야할 정보 또는 기능을 접근제어자를 통해 적절히 제어 권한이 있는 객체에서만 접근하도록 할 수 있기에 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 되기에 영향 범위를 예측하는데 수월해졌다.

 

뿐만 아니라 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 객체 재활용이 원활해졌다. 객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는것이 캡슐화다. 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다.

 

4.3 상속

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

여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정

 

4.4 다형성

서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력

  • 오버라이딩(Overriding) : 상속 또는 인터페이스 구현 시, 이미 정의된 메서드를 재정의해서 사용하는 것.
  • 오버로딩(Overloading) : 두 메서드가 같은 이름을 갖고 있으나 인자의 수 또는 자료형이 다른 경우

 

여담

자바를 사용하면서도 OOP나 자바 언어 자체에 대한 공부를 많이 하지는 못한 것 같아서, 천천히 하나의 주제씩 공부를 해보려고 한다.

 

참고자료

https://jeong-pro.tistory.com/95

https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md#%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%EA%B3%BC-%EC%A0%88%EC%B0%A8%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

'프로그래밍 공부 > Java' 카테고리의 다른 글

[JAVA] JVM이란?  (0) 2022.03.13
[Java] Stream API  (1) 2022.03.03
[Regex] 정규식이란?  (2) 2022.02.21
[JUnit5] 테스트 기초 알아보기  (0) 2022.02.17