JPA (Java Persistence API)

JPA(Java Persistence API)란, 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스의 모음
  • JPA는 애플리케이션과 JDBC 사이에서 동작한다. JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
  • 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체지향 개발이 가능하다.
  • 객체를 통해 쿼리를 작성할 수 있는 JPQL (Java Persistence Query Language)를 지원한다.
  • DBMS에 대한 종속성이 줄어든다. DBMS가 변경된다 하더라도, 소스, 쿼리, 구현방법, 자료형 타입 등을 변경할 필요가 없기 때문에 프로그래머는 Object에만 집중하면 되고, DBMS를 교체하는 작업에도 비교적 적은 리스크와 시간이 소요된다.
  • 가장 대중적인 것은 Hibernate

 

cf) ORM (Object-Relational Mapping)

ORM(Object-Relational Mapping)이란, 객체와 관계형 데이터베이스를 매핑하는 것.
  • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고 ORM이 연결한다.
  • SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.

 

JPA 사용 이유

  • 생산성
    • JPA를 자바 컬렉션에 객체를 저장하듯 JPA에게 저장할 객체를 전달한다.
    • 간단하게 CRUD를 작성할 수 있다.
    • DDL문을 자동으로 생성해주기 때문에 데이터베이스 설계 정심을 객체 설계 중심으로 변경할 수 있다.
  • 유지보수
    • 기존에는 필드 변경 시 모든 SQL을 수정해야 한다.
    • 개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해주기 때문에 유지보수 해야 하는 코드 수가 줄어든다.
  • 패러다임의 불일치
    • 연관된 객체를 사용하는 시점에 SQL을 전달할 수 있다.
    • 같은 트랜잭션 내에서 조회할 때 동일성을 보장한다.
    • 상속, 연관관계, 객체 그래프 탐색, 비교하기 등과 같은 패러다임 불일치를 해결한다.
  • 성능
    • 어플리케이션과 데이터베이스 사이의 성능 최적화 기능을 제공한다.
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환하기 때문에 데이터 베이스와의 통신 횟수를 줄일 수 있다.
    • 트랜잭션을 commit 하기 전까지 메모리에 쌓고 한 번에 SQL을 전송한다.
  • 데이터 접근 추상화와 벤더 독립성
    • 데이터베이스 기술에 종속되지 않도록 한다.
    • 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주면 간단하게 변경이 가능하다.

 

'프로그래밍 > JAVA' 카테고리의 다른 글

Spring Boot (vs Spring)  (0) 2022.02.21
AOP란,  (0) 2022.02.21
Spring Framework란,  (0) 2022.02.20
함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07

Spring

Spring Framework란, 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크.

스프링은 앞의 글을 참고하면 좋습니다!

 

Spring Boot

Spring Boot란, 스프링을 더 쉽게 이용하기 위한 도구.
  • Embed Tomcat을 사용하기 때문에, Tomcat과 같은 웹 서버를 설치하지 않아도 된다.
  • starter을 통한 dependency 자동화 기능이 있어, 스프링과 외부 라이브러리를 자동으로 구성한다.
  • XML 설정을 하지 않아도 된다.
  • jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다.
  • 개발자의 편의를 위해 개발된 도구

 

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

'프로그래밍 > JAVA' 카테고리의 다른 글

JPA란,  (0) 2022.02.22
AOP란,  (0) 2022.02.21
Spring Framework란,  (0) 2022.02.20
함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07

AOP (Aspect Oriented Programming)

AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍의 약자. 흩어진 Aspect를 모듈화할 수 있는 프로그래밍 기법. Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것.
  • OOP 한계를 극복시키기 위한 기법
  • 인프라/부가기능을 모듈화한다.
  • 기능을 비즈니스 로직과 공통 모듈로 구분하고, 개발자의 코드 밖에서 필요할 때 비즈니스 로직에 삽입하는 형식으로 실행된다.
  • 공통적인 기능을 종단간으로 삽입할 수 있게 한다.
  • Aspect 별로 처리한다.

 

cf) OOP (Object Oriented Programming)

OOP(Object Oriented Programming)는 객체 지향 프로그래밍의 약자. 모든 데이터를 현실에 빗대어 객체로 다루는 프로그래밍 기법.
  • 비즈니스 로직을 모듈화한다.
  • 객체를 상속/위임을 통해 재사용하여 반복되는 코드의 양을 줄여주지만, 없앨 수 없는 상황이 생기고 어플리케이션 전체에서 사용되는 부가기능들을 모듈화하기 어렵다.
  • 공통적인 기능을 각 객체의 횡단으로 입력한다.
  • 객체별로 처리한다.

 

