객체지향의 이해

주8·2023년 1월 5일
0

객체지향 프로그래밍

객체지향 프로그래밍은 상속, 다형성, 추상화, 캡슐화 등 많은 개념을 제공하며 클래스 및 객체를 사용하여 프로그램을 설계하는 방법론이며 패러다임이다.

OOP는 다음과 같은 개념을 제공하여 개발 및 유지보수를 단순화한다.

  • Object(객체)
  • Class(클래스)
  • Inheritance(상속)
  • Polymorphism(다형성)
  • Abstraction(추상화)
  • Encapsulation(캡슐화)

이러한 개념 외에도 객체지향 설계에 사용되는 몇 가지 용어가 있다.

  • Coupling(결합력): 클래스와 클래스간의 의존성이 강한 결합(변경 → 연쇄반응) 대신 의존성을 줄이는 느슨한 결합이 좋다(Loose Coupling).
  • Cohesion(응집력): 객체 내에 존재하는 메서드, 데이터 등의 구성 요소들 사이의 밀접한 정도를 나타내며, 한 객체 안에 특정 목적을 위해 밀접하게 연관된 기능들이 구현되어 있다면 응집력이 높다고 하며, 좋은 설계는 높은 응집력과 느슨한 결합도를 갖도록 구성된 설계이다.
  • Association(연관관계): 연관된 객체와의 관계, 하나의 객체는 하나 또는 여러 객체와 연결될 수있다(1 to 1, 1 to Many, Many to 1, Many to Many)

OOAD(Object-Oriented Analysis and Design)

객체지향 설계를 위한 모델링 기법

  • 현실세계의 행동과 활동, 객체 그리고 행동, 습성을 모델링
  • 시스템내에 객체와 행동사이의 관계와 상호작용을 모델링

OOP 사용 목적

  • 코드의 재사용성(Reuse)을 극대화: 새로운 코드를 작성할 때 기존 코드를 이용해서 쉽고 빠르게 작성할 수 있다.
  • 특정 모듈의 기능 변경이 다른 모듈에 영향을 미치지 않는다.

객체지향의 요소

  • Class: 같은 종류의 집단에 속하는 속성(attribute)과 행위(behavior)에 대한 정의, 객체를 만들기 위한 설계도, 설명
  • Object: 클래스의 인스턴스(실제 메모리 할당, Runtime Entity), 자신의 고유의 데이터(attribute)를 갖고 행위(behavior)를 수행
  • Attribute, Method, Constructor(생성자), Package 등등

객체지향의 특징

상속(inheritance)

하나의 클래스와 상속관계를 통해 상위클래스의 필드(field)와 메서드(method) 획득하여 상위 클래스의 필드, 메서드 재사용


다형성(polymorphism)

상황에 따라 메서드의 성질을 변화시키는 것

상속 관계에서 동물(부모) → 고양이, 개, 코끼리(자식) 클래스 말하기() 메서드의 메서드 오버라이딩으로 각 객체의 특정에 맞게 구현되어 행동하게 하는 것


추상화(abstraction)

객체들이 가진 공통 특성을 파악하고 불필요한 특성을 제거하는 과정으로 단순화하여 세부정보를 숨기고 기능을 표시하는 것

예: TV 리모컨 → 내부처리를 모른다 (추상클래스와 인터페이스)


캡슐화(encapsulation)

하나의 문제해결을 위한 데이터와 메서드의 묶음. 내부 정의를 외부에 보이지 않도록 하기 위해 외부 접근을 차단한다.

외부 접근을 차단하여 데이터의 외부 간섭 및 오용으로부터 보호하는데 이를 정보 은닉(information hiding)이라고 한다.

목적은 높은 응집력(High Cohesion)과 약한 결합(Weak Coupling)이다.

OOP는 개발 및 유지 관리를 쉽게 해주는 반면 절차 지향 프로그래밍 언어에서는 프로젝트 크기가 증가함에 따라 코드가 커지면 관리하기가 쉽지 않다.

OOP는 데이터 숨김을 제공하는 반면 프로시저 지향 프로그래밍 언어에서는 전역 데이터에 어디서나 액세스 할 수 있다.

절차보다는 데이터에 중점을 두며, 프로그램을 객체로 나눈다.


객체 지향 설계의 5대 원칙(SOLID)

