절차지향 언어 (Procedural Programming)
어떤 기능을 어떤 순서로 처리할 것인가?
데이터 중심. 순차적. 빠른 실행속도. C언어
절차지향 언어는 절차지향 프로그래밍에 쓰이는 언어이다.
개체를 순차적으로 처리하여 프로그램 전체가 유기적으로 연결되어 있다.
그렇기 때문에 서로 분리되어서도 안되고 순서에 따라 진행되어야 한다.
프로그램의 순서와 흐름을 먼저 세운 뒤 필요한 자료구조와 함수들을 설계하는 방식이다.
특징
1) Top-Down
하나의 큰 기능을 처리하기 위해 작은 단위의 기능들로 나누어 처리한다.
2) 데이터와 함수를 별개로 취급
특정 기능을 수행할 때, 메서드를 직접 호출해야 한다. (객체가 메서드를 가지고 있는 객체지향 언어와 다름)
3) 모든 함수는 데이터 공유가 가능
메서드를 호출하는 형식이기 때문에 데이터를 공유할 수 있다.
4) 순서를 지켜야 함
순서가 바뀌면 원하는 결과 도출이 어려울 수 있으므로 정해진 순서대로 입력해야 한다.
장점
1) 빠른 실행속도
컴퓨터의 처리구조와 유사하므로 실행 시 빠르다.
단점
1) 유지보수의 어려움
유기적으로 연결되어 있으므로, 하나를 수정하면 전체를 수정해야 하는 번거로움이 있다.
그렇기 때문에 프로그램이 커질수록 구조가 복잡해서 보수가 더욱 어려워진다.
2) 비효율적
실행순서가 정해져 있으므로, 코드 순서가 바뀌면 결과가 달라진다.
따라서 언어의 융통성이 부족해지며 생산 효율이 줄어든다.
활용
코드의 가독성이 좋고 실행속도가 빨라 계산이 많은 작업에 쓰인다.
ex) 포트란(fortran) - 대기 과학 관련 연산 작
객체지향 언어 (Object-oriented Language)
누가 어떤 일을 할 것인가?
기능 중심. 객체. 상속. 캡슐화. 추상화. SOLID. JAVA
객체란 넓은 의미로 실세계에 존재하거나 생각할 수 있는 것으로 구체적인 사물 또는 사람, 추상적인 개념 등 통틀어 말한다.
객체지향 언어란 프로그램을 다수의 객체로 만들고 이들끼리 상호작용 하는 것이다.
자바, c++, 파이썬 등이 이에 속한다.
자료구조와 이를 중심으로 한 모듈을 먼저 설계한 후 실행순서와 흐름을 짜는 방식이다.
특징
1) 캡슐화
하나의 캡슐처럼 만들어 외부에서 데이터와 코드를 알 수 없기 때문에 메서드로만 접근한다.
2) 상속
상위 클래스의 모든 것을 하위 클래스에게 물려준다.
3) 다형성
하나의 객체가 다른 여러 객체로 재구성된다. ex) JAVA의 오버로드, 오버라이드
*** 오버라이딩(Overriding): 상속받은 자식 클래스에서 부모 클래스의 메서드와 같은 이름을 사용하고 매개변수와 리턴 타입도 같은 상태에서 기능을 재정의하는 것을 말한다.
*** 오버로딩(Overloading): 같은 이름의 함수를 매개변수를 다르게 하여 기능을 재정의하는 것을 말한다.
4) 추상화
실존하는 객체의 여러 특성 중, 프로그램을 만드는데 필요한 부분만 추출하고 필요하지 않은 것을 제거한다.
5) Bottom-Up
세부 모델부터 설계하고 조립한다.
장점
1) 재사용성
상속이 가능하기 때문에 재사용하여 효율을 높인다.
2) 생산성 증가
독립된 객체로 이루어져 있기 때문에 수정해야 할 코드만 수정할 수 있다. 따라서 유지보수에 용이하다.
단점
1) 느린 개발 속도
모든 객체의 역할과 기능을 이해해야 하기 때문에 프로그래밍에 시간이 소요된다.
2) 느린 실행 속도
메서드로만 접근하는 특징을 가진 캡슐화와 격리구조 때문에 절차지향 언어보다 느리다.
3) 높은 난이도
대체로 난이도가 높은데, 특히 다중상속이 지원되는 c++은 더욱 어렵다.
객체지향 설계 5원칙 (SOLID)
1) 단일 책임 원칙 (Single responsibility principle)
한 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 말한다.
2) 개방-폐쇄 원칙 (Open/closed principle)
소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해 열려 있어야 하고, 변경에 대해서는 닫혀 있어야 한다.
3) 리스코프 치환 원칙 (Liskov substitution principle)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
4) 인터페이스 분리 원칙 (Interface segregation principle)
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
큰 덩어리의 인터페이스를 구체적이고 작은 단위로 분리함으로써 클라이언트들이 꼭 필요한 메서드만 이용할 수 있게 한다.
5) 의존관계 역전 원칙 (Dependency inversion principle)
첫째, 상위 모듈은 하위 모듈에 의존해서는 안 된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다.
둘째, 추상화는 세부 사항에 의존해서는 안 된다. 세부 사항이 추상화에 의존해야 한다.
출처
면접을 위한 CS 전공지식 노트 | 주홍철 저
https://mangkyu.tistory.com/88
'CS공부' 카테고리의 다른 글
API (애플리케이션 프로그래밍 인터페이스) 란? (0) | 2023.07.07 |
---|---|
RESTful API 란? (0) | 2023.07.05 |
MVC 패턴이란 (Model-View-Controller) (0) | 2023.06.29 |
[JAVA] Enum(열거형) 개념과 예제 (0) | 2023.06.27 |
[JAVA] 싱글톤 패턴 (Singleton Pattern) 개념과 예제 (0) | 2023.06.26 |