1.2 프로그래밍 패러다임

·2023년 10월 19일
0

CS

목록 보기
2/23

Programming Paradigm : 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론

  • 간단하게 프로그래밍 스타일을 의미. 전체적인 프로그래밍 방식을 말함
  • 프로그램은 순차, 분기, 반복, 참조로 구성되며 프로그램 개발을 위해 전략을 수립해야함
  • 위에서 말한 전략은 어떤 언어를 사용하고 어떤 것을 지양하고 지향할지 등등 다양한 방법을 수립한다. 여기서 전략에 해당되는 내용들이 프로그래밍 패러다임.
  • 프로그래밍 패러다임 분류
    • 선언형
      • 함수형
    • 명령형
      • 객체지향
      • 절차지향

선언형 프로그래밍

  • declarative programming
  • 무엇을 어떻게 해결해야 하는지에 집중
  • "프로그램은 함수로 이루어진 것이다." 라는 명제가 담겨 있음
  • 대표적으로 함수형 프로그래밍이 있음

함수형 프로그래밍

  • 최소 단위가 함수.
  • 순수 함수들을 블록처럼 쌓아 로직을 구현하고 고차 함수를 통해 재사용성을 높인 프로그래밍 패러다임

순수 함수

  • 출력이 입력에만 의존하는 함수
def sum(a,b):
	return a+b
  • 위와 같이 다른 전역변수의 영향 없이, 매개변수에만 영향을 받음

고차 함수

  • 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것
  • 고차 함수를 쓰기 위해선 해당 언어가 일급 객체라는 특징을 가져야 한다.

일급 객체

  • 변수나 메서드에 함수를 할당 가능
  • 함수 안에 함수를 매개변수로 담기 가능
  • 함수가 함수 반환 가능

명령형 프로그래밍

객체지향 프로그래밍

  • Object-Oriented Programming, OOP
  • 최소 단위가 객체
  • 객체들의 집합으로 프로그램의 상호 작용 표현
  • 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식
  • 장점 : 직관적. 유지보수 쉬움
  • 단점 : 설계에 많은 시간 소요. 처리 속도 상대적으로 느림

객체지향 프로그래밍 특징 4가지

  • 추상화(abstraction)
    • 클래스들의 공통적인 특성(변수, 메서드)들을 묶어 표현

  • 캡슐화(encapsulation)
    • 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것.
    • 캡슐화 방법
      • 접근 제어자 사용(private)
      • getter, setter 등 메서드를 통해서만 간접적으로 접근 허용

  • 상속성(inheritance)
    • 상위 클래스의 특성을 하위 클래스가 이어받아 재사용하거나 추가, 확장하는 것
    • 코드 재사용성, 계층적 관계 생성, 유지 보수성 측면에서 중요

  • 다형성(polymorphism)
    • 하나의 메서드나 클래스가 다양한 방법으로 동작하는 것
    • 오버로딩, 오버라이딩

오버로딩과 오버라이딩

  • 오버로딩(overloading)
    • 같은 이름을 가진 메서드를 여러 개 두는 것
    • 메서드 타입, 매개변수 유형, 개수 등으로 여러 개 두기 가능
    • 컴파일 중에 발생하는 정적 다형성
    class Person{ 
    	public void eat(String a) { 
    		System.out.println("I eat " + a); 
    	public void eat(String a, String b) { 
    		System.out.println("I eat " + a + " and " + b); 
    	}
    public class CalculateArea{ 
    	public static void main(String[] args) { 
    		Person a = new Person(); 
    		a.eat ("apple"); 
    		a.eat("tomato", "phodo"); 
    /*
    I eat apple 
    I eat tomato and phodo 
    */ 
    • 매개변수의 개수에 따라 다른 함수가 호출됨 !!

  • 오버라이딩(overriding)
    • 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의
    • 런타임 중에 발생하는 동적 다형성
    class Animal{
    	public void bark() { 
    		System.out.println("mumu! mumu!");
        }
    }
    class Dog extends Animal { 
    	@Override 
    	public void bark() { 
    		System.out.println("wal!!! wal!! !"); 
        }
    }
    public class Main{
    	public static void main(String[] args) { 
    		Dog d = new Dog(); 
    		d.bark(); 
        }
    }
    /*
    wal!!! wal!!!
    */
    • 자식 클래스 기반으로 메서드가 재정의돼서 wal!!! wal!!!이 출력

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

  • 단일 책임 원칙(SRP, Single Responsibility Principle)
    • 한 클래스는 하나의 책임만 져야 한다.

  • 개방-폐쇄 원칙(OCP, Open Closed Principle)
    • 확장에는 열려있고 변경에는 닫혀 있어야 한다.

  • 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
    • 상위 타입 객체를 프로그램의 정확성을 깨트리지 않으면서 하위 타입의 객체로 바꿀 수 있어야 한다.
    • ex) 포유류 객체가 강아지 객체의 상위 클래스일 때, 포유류 객체와 강아지 객체가 바뀌어도 상관이 없어야 함

  • 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
    • 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙
    • 하나의 일반적인 인터페이스보다 구체적인 여러 인터페이스를 만들어야 함
    • 클라이언트별로 세분화된 인터페이스를 만들고 클라이언트는 사용하지 않는 메서드를 구현하지 않도록 주의

  • 의존성 역전 원칙 (DIP, Dependency Inversion Principle)
    • 상위 모듈은 하위 모듈의 구현에 의존해선x.
    • 구체적인 것은 추상화에 의존해야 한다.
    • 구체화에 의존x. 추상화에 의존

절차형 프로그래밍

  • 로직이 수행되어야 할 연속전인 계산 과정으로 이루어짐
  • 일이 진행되는 방식으로 그저 코드를 구현하기만 하면 됨 -> 코드의 가독성이 좋고 실행 속도가 빨라 계산이 많은 작업 등에 쓰임
  • 하지만 모듈화하기 어렵고 유지 보수성이 떨어짐

패러다임의 혼합

  • 그래서 어떠한 패러다임이 가장 좋음?
    -> 그런거 없다.
  • 비즈니스 로직이나 서비스 특징을 고려해서 패러다임을 정하자.
  • 하나의 패러다임 기반으로 해도 되지만, 여러 패러다임 조합해서 상황과 맥락에 따라 패러다임 간의 장점만 취해 개발하는 게 좋다!

Reference

https://velog.io/@codenmh0822/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8C%A8%EB%9F%AC%EB%8B%A4%EC%9E%84
https://xangmin.tistory.com/152

0개의 댓글