AOP의 주요 개념

  • Aspect: 흩어진 공통부분을 모듈화하는 것
  • Target: Aspect를 적용하는 곳
  • Advice: 실질적으로 어떤 일을 해야할 지에 대한 구현체
  • JointPoint: Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut: Joint point 의 상세 스펙을 정의한 것

 

특징

  • 프록시 기반의 AOP 구현체
  • 스프링 빈에만 AOP 를 적용할 수 있다.
  • 동적 프록시 빈을 만들어 등록시켜준다.

'프로그래밍 > JAVA' 카테고리의 다른 글

JPA란,  (0) 2022.02.22
Spring Boot (vs Spring)  (0) 2022.02.21
Spring Framework란,  (0) 2022.02.20
함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07

Spring Framework

스프링 프레임워크 (Spring Framework)란, 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크. 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션

 

스프링 프레임워크의 특징

  • POJO(Plain Old Java Object) 방식: POJO는 평범한 자바 객체를 의미한다. Java EE의 EJB (Enterprise JavaBeans) 는 한가지 기능을 위해 불필요한 복잡한 로직이 과도하게 들어가는 단점이 있다. 이에 반발하여 나온 용어가 POJO이다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다는 특징이 있다. 하지만 여기에도 지켜야하는 것이 있는데, 객체지향 설계에 맞게 코드를 작성해야한다는 것이다.
  • 관점 지향 프로그래밍(Aspect Oriented Programming, AOP): 로깅, 트랜잭션, 보안 등 핵심적인 비즈니스 로직과 관련은 없으나, 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리하고, 실행 시에 서로 조합하여 사용할 수 있다. 이에 따라 효율적인 유지보수와 재활용성이 극대화된다. 기존에 널리 사용되고 있는 강력한 관점 지향 프로그래밍 프레임워크인 AspectJ도 내부적으로 사용할 수 있으며, 스프링 자체적으로 지원하는 실행시(Runtime)에 조합하는 방식도 지원한다.
  • 의존성 주입(Dependency Injection, DI): 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다. 클래스 A와 B가 있다고 할 때, A 클래스의 메소드 내에서 B 클래스의 객체를 생성하여 비즈니스 로직에 사용하면 A는 B에 '의존'하는 관계가 된다. 그리고 A, B 클래스가 아닌 외부에서 A 클래스의 메소드를 호출하고, 파라미터 값으로 B 클래스의 객체를 전달한다면 이것은 '주입'이 된다. 그렇다면 의존성 주입은? 이 두 상황을 합치면 된다. 파라미터 값으로 전달받은 B 객체를 A 클래스의 메소드 내에서 비즈니스 로직에 사용하는 것을 의미한다. 즉 A와 B의 '의존' 관계가 외부에서의 '주입'을 통해 이루어진 것이다.
  • 제어 역전(Inversion of Control, IoC): 제어의 흐름을 사용자가 컨트롤하지 않고 프레임워크(Spring)에게 맡기는 것이다. 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
  • 생명주기 관리: 스프링 프레임워크는 Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.
  • 데이터 엑세스 프레임워크: 데이터베이스에 접속하고 자료를 저장 및 읽어오기 위한 여러 가지 유명한 라이브러리, 즉 JDBC, iBATIS(MyBatis), 하이버네이트 등에 대한 지원 기능을 제공하여 데이터베이스 프로그래밍을 쉽게 사용할 수 있다.
  • 트랜잭션 관리 프레임워크: 추상화된 트랜잭션 관리를 지원하며 XML 설정파일 등을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원한다.
  • 모델-뷰-컨트롤러 패턴: DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
  • 배치 프레임워크: 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공한다. 주로 Quartz 기반으로 동작한다.

 

