백엔드 데브코스 TIL 02일차

Inchang Choi·2022년 3월 22일
0
post-thumbnail

학습목표

강의를 들으며 내가 알고 있는 내용을 점검하고,

새로 배운 내용을 정리하며,

궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.


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

자바는 객체지향 언어입니다.

하지만 객체지향적으로 프로그래밍 하지 않으면 객체지향이라고 할 수 없습니다.

그렇다면 객체지향 프로그래밍이란 무엇 일까요?

프로그램을 객체로 구성하는 것,

즉 프로그램이 명령어의 모임이 아닌 여러 개의 독립된 단위인 “객체"들의 모임으로 하고자 하는 것입니다.

역사

프로그램의 규모가 커지면서 어떻게 규모가 큰 프로그램을 만들 것인가? 라는 문제가 생겼습니다.

객체 지향 프로그래밍은 이 문제에 대한 해결책중의 하나로 대두 되었습니다.

작게 나눠서 만들고 그 후 합치자 “ 는 큰 틀에서의 객체지향 프로그래밍은

프로그램의 여러 동작을 각각의 객체가 작은 기능 별로 나눠서 수행하며 이러한 객체와 객체는 서로 협력 관계입니다.

즉, 분야별로 일을 잘게 쪼개 객체에게 위임하고, 서로 협력하게 만드는 것이 객체지향 프로그래밍이라고 할 수 있습니다.

그런데 이런 객체들의 역할과 기능을 나누려면 서로 구분할 필요가 있습니다.

이를 Java 에서는 type 으로 구분하며 type은 만들기 위해서 자바에서는 Class를 사용합니다.

import java.lang.*;
//class
class MyObj extends Object implements Runnable {
		//속성
		private int a = 0;
		//행위
		public void run() {
			a += 1;
		}
}
//인스턴스화
MyObj obj = new Object();

객체지향을 이해하기 위해서는,

개념적인 용어로서의 객체와 자바의 기술적인 용어인 class, instance의 차이를 이해해야합니다.

구성 요소

  • Object 객체는 현실에 존재하는 개념을 소프트웨어로 구현할 대상입니다. 현실의 객체와 비슷하여 상태와 행동을 가지지만, 소프트웨어 적인 관점에서는 concept 입니다.
  • Class 클래스는 같은 종류(또는 문제 해결을 위한) 집단에 속하는 속성과 행위를 정의한 것입니다. 객체지향 프로그래밍의 기본적인 user defined data type입니다. 객체를 구현하기 위한 설계도입니다.
  • Instance 인스턴스는 클래스를 통하여 소프트웨어로 구현 된 객체를 의미합니다. 클래스를 통해 소프트웨어에 실체화 된 객체입니다.

객체지향의 특성

캡슐화

캡슐화의 특징입니다.

  • 완성도
    • 객체는 그 자체만으로도 어떠한 기능을 수행할 수 있으므로 완성도를 가진다고 할 수 있습니다.
    • 외부에 대한 의존성이 없어야 하며 의존성이 존재 하더라도 그 결합을 느슨하게 만들어야합니다.
  • 정보은닉
    • 접근지정자를 두어 불필요한 정보는 숨기고 중요한 정보만 표현합니다.
    • 객체의 정보를 밖에서 접근하지 못하게 합니다.
  • 접근 지정자의 종류
    접근 지정자접근 범위동일 클래스동일 패키지다른 패키지의 자식 클래스다른 패키지
    public제한 없음OOOO
    protected동일 패키지와 상속받은 클래스 내OOO
    default동일 패키지 내에서만OO
    private동일 클래스 내에서만O

상속

상속의 특징입니다.

상속은 새로운 클래스가 기존의 클래스의 속성과 행위를 이용할 수 있게 하는 기능입니다.

  • 부모 클래스 : 상위에 있으며 상속을 해주는 class이며 추상 객체라고 합니다.
  • 자식 클래스 : 하위에 있으며 상속을 받는 class이며 구체 객체라고도 합니다.

공통된 기능을 여러 객체에게 전달하고 싶을 때 사용하는 경우가 많습니다.

그러나 상속은 “추상화"와 “구체화"의 관계에서만 쓰여야합니다.

추상화

추상화란 자료형을 구체적으로 정의하는 것입니다.

객체간의 관계에서는 상위 클래스가 하위 클래스보다 추상적여야 한다는 특징이 있습니다.

자바에서는 추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제합니다.

abstract class

  • 추상 클래스는 추상 메소드가 하나 이상 포함 되거나 abstrat로 정의된 클래스입니다.
  • 추상 클래스의 목적은 추상 클래스를 상속 받아서 기능을 이용하고, 확장 시키는데 있습니다.

interface

  • 모든 메소드가 추상 메소드입니다. (자바 8부터는 일반 메소드의 구현도 가능합니다.)
  • 객체 자체가 추상적이며, 구현체가 없고 추상적으로 개념만 존재합니다.
  • 일반 변수를 가질 수 없으며 생성자를 가질 수 없고 인스턴스를 만들 수 없습니다.
  • 함수의 구현을 강제함으로써 구현 객체의 같은 동작을 보장합니다.

다형성

다형성이란 하나의 객체가 다양한 타입을 가지고 있을 수 있음을 의미합니다.

자바에서는 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 합니다.

class Login { ... }

class PortalLogin extends Login { ... }
...
Login login = new Login(); // 허용
PortalLogin pLogin = new PortalLogin();   // 허용
Login login = new Login();  // 허용
PortalLogin pLogin = new Login();  // 오류 발생.

다형성을 통하여 객체 간의 관계를 조직적으로 나타낼 수 있습니다.

instanceof 연산자를 통하여 참조 변수가 실제로 참조하고 있는 인스턴스의 타입을 확인할 수 있습니다.


객체지향 설계

그렇다면 어떻게 해야 객체지향을 잘 할 수 있을까요?

일단 객체지향적 프로그래밍을 하기 위해서는 다음 두 가지를 고려해야합니다.

  1. 객체를 어떻게 구분 할 것인가
  2. 객체간의 연관관계를 어떻게 설정할 것 인가

이러한 두 가지를 고려하고 객체지향을 다른 사람에게 잘 설명하기 위해서는 설계가 필요합니다.

UML

UML은 객체지향 프로그래밍 설계를 표현하기 위한 언어입니다.

  • Usecase Diagram
  • Sequence Diagram
  • Package Diagram
  • Class Diagram UML 클래스 다이어그램으로 주로 객체간의 관계를 표시합니다. Class의 박스는 이름 : 변수(속성) : 메서드(행위) 3가지로 구분 되며, 객체간의 관계는 화살표와 n : n의 관계로 표시됩니다. UML Class Diagram draw.io staruml.io 위와 같은 사이트에서 직접 클래스 다이어그램을 그려볼 수도 있습니다.

객체지향 SOLID 원칙

SOLID는 Robert Martin이 소개한 객체 지향 프로그래밍의 다섯 가지 기본 원칙입니다.

  1. Single responsibility principle(단일책임의 원칙)

    한 클래스는 하나의 책임만을 가져야한다.

  2. Open / closed principle

    소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.

  3. Liskov substitution principle

    객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

  4. Interface segregation principle

    특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

  5. Dependency inversion principle

    프로그래머는 “추상화에 의존해야하며 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나이다.

이러한 원칙을 따르며 지키며 설계하는 것이 객체지향 프로그래밍을 잘 할 수 있는 기초가 될 것입니다.

profile
always positive

0개의 댓글