객체지향 프로그래밍(OOP)

김형준 Kim Hyeong Jun·2023년 2월 21일
0
post-thumbnail

OOP (Object-Oriented Programming)

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

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

✔️ 객체지향의 장점과 단점

장점

  • 코드의 재사용이 용이하다.
  • 코드의 유지보수가 용이하다.
  • 대규모 프로젝트에 적합하다.

단점

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

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

  • 클래스 + 인스턴스(객체)
  • 추상화
  • 캡슐화
  • 상속
  • 다형성

객체란?

  • 객체는 실세계의 개체이다.
  • 객체는 상태(필드)와 동작(메서드)을 가진다.
  • 객체는 클래스의 인스턴스를 나타낸다.
  • 객체는 메모리에서 공간을 차지한다.
  • 객체는 다른 객체와 소통할 수 있다.

클래스란?

  • 클래스는 객체를 생성하기 위한 템플릿 또는 청사진이다.
  • 클래스는 인스턴스화 하기 전까지는 메모리의 힙 영역을 소모하지 않는다.
  • 클래스는 여러 번 인스턴스화할 수 있다.
  • 하나의 클래스는 하나의 작업만 한다.

클래스는 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것으로
객체를 만들기 위한 메타정보라고 볼 수 있다.

인스턴스는 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터를 말한다.(new 연산자)

추상화란?

  • 추상화는 사용자와 관련 있는 내용만 노출하고 나머지 세부 내용은 숨기는 개념이다.
  • 추상화를 통해 사용자는 애플리케이션이 일을 수행하는 방법이 아니라 애플리케이션이 수행하는 일 자체에 집중할 수 있다.

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

캡슐화란?

  • 캡슐화는 객체 상태가 외부로부터 숨겨진 상황에서 이 상태에 접근하려는 일련의 공개메서드만 노출하는 기법이다.
  • 캡슐화는 각 객체가 클래스 내에서 객체의 상태를 비공개로 유지할 때 성립한다.
  • 캡슐화는 정보 은닉 메커니즘이라고도 한다.
  • 캡슐화는 느슨한 결합, 재사용성, 보안 및 테스트하기 쉬운 코드와 같은 여러 가지 중요한 이점을 제공한다.
  • 자바에서 캡슐화는 접근 제어자로 구현할 수 있다.

캡슐화란 객체의 속성과 행위를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉하는 것을 의미한다.
캡슐화를 통해 코드의 느슨한 결합이 가능하며, 코드의 재사용성이 높아진다. 또한 테스트하기 쉽다는 장점도 가지고 있다.
자바에서는 접근 제어자로 캡슐화를 구현할 수 있다.

상속이란?

  • 상속을 통해 다른 객체를 기반으로 하는 새로운 객체를 만들 수 있다.
  • 생속은 객체가 다른 객체의 코드를 재사용할 수 있도록 허용하여 코드의 재사용성을 유지한다. 또한 각 객체만의 로직도 추가할 수 있다.
  • 상속은 IS-A 관계라고 하며 부모-자녀 관계라고도 한다.
  • 자바에서 상속은 extends 키워드로 구현할 수 있다.
  • 상속된 객체는 슈퍼클래스라고 하고, 슈퍼클래스를 상속받은 객체는 서브클래스라고 한다.(부모 클래스, 자식 클래스라고도 함.)
  • 자바에서는 여러 개의 클래스를 상속할 수 없다.(다중 상속X)

상속은 슈퍼클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고
기능의 일부분을 변경해야 할 경우 상속받은 서브클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 한다.
상속은 서로 다른 객체가 상당히 유사하고 몇 가지 공통된 로직을 공유하지만 완전히 동일하지 않을 때 유용하다.

다형성이란?

  • 다형성을 뜻하는 'polymorphism'이라는 단어는 그리스어로 '많은 형태'를 의미한다.
  • 다형성은 때에 따라 객체가 다르게 동작할 수 있도록 한다.
  • 다형성은 (컴파일 타임 다형성이라고 하는) 메서드 오버로딩이나, IS-A 관계의 경우 (런타임 다형성이라고 하는) 메서드 오버라이딩을 통해 형성될 수 있다.

다형성은 많은 형태를 의미한다.
좀 더 정확하게 말해, 객체지향 프로그래밍에서 다형성은 객체가 때에 따라 다르게 동작할 수 있게 해주거나
어떤 동작이 다른 방법으로 동작할 수 있도록 하는 역할을 한다. 다형성을 구현하는 방법에는 메서드 오버로딩과 메서드 오버라이딩이 있다.

✔️ SOLID 원칙

SOLID 원칙은 클래스를 작성하기 위한 다섯 가지의 유명한 디자인 패턴이다.

프로그래머가 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 만들고자 할 때 이 원칙들을 함께 적용할 수 있다.

  • SRP(단일 책임 원칙)
  • OCP(개방-폐쇄 원칙)
  • LSP(리스코프 치환 원칙)
  • ISP(인터페이스 분리 원칙)
  • DIP(의존 역전 원칙)

단일 책임 원칙 (single responsibility principle)

  • 하나의 클래스는 하나의 책임만 져야 한다.
  • 클래스를 단 한 가지 목표만 가지고 작성해야 한다는 것을 의미한다.
  • 애플리케이션 모듈 전반에서 높은 유지보수성과 가시성 제어 기능을 유지하는 원칙이다.

개방-폐쇄 원칙 (open-closed principle)

  • 소프트웨어 컴포넌트는 확장에 관해 열려 있어야 하고 수정에 관해서는 닫혀 있어야 한다.
  • 다른 개발자가 작업을 수행하기 위해 반드시 수정해야 하는 제약 사항을 클래스에 포함해서는 안 된다는 사실을 의미한다.
    다른 개발자가 클래스를 확장하기만 하면 원하는 작업을 할 수 있도록 해야한다.
  • 다양하고 직관적이며 유해하지 않은 방식으로 소프트웨어 확장성을 유지하는 원칙이다.

리스코프 치환 원칙 (Liskov substitution principle)

  • 파생 타입은 반드시 기본 타입을 완벽하게 대체할 수 있어야 한다.
  • 서브클래스의 객체는 슈퍼클래스의 객체와 반드시 같은 방식으로 동작해야 한다는 사실을 의미한다.
  • 타입 변환 후에 뛰따라오는 런타임 타입 식별에 유용한 원칙이다.

인터페이스 분리 원칙 (interface segregation principle)

  • 클라이언트가 사용하지 않을 불필요한 메서드를 강제로 구현하게 해서는 안 된다.
  • 클라이언트가 사용하지 않을 메서드를 강제로 구현하는 일이 없을 때까지 하나의 인터페이스를 2개 이상의 인터페이스로 분할하는 원칙이다.

의존관계 역전 원칙 (dependency inversion principle)

  • 구체화가 아닌 추상화에 의존해야 한다. (ex. class(구현체) 보다 interface(추상체) 에 의존)
  • 다른 구상 모듈에 의존하는 구상 모듈 대신, 구상 모듈을 결합하기 위한 추상 계층을 사용한다는 것을 의미한다.
  • 구상 모듈을 분리한다.

🌐 Reference
객체 지향 프로그래밍이 뭔가요?
객체지향 프로그래밍이란
캡슐화란 무엇인가? 어떤 이점이 있는가?
SOLID (객체 지향 설계)
자바 코딩 인터뷰 완벽 가이드

profile
I want be a developer🙂

0개의 댓글