[JAVA기초] OOP란?

junghan·2023년 1월 30일
0

JAVA

목록 보기
4/12
post-thumbnail

JAVA를 배우면서 일전 C++를 공부할 때 배웠던 객체 지향 프로그래밍(obeject oriented programming)을 다시 정리하기로 하였습니다.
JAVA 프로그래밍 시 핵심개념을 완벽히 숙지하고 개발하는 것과 아닐 때의 결과물 차이가 클 수 밖에 없다고 생각하기 때문에, 관련된 개념들을 한 문장으로 설명할 수 있을 때까지 반복적으로 학습 하려합니다.

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

객체 지향 프로그래밍은 컴푸터 프로그래핑 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

생활 속 객체의 예

  • 학교 가는 과정에 대한 절차적 프로그래밍

    일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다-> 요금을 지불한다 -> 학교에 도착한다.

시간의 흐름에 따른 프로그래밍

  • 학교 가는 과정에 대한 객체 지향 프로그래밍

    객체를 정의
    객체의 기능 구현
    객체 사이의 협력구현



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

장점

  • 코드 재사용이 용이 (소프트웨어의 생산성 향상)
    이미 만들어진 클래스를 상속받거나 객체를 가져와서 재사용하거나, 부분 수정을 통해, 소프트 웨어를 작성하는 부담을 대폭 줄일 수 있습니다.
  • 실세계에 대한 쉬운 모델링
    컴퓨터가 산업 전반에 다양하게 활용되는 요즘 시대에는 응용 소프트웨어를 하나의 절차로 모델링하기 어렵습니다. 산업 전반에서 요구되는 응용 소프트웨어 특성상, 절차나 과정보다 관련된 많은 물체(객체)들의 상호 작용으로 묘사하는 것이 더 쉽고 적합합니다.
  • 보안성 향상
    객체 지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있습니다.
  • 유지보수가 쉬움
    절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 됩니다.

단점

  • 처리 속도가 상대적으로 느림
    객체 지향 프로그래밍은 캡슐화와 격리구조에 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느립니다.

  • 객체가 많으면 용량이 커질 수 있음
    객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 됩니다.

  • 설계시 많은 시간과 노력이 필요



객체 지향 프로그래밍 키워드 5가지

클래스 + 인스턴스

클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타정보라고 볼 수 있습니다.

인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터입니다.

추상화

클래스를 설계하는 것 자체를 나타내고 "공통의" 속성이나 기능을 묶어 이름을 붙이는 것을 의미입니다.
ex) 서울의 지하철 노선도는 서울의 지리를 추상화

캡슐화

캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말합니다.

  • 데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉(data hiding) – 내부의 동작을 감추고 외부에는 필요한 부분만 노출

상속

상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미합니다. 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 합니다.
ex) 탈것 클래스의 자동차, 오토바이클래스

다향성

이제 객체 지향 프로그래밍의 꽃이라 할 수 있는 다형성에 대해 간략히 살펴보도록 하겠습니다. 다형성(多形性)이란 한자 이름 그대로 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미합니다.

  • 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.

  • 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.



객체지향 SOLID 원칙

  1. 단일 책임 원칙 (Single Responsiblity Principle)
    모든 클래스는 각각 하나의 책임만 가져야 한다. 클래스는 그 책임을 완전히 캡슐화해야 함을 말합니다.

사칙연산 함수를 가지고 있는 계산 클래스가 있다고 치자. 이 상태의 계산 클래스는 오직 사칙연산 기능만을 책임진다. 이 클래스를 수정한다고 한다면 그 이유는 사칙연산 함수와 관련된 문제일 뿐이다.

  1. 개방-폐쇄 원칙 (Open Closed Principle)
    확장에는 열려있고 수정에는 닫혀있는. 기존의 코드를 변경하지 않으면서( Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙을 말합니다.

캐릭터를 하나 생성한다고 할때, 각각의 캐릭터가 움직임이 다를 경우 움직임의 패턴 구현을 하위 클래스에 맡긴다면 캐릭터 클래스의 수정은 필요가없고(Closed) 움직임의 패턴만 재정의 하면 된다.(Open)

  1. 리스코프 치환 원칙 (Liskov Substitution Principle)
    자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙입니다. 즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 합니다

    자식클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야 LSP를 만족한다.

  2. 인터페이스 분리 원칙 (Interface Segregation Principle)
    객체가 충분히 높은 응집도의 작은 단위로 설계됐더라도, 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리해줄 필요가 있는데, 이를 인터페이스 분리 원칙이라고 부릅니다.

  3. 의존 역전 원칙 (Dependency Inversion Principle)
    의존 역전 원칙이란 고수준 모듈저수준 모듈의 구현에 의존해서는 안 되며, 저수준 모듈고수준 모듈에 의존해야 한다는 것입니다 한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것입니다.

    고수준 모듈: 입력과 출력으로부터 먼(비즈니스와 관련된) 추상화된 모듈
    저수준 모듈: 입력과 출력으로부터 가까운(HTTP, 데이터베이스, 캐시 등과 관련된) 구현 모듈

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%85%EB%AC%B8/unit/18020
http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5
https://jeong-pro.tistory.com/95
https://hckcksrl.medium.com/solid-%EC%9B%90%EC%B9%99-182f04d0d2b
https://www.codestates.com/blog/content/%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-%ED%8A%B9%EC%A7%95

profile
42seoul, blockchain, web 3.0

0개의 댓글