스프링 프레임워크의 구조

  • Core: Spring Container를 의미한다. 여기서 핵심적인 것은 Bean Factory Container로, 제어 역전(IoC)과 의존성 주입(DI) 기능을 제공하여 객체 구성부터 의존성 처리까지 모든 일을 처리하는 역할을 한다.
  • Context: context 정보들을 제공하는 설정 파일이다. JNDI, EJB, Validation, Scheduiling, Internaliztaion 등 엔터프라이즈 서비스들을 포함한다.
  • DAO: JDBC 추상 계층을 제공하여, 코딩이나 예외처리 하는 부분을 간편화 시켜 일관된 방법으로 코드를 짤 수 있게 도와준다. 데이터가 담겨있는 VO(Value Object) 클래스를 이용해 사용한다.
  • ORM: JPA, Hibernate와 같은 ORM이나 MyBatis 같은 데이터베이스 API 등과 통합할 수 있는 기능을 제공한다.
  • AOP: 스프링 프레임워크에서 제공하는 AOP 패키지를 제공한다.
  • Web: Spring Web MVC, Struts, WebWork 등 웹 어플리케이션 구현에 도움되는 기능을 제공한다.
  • MVC: Model2 구조로 application을 만들 수 있게 한다. 전략 인터페이스를 통해 고급 구성 가능하며 JSP, Velocity, Tiles, iText 및 POI를 포함한 수많은 뷰 기술을 지원하고 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

Spring Boot (vs Spring)  (0) 2022.02.21
AOP란,  (0) 2022.02.21
함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07
어노테이션  (0) 2022.01.16

함수형 프로그래밍

함수형 프로그래밍이란, 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나. 부수 효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임.
  • 부수 효과 : 객체의 상태를 변화 시키는 것 (파라미터 포함) 
  • 순수 함수 : 부수효과가 없는 함수. 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수, 외부의 상태를 변경하지 않는 함수. 데이터의 값을 변경하거나 객체의 필드값을 설정하는 등의 작업을 하지 않는 함수
  • 모듈화 : 기능을 분할하고 추상화하여 소프트웨어의 성능을 향상시키고 유지보수를 효과적으로 하기 위한 구현 기법

 

함수형 프로그래밍을 배우는 이유

  • 기존 절차적 프로그래밍과 객체 지향형 프로그래밍과는 다른 새로운 방식으로 사고하는 방법을 배우는 것
  • 함수형 프로그래밍은 사고의 전환을 필요로 하여, 이를 통해 다양한 사고방식으로 프로그래밍을 바라봄으로써 유연한 문제해결이 가능

 

함수형 프로그래밍의 특징

  • 순수함수
    • 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
    • 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
    • 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
    • 프로그램의 변화 없이 입력 값에 대한 결과를 알 수 있어 테스트 용이
  • 비상태, 불변성
    • 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업 진행
  • 선언형 함수
    • 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언헌 프로그래밍은 무엇을 할 것인가에 주목
    • for, while과 같은 반복문을 사용하지 않고, map, filter 같은 함수를 매개변수로 받는 메서드 이용
  • 1급 객체
    • 변수나 데이터 구조안에 담을 수 있음
    • 파라미터로 전달 할 수 있음
    • 반환값(return value)으로 사용할 수 있음
    • 할당에 사용된 이름과 관계없이 고유한 구별 가능
    • 동적으로 프로퍼티 할당 가능
  • 고차함수
    • 함수를 인자로 받거나 함수를 반환 값으로 이용할 수 있는 것

 

함수형 프로그래밍을 OOP에서 사용하는 이유

  • 함수적 프로그램은 추상화 레벨이 높아, 코드의 동작을 추론하기 쉽다. 로직의 골격만 남아, 함수를 호출하는 코드를 함수 구현문으로 대체할 수 있기 때문에 개발자는 구현문을 통해 추론이 가능하다.
  • 반환되는 값 예측이 가능하다. 함수형 프로그래밍은 불변성으로 선언한 값을 복사해 변경하기 때문이다.
  • 전역 상태를 허용하지 않는다.
  • 멀티스레드에서 안전성을 지원하여, 스레드 간 객체를 안전하게 공유할 수 있다. 함수형 프로그래밍은 순수함수를 만들기 때문에 객체 전달 시 변이를 막을 수 있다.
  • 개발자는 멀티스레드 환경에서 공유자원에 대한 락, 동기화를 고려하며 코딩할 필요가 없다. 
  • 부수효과를 제거했기 때문에 재사용이 가능하며, 테스트하기 쉽다.
  • 멀티코어를 이용한 병렬 처리하는 것이 비용이나 속도면에서 더 유리하다.

 

함수형 프로그래밍 장점

  • 높은 수준의 추상화를 제공한다
  • 함수 단위의 코드 재사용이 수월하다
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다

 

함수형 프로그래밍 단점

 

  • 순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
  • 함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
  • 순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다

 

 

추가 공부 자료 : https://jongminfire.dev/함수형-프로그래밍이란

