java 객체지향의 특징은 무엇일까요?
절차지향과 비교했을 때, 객체지향의 효과는 무엇일지 궁금합니다.
그리고 앞으로의 개발 트랜드는 어떻게 될지 궁금합니다.
C언어는 더이상 사용하지 않게 될까요?
앞으로의 트랜드도 함께 알고 싶어요
각기 장단점이 있습니다.
일반적으로 많이 쓰는 언어가 C, 자바, 파이썬이 있습니다. 차이점은 C는 절차지향적언어이고 파이썬, 자바는 객체지향적언어라고 합니다. 절차지향적이라는 것은 코딩한 순서대로 실행이 된다고 보시면 되고, 객체지향적이라는 것은 객체(하나의모듈)라는 것을 만들어서 재사용함으로써 여러 군데서 호출해서 쓸수 있다고 보시면 됩니다. 그래서 C 같은 경우에 속도는 빠르지만 유지보수는 좀 불편한 점이 있고 반대로 파이썬이나 자바는 속도는 좀 느리지만 유지보수에 편한 장점이 있습니다.
1) 절차 지향과 객체 지향
절차지향 프로그래밍에서는 데이터와 그 연산들을 따로 분리해서 다루었어요. 프로그램 개발 시 객체라는 개념을 사용하지 않던 때에 나온 프로그래밍 방법론이라 굳이 연관 지어서 생각하지 않았다는 것이 옳은 표현일 듯싶어요. 예를 들어 컵이 떨어지는 모습을 GUI로 구현한 프로그램을 설계하고자 할 때 기존에는 컵 그림 데이터, 그림의 위치 데이터, 그림의 움직임 연산을 따로 설계해서 사용했어요.
int moveCup(int cupX, cupY, int cupPixel[], int moveX, int moveY) { // ... 컵 이동 알고리즘 구현 ... return 0; } int main() { // 컵 데이터 초기화 int cupX = 0; int cupY = 0; int cupPixel[] = {0,0,1,1,0}; // 컵 이동 moveCup(cupX, cupY, cupPixel, 1, 2); }절차지향 프로그래밍에서는 설계상 모든 코드들이 톱니바퀴처럼 맞물려 있기 때문에 코드의 일부분을 고치려면 설계의 전체적인 부분을 바꾸어야 하는 경우가 생겨요. 이러한 문제점은 복잡한 대형 시스템에서 더욱 크게 나타났으며 이는 때때로 시스템의 신뢰성을 낮추는 결과를 가져왔죠.
따라서 개발자들은 시스템의 신뢰성과 변화에 대한 유연성을 높이고 부수적으로 개발 속도도 빠르게 하기 위해 프로그램의 재사용성을 고려하기 시작했고 그래서 나온 개발 방법론 중 하나가 객체 지향 프로그래밍(OOP : Object-Oriented Programming) 이에요.
OOP 에서는 데이터와 연산을 같이 묶어서 객체라는 개념을 사용하는데 객체들 간의 상호작용으로 프로그램을 짜며 각각의 객체들이 고수준으로 잘 추상화 되어있을 경우 가독성과 재사용성을 높일 수 있다는 게 장점이에요. 즉, 객체지향 프로그래밍의 근본은 객체에 대해서 이해하고 상황에 맞는 추상화를 했으며 각각의 객체들이 잘 상호작용하도록 설계하는 것이고 이를 위해서 SOLID, 추상화 기법, 객체의 상호작용 등 객체지향을 위한 여러 방법들이 사용되는 거죠.
예를 들어 OOP 에서는 '컵' 이라는 객체를 만들고 그 안에 컵의 속성인 그림과 위치가 들어간 데이터 공간과 컵의 위치 데이터를 변경시키는 연산, 컵의 움직임에 대한 알고리즘을 구현한 연산들을 설계해요. 그리고 컵 객체 한 개를 만들어서 그 객체에 움직임 연산을 요청하게 되면 컵의 위치가 변화하게 되죠.
class Cup { int cupX, cupY; int[] cupPixel; Cup(int cupX, cupY, int[] cupPixel) { // 컵 데이터 초기화 this.cupX = cupX; this.cupY = cupY; this.cupPixel = cupPixel; } int moveCup(int moveX, int moveY) { // ... 컵 이동 알고리즘 구현 ... return 0; } } class ProgramStarter { public static void main() { // 컵 생성 Cup cup = new Cup(0,0, {0,0,1,1,0}); // 컵 이동 요청 cup.moveCup(1,2); } }2) 트랜드
보통 C언어라고 하면 C95, C99, C11 등의 표준 C와 몇 가지 확장된 기능을 제공하는 Embedded C 등의 확장된 비표준 C를 통칭해요. 이들 언어는 과거의 하드웨어 성능에 맞춰 설계되었기 때문에 복잡한 연산을 제공하지 않고 메모리를 적게 쓴다는 특성이 있어요.
따라서 임베디드 소프트웨어, 컴퍼일러, 인터프리터 등의 소프트웨어에서 고수준의 최적화가 필요한 경우 아직까지는 C언어를 사용하기도 해요. 하지만 절차지향 프로그래밍을 지향해 소프트웨어 규모가 커질 수록 가독성과 유지보수성이 떨어지고 C언어 이후에 나온 언어들의 컴파일러/인터프리터의 성능 최적화가 계속 이뤄지고 있는 만큼 사장되고 있는 언어이기도 하죠.
C언어 이후에 많은 언어가 나왔고 Java, Python, ES표준을 지향하는 Javascript, C언어에서 파생된 C++, C#, Object-C 들이 대표적으로 많은 사용층을 보유한 언어예요. 이들 언어는 기본적으로 명령형 프로그래밍과 객체 지향 프로그래밍을 지향하는데 최근에는 함수형 프로그래밍을 지원하도록 발전하고 있어요.
객체지향은 위에서 설명하였으니 함수형 프로그래밍을 추가 설명 드리자면 선언형 프로그래밍 형식을 차용하여 코드에 목표를 명시하여 무엇을 할 것인지를 표현하는 방식을 말해요.
예를 들면 명령형 프로그래밍은 아래와 같이 코드에 알고리즘을 구현하여 어떻게 동작하게 알 것인지를 표현해요.
List<Integer> numberList = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); List<Integer> doubleNumberList = new ArrayList<>(); // numberList를 반복하여 2배를 곱한 후 doubleNumberList에 추가하도록 동작에 대한 알고리즘 구현 for (int number : numberList) { doubleNumberList.add(number * 2); } System.out.println("origin : " + numberList); System.out.println("double : " + doubleNumberList); >> 실행 결과 출력 origin : [1, 2, 3, 4] double : [2, 4, 6, 8]대신에 함수형 프로그래밍은 아래와 같이 '모든 원소를 가공한다' 라는 map함수에 '두 배를 곱하겠다' 라는 익명 lambda함수를 전달하여 원소에 두배를 곱하는 목표를 구현하는 거죠.
List<Integer> numberList = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); // numberList의 원소들을 입력받아 2배를 곱해 새로운 doubleNumberList를 만들도록 목표 명시 List<Integer> doubleNumberList = numberList.stream().map(number -> number * 2).collect(Collectors.toList()); System.out.println("origin : " + numberList); System.out.println("double : " + doubleNumberList); >> 실행 결과 출력 origin : [1, 2, 3, 4] double : [2, 4, 6, 8]이런 함수형 프로그래밍은 각 함수가 독립적으로 동작하고 입력과 출력이 명확하기에 수식을 표현하기에 적합했고 일반 상용 SW 개발 언어보다는 학술용 SW 개발언어에서 많이 사용됐어요.
하지만 명령형 프로그래밍에서도 아래의 경우 함수형 프로그래밍을 적용하게 되면 목표를 명시하기에 가독성이 높아지고 코드가 짧아지며 같은 목표를 둔 함수의 경우 재사용성이 높아지기 때문에 언어들이 점차 함수형 프로그래밍을 지원하고 있는 추세입니다.
- 자료구조형 객체(List, Map, Set 등)의 데이터를 가공하여 신규 데이터를 만드는 함수
- 외부 상태에 영향을 주거나 받지 않는 Callback 함수
안녕하세요.
객체지향은 실제 세계를 모델링하여 개발하기 때문에 캡슐화가 가능합니다.
캡슐화란 관련된 데이터 알고리즘이 하나의 묶음으로 되어 있어 사용하기 편하며, 다른 사람이 코드를 이해하기에도 편합니다.
절차지향보다 디버깅이 쉽고, 코드의 재활용도가 늘어납니다.
하지만 설계에 시간이 필요하고, 처리 속도가 절차지향에 비해 느린편입니다.
객체지향이 절차지향에 비해 나중에 나온 개념이긴 하지만 완전히 대체되기는 어려우며, 업무 및 환경에 따라 두가지를 각각 선택해서 개발하면 될 듯 합니다.
C언어는 아직도 많이 사용되고 있고, 앞으로도 특정 분야에서는 C를 사용할 수 밖에 없습니다.
미래에는 어떻게 변할지 모르지만 현재 C언어는 사용할 데가 많습니다.
TIOBE에서 선정한 2021년 2월 기준 검색어 점유율 상위 20개 프로그래밍 언어
1.C
2.Java
3.Python
4.C++
5.C#
6.Visual Basic
7.JavaScript
8.PHP
9.SQL
10.Assembly language
낮은 점유율의 언어 일수록 사용자가 없으니 학습시나 개발시 어려움이 생깁니다. 어디다 물어볼데가 없다보니 혼자서 자문자답까지 해야합니다.
우선 상위권의 언어를 배우시고 능숙하게 사용이 가능해지시면 다른 언어로 확장 하시길 추천드립니다
안녕하세요. A-HA 프로그래밍 전문가입니다.
모듈화가 수월해 코드 재사용성이 높다는점이 특징입니다. 그리고 API를 사용하기도 좋죠.
초보자 분들에게 가장 추천하는 언어는 C와 자바, 그리고 파이썬입니다. 여기서 현업에서 가장 많이 사용되는 언어는 자바와 파이썬으로 보통 백엔드에서 사용됩니다.
그 이유는 API도 많고, 범용성도 높기 때문입니다.
자바는 객체지향 언어, 파이썬은 스크립트 언어라는 특성을 가지고 있습니다. 저는 처음 공부를 시작하신다면 자바를 더 추천합니다.