본문 바로가기
Java

[Java OOP 기초] 객체 지향 프로그래밍

by jphwany 2022. 5. 25.

객체 지향 프로그래밍 (Object Oriented Programming)

 

프로그래밍 방법론, 패러다임 중 하나


필요한 데이터를 추상화, 그러니까 복잡한 여러 자료와 시스템 같은 것들의
핵심적인 부분만 간추려내서 어떤 상태와 행위를 가진 객체를 만들고
그 객체 간 유기적 상호작용을 통해서 로직을 구성하는 것인데

직관적으로 이해를 하기 위해 예시로 비교를 해보면
기존의 C언어 같은 절차지향언어에서는 어떤, 흐름이나 절차에 중점을 두고 설계해서
순서대로 작동하게끔하는 프로그래밍이 주 였다

자판기를 예로 들어보면
어떤 상품을 뽑기위한 이 기계는 큰 과정으로만 본다면
돈을 넣고, 그 돈이 상품가격에 충분한지 여부를 판단한 후
상품을 선택한 뒤, 그 재고가 있는지를 확인하고 상품을 내보내며
남은 거스름돈을 반환하고 끝나는 과정이다

자판기같은 어떠한 절차를 통해 자동화된 시스템을 위해선 
이러한 절차지향적인 프로그래밍들이 효율적이라고 볼 수 있겠지만

사실 세상엔 이런 자동화 시스템만 존재하지 않고
조금 더 복잡한, 여러 존재 간의 관계성, 거기서 오는 상호작용 이런 것들이 많기 때문에
이러한 것을 효과적으로 표현하기 위해 앞서 말한 여러 존재간 관계, 상호작용을
객체와 객체 간 유기적인 관계를 그려나가는 프로그래밍으로 나타낼 필요성이 있었다

그렇게 나오게된 객체 지향 프로그래밍 OOP라고 볼 수 있다
이 OOP는 크게 4가지 정도 특성을 가지고 있는데

캡슐화, 상속, 추상화, 다형성


각각은 독립된 특성이 아니라 서로 밀접한 연관이 있다

앞서 OOP는 여러 객체간 유기적 관계를 그려나가는 프로그래밍이라고 했는데
현실에 존재하는 여러 복잡한 자료와 시스템을 추상화, 핵심부분만 뽑아내서 모델링을 하고

그런 핵심부분이 존재하는 여러 객체들을 캡슐화를 해서 
접근 제어자를 걸어두고 필요하다면 변하지 말아야 하는 고유의 데이터는 숨기고 보호하고

여러 곳에서 쓰일 데이터는 또 여러 곳에서 상속 관계로 그대로 이어받아 
또 선언하거나 할당할 필요 없이 , 그러니까 중복을 피해서 코드를 효율적으로 작성하고

이렇게 적재적소에 필요한 것들을 가져다가 레고 조립처럼 이 하나의 컴포넌트 또는 
모듈이라고도 하는 여러 프로그램 기능을 모아 하나의 특정 기능을 수행할 수 있게 만들어둔 집합을
역할 부분인 인터페이스와 구현해내는 부분을 나눠서 유연하게 변경하거나 확장시키는 다형성까지

이러한 OOP는 서로 밀접한 특성으로 꾸려져있는 프로그래밍 이라고 할 수 있다


장점과 단점

장점이라고 한다면 앞서 언급했던 4가지 특성으로 인한 장점들을 꼽을 수 있는데

소스 코드를 간결하게 만들 수 있고
객체를 여러 갈래로 분할 해놓은 재료 집합들을 가지고 있어서
나중에 유지보수를 할 때 굉장히 편리하다는 점을 들 수 있다

코드의 재활용도 편한데 상속이라는 특성을 가지고 있기 때문에 확장을 시키거나
다른 사람이 만들어놓은 클래스를 가져와서 사용할 수도 있기 때문이다

하지만 이러한 OOP도 단점은 존재하는데

이렇게 추상화를 통해 핵심을 뽑아 객체화를 시키는 이 과정

그러니까 이 전체적인 설계에 들어가는 사고 과정에서 고민이 많을거고 그 만큼 시간도 걸린다

그리고 장점에서 언급한 상속도 과하게 다중상속으로 들어가다보면 
소스 분석 자체가 어려워지면서 그야말로 스파게티 코드라고 불리는 지경까지 가버릴 수 있다
장점을 되려 깎아먹는 치명적인 단점이 되어버릴 수 있는 양날의 검이라고 볼 수 있다

'Java' 카테고리의 다른 글

[Java OOP 기초] 필드와 메소드  (0) 2022.05.25
[Java OOP 기초] 클래스와 객체  (0) 2022.05.25
[Java 기초] 계산기  (0) 2022.05.23
[Java 기초] 배열  (0) 2022.05.23
[Java 기초] 제어문  (0) 2022.05.23

댓글