2023. 1. 26. 14:21ㆍJAVA언어
절차적/구조적 프로그래밍
절차적 프로그래밍
물이 아래로 흐르는 것처럼 프로그램의 순차적인 처리를 중요시하며, 프로그램 전체가 유기적으로 연결되도록 개발하는
것을 뜻합니다.
- 컴퓨터의 작업 처리 방식과 유사히기 때문에 처리 속도가 빨라 시간적으로 유리합니다.
- 프로그램의 기능을 중심으로 개발이 진행됩니다.
구조적 프로그래밍
- 함수를 사용해서 개발 하는 것
- 함수를 사용하면 중복 코드를 한 곳에 모아서 관리할 수 있기 때문에 이해하기 쉬운 코드를 작성할 수 있습니다.
객체지향
- 기존의 구조적 프로그래밍에서 가장 중요한 '함수'에서 소스코드를 논리적인 단위로 구분하고 분할하여 프로그래밍을 조금 더 편하게 만들어줬습니다.
- 이에 그치지 않고 나아가 '우리가 주변 사물들을 인지하는 것'처럼 프로그래밍 하기 위해 만들어 진 것이 객체지향입니다.
- 세상에 존재하는 것은 모두 사물 즉, 객체이다.
- 각각의 사물은 고유하다.
- 사물은 속성을 갖는다.
- 사물은 행동을 한다.
- 위처럼 사물을 덩어리로 한번에 크게 이해하기 보다는 분류하여 이해할 수 있도록 시도하였고 이를 프로그래밍에서 class 라는 표현 방법으로 만들어냈습니다.
- 책임과 권한을 가진 객체들이 서로 메시지를 주고 받으며 협력하여 필요한 기능을 수행할 수 있도록 프로그램을 개발하는 것을 객체지향 개발이라고 할 수 있습니다.
- 객체지향 개발은 복잡한 프로그램을 효과적으로 분해하고 구성할 수 있고, 쉽게 이해하며 효율적으로 다룰 수 있게 도와줍니다.
객체지향의 4대 특성
- 캡슐화 : 정보의 은닉
- 상속 : 재사용
- 추상화 : 모델링
- 다형성 : 사용의 편의
캡슐화
객체 내부의 세부적인 사항을 감추는 것을 '캡슐화'라고 부릅니다.
- 변경하기 쉬운 객체를 만들기 위해 사용됩니다.
- 캡슐화를 통하여 객체 내부의 접근을 제한함으로써 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 좀 더 유연한 객체 설계를 할 수 있습니다.
상속
상위 클래스의 특징을 하위 클래스가 물려받아 코드의 중복을 제거하고 코드 재사용성을 증가 시킵니다.
- 각각의 클래스들을 상속 관계로 묶음으로써 클래스 간의 체계화된 구조를 파악하기 쉬워집니다.
- 데이터와 메서드를 변경할 때 상위에 있는 것만 수정하여 전체적으로 일관성을 유지시킬 수 있습니다.
추상화
객체에서 공통된 부분을 모아 상위 개념으로 새롭게 선언하는 것을 추상화라고 합니다.
- 공통적이고 중요한 것을 모아 모델링합니다.
- 복잡한 내부 구현에는 신경을 쓰지 않고 외부에 노출되어 있는 인터페이스만을 사용하여 코드를 작성할 수 있습니다.
- 추상화 => 추상 클래스 => 인터페이스 순서로 모델링하여 다형성으로 확장될 수 있도록 설계합니다.
다형성
객체가 연산을 수행할 때 하나의 행위에 대해 각 객체가 가지고 있는 고유한 특성에 따라 다른 여러가지 형태로 재구성 되는 것을 의미합니다.
- 동일한 메서드의 이름을 사용하지만 클래스마다 다르게 구현됨을 예로 들 수 있습니다.
- 오버로딩, 오버라이딩을 생각하시면 좋습니다.
추가 용어 정리
의존성
객체들이 협력을 하는 과정에서 해당 객체들이 다른 객체를 의존하게 됨을 뜻합니다.
- 어떤 객체가 변경될 때 그 객체에 의존하고 있는 다른 객체도 함께 변경될 수 있음을 의미합니다.
결합도
의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 높은 의존성을 가지고 있는지를 뜻합니다.
- 객체 사이의 의존성이 높은 경우를 가리켜 결합도가 높다라고 표현합니다.
- 반대로 합리적인 수준으로 의존을 하는 경우에는 결합도가 낮다고 표현합니다.
- 결합도가 높으면 함께 변경될 확률도 높기 때문에 설계를 할 때는 객체 사이의 결합도를 합리적인 수준으로 낮춰 변경에 용이하게 설계하는 것이 좋습니다.
응집도
모듈에 포함되어 있는 내부 요소들이 각각 연관되어 있는 관계의 정도를 뜻합니다.
- 밀접하게 연관된 작업만 수행하고 연관성이 적은 다른 작업은 다른 객체에 위임하는 객체를 가리켜 응집도가 높다고 표현합니다.
- 객체 스스로가 자신의 데이터를 직접 처리하면 할수록 응집도를 높일 수 있습니다.
객체지향 설계의 5원칙
유지 보수와 확장이 쉬운 프로그램을 만들기 위한 객체지향 설계의 다섯가지 기본원칙을 뜻합니다.
- SPR(Single Responsibility Principle) : 단일 책임 원칙
- OCP(Open-Closed Principle) : 개방-폐쇄 원칙
- LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
- ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle) : 의존성 역적 원칙
단일 책임 원칙
- 하나의 객체는 단 하나의 책임을 가져야 한다'
단일 책임 원칙 위반 증상
- 기능 변경이 발생했을 때 연쇄적으로 코드를 수정해야합니다.
- 기능이 너무 복잡해서 재사용하기 어렵습니다.
- 메서드의 크기가 비대해집니다.
원칙 적용 방법
- 각 기능별로 클래스를 구현합니다.
- 해당 기능을 사용할 때 메서드가 적용된 클래스를 이용합니다.
개방-폐쇄 원칙
"소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다."
- 자신의 확장에는 열려 있고, 주벼의 변화에는 닫혀 있어야 한다.
Java의 Database 연결
- Java에는 데이터베이스에 접속할 수 있도록 도와주는 JDBC라는 API가 존재합니다.
- 이 JDBC를 개방-폐쇄 원칙의 예로 들 수 있습니다.
- 개발을 할 때 우리는 Oracle, MySQL 등 다양한 데이터베이스를 사용하게 됩니다.
- 이때 만약 개발이 진행되는 과정에서 데이터베이스를 변경하게 된다고 하더라도 우리가 그동안 개발하던 코드를 전부 수정할 필요는 없습니다.
- 연결할 때 필요한 ID, PWD, URL 등의 설정을 담당하는 부분만 변경하면 쉽게 데이터베이스를 변경할 수 있습니다.
개방-폐쇄 원칙 위반 증상
- 기능 확장을 할 때마다 기존 코드를 수정해야 합니다.
- if else 블록이 자주 등장합니다.
- 기능 확장을 위한 코드 수정을 할 때 여러 클래스에서 다발적으로 진행이 됩니다.
원칙 적용 방법
- 변화되는 부분을 추상화해서 변화를 고정 시킵니다.
- 기능이 추가될 때 클래스의 상속을 통해서 하위 클래스에서 기능을 구현하도록 합니다.
- 기존코드를 수정하지 않아도 객체 상속의 다형성 원리에 의해 기능이 확장되도록 합니다.
- 연산 클래스는 추상화된 부모 클래스를 상속받아 기능별로 구현합니다.
AbstractOperation : 추상클래스
- operate : 추상 메서드
리스코프 치환 원칙
"서브 타입은 언제나 자신의 기반 타입(base type)으로 교체할 수 있어야 한다."
- 하위 클래스의 인스턴스는 상위형 객체 참조변수에 대입해 상위 클래스의 인스턴스 역할을 하는데 문제가 없어야 한다.
원칙 위반 증상
- 객체의 타입을 확인합니다.(instanceof)
- 자식 클래스명이 연관되거나 의존성이 있는 클래스에서 자주 발생합니다.
원칙 적용 방법
- 부모와 자식 클래스 사이의 행위가 일관성 있도록 추상화를 좀 더 정교하게 구현합니다.
- 연산 기능을 추상화한 부모 클래스에 피연산자 값의 유효성 검사를 진행하는 메서드를 추가해 줍니다.
- 계산기 클래스에서는 이 메서드를 사용하여 유효성 검사를 진행하고 이 유효성 검사가 필요한 자식 클래스에서는 이 추가된 유효성 검사 조건을 구체화합니다.
인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
- 클라이언트가 필요하지 않는 기능을 가진 인터페이스에 의존해서는 안되고 최대한 인터페이스를 작게 유지해야 한다.
원칙 위반 증상
- 필요하지 않은 기능을 강제로 구현해야하는 상황이 발생합니다.
- 필요하지 않은 혹은 사용 못 하는 기능이 강제로 구현되어 사용하지 못하도록 예외처리를 해야하는 상황이 발생할 수 있습니다.
원칙 적용 방법
- 필요하지 않은 기능을 강제로 구현하지 않도록 인터페이스를 분리합니다.
- 연산 결과를 보여주는 방법마다 인터페이스를 구현합니다.
DisplayResult : 인터페이스, 연산결과만 출력
- displayResult : 추상 메서드
DisplayWithOperator : 인터페이스, 연산과정 포함 출력
- displayResultWithOperator : 추상 메서드
의존성 역전 원칙
"고차원 모듈은 저차원 모듈에 의존하면 안 된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다."
"추상화된 것은 구체적인 것에 의존하면 안 된다. 구체적인 것이 추상화된 것에 의존해야 한다."
"자주 변경되는 구체(Concrete)클래스에 의존하지마라"
- 세부적인 사항은 추상화에 의존해야 합니다.
원칙 위반 증상
- 저수준 모듈에서 변경이 발생되면 고수준 모듈에서 수정사항이 발생합니다.
원칙 적용 방법
- 고수준 모듈의 변화되는 부분을 추상화합니다.
- 저수준 모듈을 추상화에 의존시킵니다.
- 계산기 클래스에 추상화된 부모 클래스를 포함시킵니다.
- 연산 클래스는 추상화된 부모 클래스를 상속받아 기능별로 구현합니다.
AbstractOperation : 추상 클래스
- operate : 추상 메서드
'JAVA언어' 카테고리의 다른 글
코딩 테스트 연습하면서 익힌 것들 (0) | 2023.01.29 |
---|---|
학습 방법에 대한 고민 (0) | 2023.01.28 |
복습 (1) | 2023.01.26 |
JAVA_#4_1 (0) | 2023.01.25 |
자습 (0) | 2023.01.24 |