소프트웨어 구조 설계에 적용되는 객체 지향 접근 방식으로 이 다섯 가지 원칙은 객체 지향 프로그래밍의 세계를 변화시켰고 소프트웨어 작성 방식도 변화시켰다.


SRP(Single Responsibility Principle): 단일 책임 원칙

  • 모든 클래스는 각각 하나의 책임만 가지고 단일 기능을 수행해야 한다.
  • 단일 클래스에서 여러 기능을 구현하면 코드가 매시업되고 수정이 필요한 경우 전체 클래스에 영향을 미칠 수 있다.
  • 코드가 정확하고 코드를 쉽게 유지 관리할 수 있다.

OCP(Open Closed Principle): 개방-폐쇄 원칙

  • 기존의 코드를 변경하지 않으면서(closed), 기능을 추가할 수 있도록(open) 설계가 되어야 한다.
  • 확장을 통해 모듈에 새로운 기능을 구현할 수 있다.

LSP(Liscov Substitution Principle): 리스코프 치환 원칙

  • 자식 클래스는 언제나 부모 클래스를 대체하여 동작하는데 문제가 없어야 한다(다형성 원리).
  • 자바 컬렉션 프레임워크(JFC)가 대표적으로 잘 적용한 예이다.

ISP(Interface Segregation Principle): 인터페이스 분리 원칙

  • 한 클래스는 자신이 사용하지 않는 인터페이스를 구현하지 말아야 한다.
  • 하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스로 분할하는게 맞다.

DIP(Dependency Inversion Principle): 의존성 역전 원칙
의존 관계를 구체적인 구현 클래스 대신 추상화된 추상클래스나 인터페이스에 의존해야 하며, 고수준 모듈에서 저수준 모듈에 의존해서는 안 된다.

SOLID 원칙 사용 이유

  • 다른 코드 블록에 영향을 주지 않고 코드 블록을 변경할 수 있도록 종속성을 줄일 수 있다.
  • 디자인을 더 쉽고 이해하기 쉽게 만들기 위한 원칙이다.
  • 이 원칙을 사용하면 시스템을 유지관리, 테스트, 확장 및 재사용할 수 있다.
  • 소프트웨어의 bad design을 피할 수 있다.

클래스

클래스로 모델링한 객체를 정의한다.
객체는 클래스의 인스턴스(하나의 예)다.

  • CLASS (클래스): DOG
  • OBJECT (객체): NAME
  • ATTRIBUTE (속성):
    • HEIGHT
    • WEIGHT
    • FOOD
  • METHODS (메서드):
    • RUN
    • PLAY
    • EAT

클래스 구성요소

  • 필드(변수, 상수)
  • 메서드(Method)
  • 생성자(Constructor)
  • 초기화 블록(생성자 호출 전 필드 초기화)
  • 내부 클래스
public class Account{
	static String bankName; //클래스 변수
	long accountNO; //인스턴스 변수
	String customerName; //인스턴스 변수

	//생성자
	Account(){
		System.out.println("생성자 실행");
	}
	//초기화 블럭
	{
		System.out.println("블록입니다");
	}
	//메서드
	void printInfo(){
		System.out.println("계좌 클래스");
	}
}

Modifier (제어자)

클래스, 변수, 메서드의 선언부에 사용되며 부가적인 의미를 부여한다.

접근 제어자와 그 외 제어자로 나뉘며, 하나의 대상에 여러 개의 제어를 조합해서 사용할 수 있으나 접근 제어자는 단 하나만 사용할 수 있다.

  • 접근 제어자: public, protected, default, private
  • 그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp

Access modifier (접근 제어자)

접근 범위는 public > protected >default > private 순


접근 제어자 유형

  • public: 제한 없이 접근할 수 있다.
  • protected: 같은 패키지 내 또는 상속 관계 범위에서 접근할 수 있다.
  • default: 접근 제어자 지정을 안 할 경우 default 접근 제어자다. 동일 패키지 내에서만 접근할 수 있다.
  • private: 지정되면 클래스 내에서만 접근할 수 있으며, 생성자를 private으로 지정하면 상속이 불가하다.

구분같은 클래스같은 패키지상속받은 클래스관계없는 클래스
publicoooo
protectedooox
defaultooxx
packageooxx
privateoxxx
profile
웹퍼블리셔의 백엔드 개발자 도전기

0개의 댓글