개인 공부/JAVA

[Java] 절차지향과 객체지향의 비교

호기심 많은 솔이 2025. 3. 6. 18:43

*본 게시물은 인프런 김영한 강사님의 자바 강의를 참고하여 작성하였습니다.
*본 게시물은 불곰님의 블로그를 참고하여 작성하였으며, 글 하단에 출처를 기록해두었음을 밝힙니다.
*본 게시물은 개인 공부를 기록하기 위해 작성하였으며, 내용에 오류가 있을 수 있음을 밝힙니다.

 

절차지향 프로그래밍(Procedural Programming)이란?

절차지향 프로그래밍이란 프로그램이 위에서부터 아래로 순차적으로 실행되도록 하는 프로그래밍 기법이다. 절차 지향 프로그래밍에서는 데이터와 기능(함수)이 따로 존재하고, 함수가 데이터를 처리하는 방식이다. 절차지향 프로그래밍은 코드가 직관적이므로 초보자가 이해하기 쉽고, 일반적으로 실행 속도가 빠른 편이다. 하지만 코드가 커지면 유지보수가 어려워질 수 있다. 정리하자면, 절차지향 프로그래밍은 "어떻게"를 중심으로 프로그래밍을 했다고 볼 수 있다. 대표적인 절차지향 언어로는 C언어가 있다.

 

 

 

객체지향이 왜 유지보수 하기에 유리한지를 보여주기 위해, 속성과 데이터가 각각의 클래스로 존재하는 경우를 보여주자면

 

 

음악 플레이어의 데이터는 첫 번째 사진의 MusicPlayerData에 있는데, 그 데이터를 사용하는 기능은 MusicPlayerMain3 클래스에 있는 각각의 메서드에 분리되어 있다. 따라서 음악 플레이어와 관련된 데이터는 MusicPlayerData를 사용해야 하고, 음악 플레이어와 관련된 기능은 MusicPlayerMain3의 각 메서드를 사용해야 한다. 데이터와 그 데이터를 사용하는 기능은 매우 밀접하게 연관되어 있다. 이후에 MusicPlayerData에서 관련 데이터가 변경되면 MusicPlayerMain3 부분의 메서드들도 함께 변경해야 한다. 즉, 이렇게 데이터와 기능이 분리되어 있으면 유지보수 시에 관리 포인트가 2곳으로 늘어나게 되므로 유지보수가 어려워진다.

 

 

 

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

객체지향 프로그래밍이란 데이터와 기능을 하나로 묶어서 하나의 객체에 대한 개념을 온전히 하나의 클래스에 담아, 객체 단위로 프로그래밍하는 기법이다. 객체지향 프로그래밍에서는 프로그램의 실행 순서보다는 객체 클래스를 만드는 것 자체에 집중해야 한다. 객체가 어떤 속성(데이터)을 가지고 어떤 기능(메서드)을 제공하는지에 초점을 맞추어야 한다는 것이다. 객체지향 프로그래밍은 절차지향 프로그래밍에 비해 유지보수가 쉽고 코드의 재활용성이 높지만, 처리 속도가 느리고 설계에 많은 시간이 들어간다. 절차지향 프로그래밍이 "어떻게"를 중심으로 프로그래밍을 한 것이라면, 객체지향 프로그래밍은 "무엇을"을 중심으로 프로그래밍을 했다고 볼 수 있다. 대표적인 객체지향 언어로는 Java가 있다.

 

절차지향 프로그래밍은 데이터와 기능이 따로 존재한다는 것을 위에서 보여주었는데, 객체지향 프로그래밍은 데이터와 기능이 하나의 객체 안에 함께 존재한다는 것을 예시 코드로 보여주자면

 

 

이 MusicPlayer라는 하나의 클래스 안에 음악 플레이어에 필요한 속성과 기능을 모두 정의하였다. 속성은 이 MusicPlayer클래스의 멤버 변수인 volume, isOn으로 정의하였고, 기능은 MusicPlayer를 사용하기 위한 기능을 구현한 메서드 on, off, volumeUp, volumeDown, showStatus로 정의하였다. 이제 음악 플레이어가 필요한 곳에서 이 클래스만 있으면 온전한 음악 플레이어를 생성하여 사용할 수 있다.

 

