[면접을 위한 CS 전공지식 노트] 프로그래밍 패러다임

Yijun Jeon·2024년 1월 4일
0

CS 전공지식

목록 보기
8/21
post-thumbnail

프로그래밍 패러다임

💡 프로그래밍 패러다임 (programming paradigm) 이란?

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

  • 프로그래밍 패러다임
    • 선언형
      • 함수형
    • 명령형
      • 객체 지향형
      • 절차 지향형

선언형과 함수형 프로그래밍

💡 선언형 프로그래밍 (declarative programming) 이란?

'무엇'을 풀어내는가에 집중하는 패러다임으로, "프로그램은 함수로 이루어진 것이다." 라는 명제 실현

💡 함수형 프로그래밍 (functional programming)은 선언형 패러다임의 일종

  • 작은 순수 함수 들을 블록처럼 쌓아 로직을 구현하고 고차 함수를 통해 재사용성을 높임
  • 자바스크립트는 단순하고 유연하며, 함수가 일급 객체이므로 함수형이 선호됨

순수 함수

👉 출력이 입력에만 의존하는 함수

const pure = (a,b) =>{
  return a+b
}

고차 함수

👉 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 함수
⭐️ 이때 해당 언어는 일급 객체라는 특징을 가져야 함

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

객체지향 프로그래밍

💡 객체지향 프로그래밍 (OOP, Object-Oriented Programming) 이란?

객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식

  • 설계 시간 많이 소요
  • 처리 속도 상대적으로 느림

⭐️ 객체지향 프로그래밍은 추상화, 캡슐화, 상속성, 다형성의 특징을 가진다

  1. 추상화(abstraction)
    복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것
  2. 캡슐화(encapsulation)
    객체의 속성과 메서드를 하나로 묶고, 일부를 외부에 감추어 은닉
  3. 상속성(inheritance)
    상위 클래스의 특성을 하위 클래스가 받아 재사용, 추가, 확장하는 것
    -> 코드의 재사용, 계층적 관계 생성, 유지 보수성
  4. 다형성(polymorphism)
    하나의 메서드나 클래스가 다양한 방법으로 동작하는 것
    -> 오버로딩, 오버라이딩

⭐️ 객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜야 한다

  1. 단일 책임 원칙(SRP)
    모든 클래스는 각각 하나의 책임만 가져야 한다
  2. 개방-폐쇄 원칙(OCP)
    유지 보수 사항이 생기면 코드를 쉽게 확장할 수 있도록, 수정할 때는 닫혀 있어야 한다
  3. 리스코프 치환 원칙(LSP)
    객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
  4. 인터페이스 분리 원칙(ISP)
    하나의 인터페이스 보다는 구체적인 여러 개의 인터페이스를 만들어야 한다
  5. 의존 역전 원칙(DIP)
    추상화된 인터페이스나 상위 클래스를 두어, 변하기 쉬운 것에 영향받지 않아야 한다.
    -> 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립되어야 함

오버로딩

💡 오버로딩 (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);
	}
}

오버라이딩

💡 오버라이딩 (overriding) 이란?

주로 메서드 오버라이딩을 말하며 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의 하는 것
👉 런타임 도중에 발생하는 '동적' 다형성

🔗 오버로딩 자바 예시

class Animal{
	public void bark(){
		System.out.println("짖는다!");
	}
}

class Dog extends Animal{
	@Override
	public void bark(){
		System.out.println("왈 왈!")
	}
}

절차형 프로그래밍

💡 절차형 프로그래밍 이란?

로직이 수행되어야 할 연속적인 계산 과정으로 이루어진 프로그래밍 패러다임

  • 코드의 가독성 좋음
  • 실행 속도 빠름 -> 계산이 많은 작업
    • ex) 포트란 활용 대기 과학 관련 연산, 머신 러닝 배치 작업
  • 모듈화하기 어려움
  • 유지 보수성 떨어짐

🔗 절차형 자바스트립트 예시

const ret = [1,2,3,4,5,11,12]
let a = 0
for(let i = 0; i < ret.length; i++){
  a = Math.max(ret[i],a)
}
console.log(a) // 12

0개의 댓글