자바는 객체지향 언어 일까요? 먼저 자바는 객체지향 언어 인것을 알아보기 전에 객체지향 전에는 뭘 썼는지 객체지향 이 도입되고나서는 뭐가 편해졌는지 를 알아봐야하겠죠?
객체지향이 나오기 전에는 절차지향 언어로 프로그래밍을 하였습니다.
절차지향의 예로는 대표적으로 C언어가 있습니다.

절차지향은 클래스와 객체를 만들지 않고 함수와 변수로만 쭉 작성하였습니다. 위처럼 절차지향으로 프로그래밍을 하면 차례대로 부품 준비를 해야하고 부품의 종류를 선택하게 하여야하고 자동차 본체를 준비하고 본체크기와 본체 종류를 선택하고 자동차조립을 하고 자동차 색칠을 하는 순서대로 함수가 실행되어야 하고 하나라도 오류가 나면 안되도록 메인함수를 만들어야 합니다.
많은 변수와 메소드가 관리하기 힘들어지기 시작함 프로그램이 커지면 전역변수가 문제가 되고, A함수가 데이터를 바꿨는데 B함수가 모르고있다가 에러가 나고, 데이터가 어디가 어떻게 바뀌었는지 추적할 수 없게 됩니다. 이를 엉켜있는 의미의 스파게티 코드라고 불리게 됩니다.
이런한 단점들을 보완하기 위해 객체지향의 개념이 등장하였습니다.
데이터와 그 데이터를 다루는 함수를 객체에 가둬버리자!
그래서 클래스를 사용하므로써 클래스안에 있는 필요한 메소드나 변수들을 넣어 프로그래밍 하기가 쉬워집니다.

이런 식으로 메인객체가 비슷한 것 끼리 묶인 객체를 메소드를 호출하면서 객체간 소통을 하여 자동차를 만드는 것 입니다.
만약 음식 객체가 있지만 필요가 없다면 메서드 호출을 안하면 되겠죠?
이런식으로 프로그램을 다수의 객체로 만들고 컴퓨터가 제대로 작동 하도록 만드는 것이 객체지향 입니다.
단순히 클래스를 만들 수 있어서 자바가 객체지향 언어인 것은 아닙니다. C++이나 파이썬 같은 언어도 클래스를 사용할 수 있지만, 자바는 언어 설계 자체가 객체지향적으로 코드를 짜지 않으면 실행조차 안 되게 만들어져 있다는 점이 다릅니다.
제가 생각하는 자바가 객체지향 언어인 확실한 이유는 크게 3가지입니다.
1. 모든 코드는 클래스 안에 (강제성)
C언어나 파이썬과 달리 자바는 Class 없는 코드를 절대 허용하지 않습니다. 코드 한 줄을 짜더라도 무조건 소속을 정해줘야 하기 때문에, 개발자가 자연스럽게 객체 단위로 코드를 정리하게 만듭니다.
2. 포인터 제거 (안전성)
메모리 주소를 직접 건드리는 '포인터'를 없애버렸습니다. 외부에서 객체의 내부 데이터를 함부로 뚫고 들어오지 못하게 막아서, 객체지향의 핵심인 캡슐화를 보장합니다.
3. 다형성이 기본 (유연성)
별도의 설정 없이도 자식 클래스가 부모 클래스의 기능을 재정의(Overriding) 할 수 있습니다. 기능은 언제든 확장되고 바뀔 수 있다는 것을 전제로 설계되어 있어서, 부품을 갈아 끼우는 객체지향의 장점을 극대화하기 좋습니다.
이러한 특징들은 개발자들이 코드를 짤 때 필연적으로 순서가 아니라, 어떤 객체에게 어떤 책임을 줄 것인가? 를 고민하게 만듭니다. 바로 이 점이 자바가 객체지향 언어라 불리는 진짜 이유라고 생각합니다.