이제 MusicPlayer라는 하나의 객체 내에 구현된 기능들을 직접 사용한 코드를 보여주자면

 

 

이 코드를 보면 실세계와 유사하게 이미 만들어져있는 음악 플레이어를 사용자가 기능만 호출해서 사용하고 있다는 것을 알 수 있다. 즉, 뮤직 플레이어를 사용하는 입장에서는 뮤직 플레이어 안의 내용이 어떤지는 알 필요가 없고 단순히 기능을 호출하여 사용하면 된다는 것이다.

 

이해를 돕기 위해 비유를 통해 몇 가지 예시를 더 들어보겠다.

 

비유 : 세상의 모든 사물을 단순하게 추상화해보면 속성(데이터)과 기능(메서드)으로 설명할 수 있다.

 

1. 자동차

- 속성 : 색상, 현재 속도

- 기능 : 액셀, 브레이크, 문 열기, 문 닫기

 

2. 동물

- 속성 : 색상, 키, 온도

- 기능 : 먹는다, 걷는다

 

3. 게임 캐릭터

- 속성 : 레벨, 경험치, 소유한 아이템

- 기능 : 이동, 공격, 아이템 획득


-> 여기서 속성은 멤버 변수, 기능은 메서드로 각각의 '객체' 내에 포함되어 있는 것이다.

 

위의 내용들을 통해 절차지향과 객체지향의 개념에 대해 이해했다면, 이제 마지막으로 객체지향 프로그래밍의 주요 특징에 대해서 알아보자.


1. 캡슐화

캡슐화(Encapsulation)는 데이터와 이를 처리하는 기능을 하나의 객체로 묶고, 외부에서 직접 접근하지 못하도록 제한하는 객체지향 프로래밍(OOP)의 핵심 개념이다. 즉, 데이터를 감추고 외부 세계와의 상호작용은 메서드를 통해 하는 방법이다. 위의 MusicPlayer를 보면 음악 플레이어를 구성하기 위한 속성과 기능이 마치 하나의 캡슐에 쌓여있는 것 같다. 이렇게 속성과 기능을 하나로 묶어서 필요한 기능을 메서드를 통해 외부에 제공하는 것을 캡슐화라 한다. 캡슐화의 장점으로는 데이터 보호, 코드의 유지보수성 향상, 객체 간 결합도 감소, 보안 강화 등이 있다.


2.상속

상속(Inheritance)은 기존 클래스(부모 클래스)의 속성(필드)과 기능(메서드)을 새로운 클래스(자식 클래스)가 물려받아 확장하는 객체지향 프로그래밍(OOP) 개념이다. 상속을 통해 중복 코드를 제거하여 코드의 재사용성을 증가시킬 수 있고, 기존 기능을 쉽게 추가 및 수정할 수 있도록 한다.


3.다형성
다형성(Polymorphism)은 같은 메서드나 객체가 다른 형태로 동작할 수 있도록 하는 객체지향 프로그래밍(OOP)의 개념이다. 즉, 하나의 인터페이스로 여러 개의 구현을 가질 수 있는 것을 의미한다. 이를 통해 코드를 유연하게 작성하고, 유지보수를 쉽게 할 수 있도록 한다.


4.추상화

추상화(Abstraction)는 클래스들 사이에서 공통된 속성과 기능을 도출해내는 것을 말한다. 공통된 부분을 포함하는 클래스라고 해서 꼭 상위 클래스로 만들어야 하는 것은 아니고, 상황에 따라 공통 요소를 가진 하위 클래스를 정의할 수도 있다. 추상화를 활용하면 코드 중복을 줄이고, 클래스 간의 관계를 명확하게 만들며, 유지보수도 수월해진다. 자바에서는 추상 클래스나 인터페이스를 통해 추상화를 구현할 수 있다. 

 

**참고한 블로그**
불곰, 2018년 12월 22일, https://brownbears.tistory.com/407