'프로그래밍 > JAVA' 카테고리의 다른 글

AOP란,  (0) 2022.02.21
Spring Framework란,  (0) 2022.02.20
JVM란,  (0) 2022.02.07
어노테이션  (0) 2022.01.16
객체 지향 프로그램이란,  (0) 2022.01.16

JVM (Java Virtual Machine)

    • 자바 바이트코드를 실행할 수 있는 가상머신 - 자바 컴파일러에 의해 자바 소스코드가 자바 바이트코드로 변환됨
    • 플랫폼 독립적으로, 자바 실행 코드를 변경하지 않고도 JVM이 실행 가능한 환경이라면 어디서든 Java 프로그램이 실행될 수 있도록 함 - Java의 모토인 Write once, Run anywhere는 JVM을 통해 가능한 것이다. 
    • 자바와 운영체제 사이에서 중개자 역할을 수행 - 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와주는 역할
    • Garbage Collector, Execution Engine, Class Loader, Runtime Data Area 이렇게 크게 네 가지 영역으로 나누어져 있다.
    • 성능은 원래 실제의 기계에서 직접 실행되는 것이 아니라 JVM의 해석 단계를 거쳐 실행되므로 네이티브 언어보다 느리지만, JIT 컴파일러 도입과 하드웨어 발전으로 인해 성능이 많이 향상 되었다

 

    •  

 

자바 프로그램 실행 과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다. 이 때, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. Java 언어로 프로그래밍된 코드를 Java 컴파일러(javac)가 가상 기계어 파일인 Java 클래스 파일로 만든다. 즉, 자바 소스코드(.java)를 Java 바이트 코드(.class)로 번역한다.
  3. Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
  4. 로딩된 class 파일들은 Execution engine을 통해 해석된다.
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실행된다.

   이 때, JVM은 필요에 따라 Thread Synchronization, GC 같은 관리 작업을 수행한다.

 

JVM 특징

  • 스택 기반의 가상 머신: 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다. 
  • 심볼릭 레퍼런스: 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다. 
  • 가비지 컬렉션(garbage collection): 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다. 
  • 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장: C/C++ 등의 전통적인 언어는 플랫폼에 따라 int 형의 크기가 변한다. JVM은 기본 자료형을 명확하게 정의하여 호환성을 유지하고 플랫폼 독립성을 보장한다. 
  • 네트워크 바이트 오더(network byte order): 자바 클래스 파일은 네트워크 바이트 오더를 사용한다. 인텔 x86 아키텍처가 사용하는 리틀 엔디안이나, RISC 계열 아키텍처가 주로 사용하는 빅 엔디안 사이에서 플랫폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하므로 네트워크 전송 시에 사용하는 바이트 오더인 네트워크 바이트 오더를 사용한다. 네트워크 바이트 오더는 빅 엔디안이다.

출처 : https://d2.naver.com/helloworld/1230

 

'프로그래밍 > JAVA' 카테고리의 다른 글

Spring Framework란,  (0) 2022.02.20
함수형 프로그래밍이란,  (0) 2022.02.15
어노테이션  (0) 2022.01.16
객체 지향 프로그램이란,  (0) 2022.01.16
Overloading vs Override  (0) 2022.01.16

어노테이션 (Annotation)은 메타데이터(metadata)라고 볼 수 있다.

메타데이터 (metadata)란, 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보.

어노테이션은 3가지 용도로 사용된다.

1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공

   - 대표적인 예 : @Override (메소드 선언 시, 메소드가 오버라이드된 것임을 컴파일러에게 알려주어 컴파일러가 오버라이드 검사를 해줌. 오버라이드가 되지 않았다면 컴파일러는 에러 발생)

2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공

   - 빌드 시 자동으로 XML 설정 파일을 생성하거나, 배포를 위해 JAR 압축 파일을 생성하는데에도 사용됨

3. 실행 시 (런타임 시) 특정 기능을 실행하도록 정보 제공

   - 실행 시 클래스의 역할 정의

 

어노테이션 적용 대상 (java.lang.annotation.ElementType)

ElementType 열거 상수 적용 대상
TYPE 클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

 

어노테이션 유지 정책 (java.lang.annotation.RetentionPolicy)

RetentionPolicy 열거 상수 설명
SOURCE 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
CLASS 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다.
RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 없다.

 

'프로그래밍 > JAVA' 카테고리의 다른 글

함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07
객체 지향 프로그램이란,  (0) 2022.01.16
Overloading vs Override  (0) 2022.01.16
JAVA란,  (0) 2022.01.10

객체 지향 프로그램

객체지향이란, 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체(Object)로 만들어, 기계쩍인 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때에도 객체들을 조립해서 작성할 수 있는 기법.
  • 객체지향 기법은 구조적 기법의 문제점으로 인한 소프트웨어 위기의 해결책으로 채택되어 사용되고 있다.
  • 복잡한 구조를 단계적, 계층정으로 표현하고, 멀티미디어 데이터 및 병렬 처리를 지원한다.
  • 현실 세계를 모형화하므로 사용자와 개발자가 쉽게 이해할 수 있다.

 

객체 지향 프로그램의 장점

  • 소프트웨어의 재사용 및 확장이 용이하다.
  • 리팩토링 (유지보수)에 용이하다.
  • 디버깅이 쉽다. - 객체 단위로 코드가 나뉘어 작성되기 때문
  • 업무 분담이 용이하다. - 클래스 단위로 모듈화 시켜서 개발할 수 있기 때문

 

객체 지향 프로그램의 단점

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

 

객체지향의 주요 구성 요소와 개념

1. 객체 (Entity)

객체란, 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것.
  • 객체는 속성과 동작으로 구성되어 있는데, 속성은 필드(field), 동작은 메소드(method)라고 부른다.
  • 속성(Attribute) = 필드(Field) = 데이터 = 상태 = 변수 = 상수 = 자료 구조 : 객체가 가지고 있는 정보로 속성이나 상태, 분류 등을 나타낸다.
  • 동작(Operation) = 메소드(Method) = 서비스(Service) = 연산 : 객체가 수행하는 기능으로 객체가 갖는 데이터(속성, 상태)를 처리하는 알고리즘이다.
  • 객체는 독립적으로 식별 가능한 이름을 가지고 있다.
  • 객체가 가질 수 있는 조건을 상태(State)라고 하는데, 일반적으로 상태는 시간에 따라 변한다.
  • 객체와 객체는 상호 연관성에 의한 관계가 형성된다.
  • 객체가 반응할 수 있는 메시지(Message)의 집합을 행위라고 하며, 객체는 행위의 특징을 나타낼 수 있다.
  • 객체는 일정한 기억장소를 가지고 있다.
  • 객체의 메소드는 다른 객체로부터 메시지를 받았을 때 정해진 기능을 수행한다.
객체 모델링 (Object Modeling)이란, 현실 세계의 객체를 소프트웨어 객체로 설계하는 것. 현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정.

2. 클래스 (Class)

클래스란, 공통된 속성과 연산(행위)를 갖는 객체의 집합. 객체의 일반적인 타입(Type)을 의미.
  • 클래스는 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀이다.
  • 클래스는 객체지향 프로그램에서 데이터를 추상화하는 단위이다.
  • 클래스에 속한 각각의 객체를 인스턴스(Instance)라고 하며, 클래스로부터 새로운 객체를 생성하는 것을 인스턴스화(Instantiation)라고 한다.
  • 동일 클래스에 속한 각각의 객체(인스턴스)들은 공통된 속성과 행위를 가지고 있으면서, 그 속성에 대한 정보가 서로 달라서 동일 기능을 하는 여러 가지 객체를 나타내게 된다.
  • 최상위 클래스는 상위 클래스를 갖지 않는 클래스를 의미한다.
  • 슈퍼 클래스(Super Class)는 특정 클래스의 상위(부모) 클래스이고, 서브 클래스(Sub Class)는 특정 클래스의 하위(자식) 클래스를 의미한다.

3. 캡슐화 (Encapsulation)

캡슐화란, 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것. 외부 객체는 객체 내부의 구조를 알지 못하여 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음.
  • 필드와 메소드를 캡슐화하여 보호하면, 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 막을 수 있다.
  • 캡슐화된 객체는 인터페이스를 제외한 세부 내용이 은폐(정보 은닉)되어 외부에서의 접근이 제한적이기 때문에 외부 모듈의 변경으로 인한 파급 효과가 적다.
  • 캡슐화된 객체들은 재사용이 용이하다.
  • 객체들 간의 메시지를 주고받을 때 상대 객체의 세부 내용은 알 필요가 없으므로 인터페이스가 단순해지고, 객체 간의 결합도가 낮아진다.

4. 상속 (Inheritance)

상속이란, 부모 클래스의 멤버를 자식 클래스에게 물려주는 것.
  • 상속을 이용하면 하위 클래스는 상위 클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의하지 않고서도 즉시 자신의 속성으로 사용할 수 있다.
  • 하위 클래스는 상위 클래스로부터 상속받은 속성과 연산 외에 새로운 속성과 연산을 첨가하여 사용할 수 있다.
  • 소프트웨어의 재사용(Reuse) - 이미 잘 개발된 클래스를 재사용하기 때문에 코드의 중복을 줄여주고 효율적이고, 개발 시간을 절약시켜준다.
  • 다중 상속(Multiple Inheritance) : 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것이다.
  • 프로그램에서는 자식이 부모를 선택한다. 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 선택하여 extends 뒤에 부모 클래스를 기술한다.

5. 다형성

다형성이란, 하나의 객체가 여러 가지 타입을 가질 수 있는 것. 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때 하나의 메시지에 대해 각각의 객체(클래스)가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력.
  • 객체(클래스)들은 동일한 메소드명을 사용하며 같은 의미의 응답을 한다.
  • 응용 프로그램 상에서 하나의 함수나 연산자가 두 개 이상의 서로 다른 클래스의 인스턴스들을 같은 클래스에 속한 인스턴스처럼 수행할 수 있도록 하는 것이다.
class Parent {...}
class Child extends Parent {...}

Parent parent = new Parent() (o)
Child child = new Child() (o)
Parent p = new Child() (o)
Child c = new Parent() (x)

6. 연관성

연관성이란, 두 개 이상의 객체(클래스)들이 상호 참조하는 관계.
  • is member of (연관화, Association) : 2개 이상의 객체가 상화 관련되어 있음을 의미
  • is instance of (분류화, Classfication) : 동일한 형의 특성을 갖는 객체들을 모아 구성하는 것
  • is part of (집단화, Aggregation) : 관련 있는 객체들을 묶어 하나의 상위 객체를 구성하는 것
  • is a
    • (일반화, Generalization) : 공통적인 성질들로 추상화한 상위 객체를 구성하는 것
    • (특수화/상세화, Specialization) : 상위 객체를 구체화하여 하위 객체를 구성하는 것

 

객체지향 설계 원칙

  • SRP (Single Responsiblity Principle, 단일 책임 원칙) : 객체는 단 하나의 책임만 가져야 한다는 원칙. 응집도는 높고, 결합도는 낮게 설계하는 것을 의미한다. 변경사항이 있을 때 애플리케이션 파급 효과가 적으면 SRP 원칙을 잘 따랐다고 본다.
  • OCP (Open-Closed Principle, 개방-폐쇄 원칙) : 기존의 코드를 변경하지 않고 기능을 추가할 수 있도록 설계해야 한다는 원칙. 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원칙. 요구사항에 추가사항이나 변경사항이 있더라도 기존 구성요소는 변경이 일어나지 않아야 하며, 기존 구성요소를 확장하여 재사용 가능하도록 해야한다. 공통 인터페이스를 하나의 인터페이스로 묶어 캡슐화하는 방법이 태표적이다.
  • LSP (Liskov Substitution Principle, 리스코프 치환 원칙) : 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다는 설계 원칙. 자식 클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야한다. 똑같은 연산을 하지만 약간씩 다르다면 인터페이스 상속의 방법을 사용한다.
  • ISP (Interface Segregation Principle, 인터페이스 분리 원칙) : 자신이 사용하지 않는 인터페이스와 의존 관계를 맺거나 영향을 받지 않아야 한다는 원칙. 어떤 클래스가 다른 클래스에 종속될 때에는 최소한의 인터페이스만을 사용해야한다. 단일 책임 원칙이 객체가 갖는 하나의 책임이라면, 인터페이스 분리 원칙은 인터페이스가 갖는 하나의 책임이다.
  • DIP (Dependency Inversion Principle, 의존 역전 원칙) : 각 객체들 간의 의존 관계가 성립될 때, 추상성이 낮은 클래스보다 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙. 구현 클래스가 아니라 인터페이스에 의존하라는 의미이다. 일반적으로 인터페이스를 활용하면 이 원칙은 준수된다.

'프로그래밍 > JAVA' 카테고리의 다른 글

함수형 프로그래밍이란,  (0) 2022.02.15
JVM란,  (0) 2022.02.07
어노테이션  (0) 2022.01.16
Overloading vs Override  (0) 2022.01.16
JAVA란,  (0) 2022.01.10

+ Recent posts