객체지향 프로그래밍과 JVM

객체지향 프로그래밍


자바 공부를 하다보면 객체지향 어쩌고 저쩌고 하는 말을 자주 듣게 되는데, 도대체 객체지향이 무엇인가.



개념


일단 객체지향 프로그래밍이란 컴퓨터 프로그래밍의 패러다임 중 하나다.
컴퓨터 프로그램을 여러 개의 독립된 객체(object)들의 모임으로 보는 것이다.

뭐 다른 건 다 됐고, 그래서 왜 객체지향적인 프로그래밍을 해야 하지?

지금이야 공부를 시작하는 단계고, 아직 혼자서 구글링에 의지하며 꾸역꾸역 코딩을 하고 있지만.
기본적으로 개발은 다같이 하게 된다. 다른 개발자가 쓴 코드를 내가 읽고 수정해야 할 수도 있고.
그런데 그 코드가 꼬이고 꼬여서 함수가 어떻게 작동을 하는 건지 영향 받는 변수를 싹 다 조사해봐야 한다면?

이를 위한 게 객체지향 프로그래밍이다. 큰 문제를 작게 쪼개는 것이 아니라, 작은 문제들을 해결할 수 있는 객체들을 만들고 그 객체들을 조합해서 큰 문제를 해결하는 방식, 상향식 해결법(Bottom-Up).

객체가 독립성을 가지고 신뢰성이 높게 만들어 놓으면 그 객체를 수정 없이 재사용 할 수 있으니까 개발이 편해진다.

하지만 요즘 프로그램은 워낙 복잡해져서… 뭐 단순히 객체지향 프로그래밍을 하면 코드가 간결해진다거나 알아보기 쉽다거나 유지보수가 편하다거나 하는 말은 어렵게 됐지만 ㅋㅋ
그 때문에 이걸 간결하게 정리하려고 ‘디자인 패턴’이란 것도 생겼다고 한다. 협업을 전제로 한 환경에서는 특히 중요한 프로그래밍 형식을 정하는 약속이다.
물론 지금은 봐도 이게 뭔 소린지 ㅋㅋ 하지만 개발자로 취직을 하기 위해선 반드시 알아둬야겠다.



결론은


뭐 말이 길었지만 결론적으로는 간결하고 아름다운 코딩을 하자! 인… 걸까?ㅋㅋ

사실 객체지향적 프로그래밍에도 단점은 보이는데, 유지보수에 대해 말하자면 대게 ‘상속’이 복잡하게 얽혀있으면ㅋㅋ
캡슐화 자체도 객체의 독립성면에서 객체 지향 프로그래밍에서 빠질 수 없는 요소긴 하지만, 함수 호출에 시간이 든다거나? 그래서 절차적 프로그래밍보다는 무거워진다고 하더라.

또, 객체 하나하나를 따로 나누는데 주력하다보니 서로 비슷한 처리를 하는 코드가 서로를 건드릴 수 없게 되었고 이를 해결하기 위해 getter(접근자: 값을 반환하는 메소드), setter(설정자: 필드에 값을 저장하는 메소드)사용이 너무 많아졌다. 이 과정에서 캡슐화가 깨지고 그냥 public으로 공개한 경우나 마찬가지인 상태가 되어 의미가 퇴색되었고, 다른 프로그래밍 패러다임이 필요해졌다. AOP(Aspect Oriented Programming)는 모든 코드 하나하나를 별개의 객체로 분리하기보다 ‘어떤 일을 어디서 처리하는가’ 에 더 중점을 두어 큰 범위로 묶어주어 모듈화 효율을 개선시켰고, 현대 프로그래밍 언어와 코드들은 원본 객체 지향 방식을 그냥 그대로 적용하는 경우가 드물다고 한다. 출처 나무위키 ㅋㅋ




JVM


JVM은 말 그대로 Java자바 Virtual가상 Machine머신으로(아 뭐야 가상만 한글이넼ㅋㅋ) OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터라고 한다.

쉽게 말하면, 우리가 java파일에 쓴 코드 그 자체는 CPU가 인식을 하지 못하니까 JVM이라는 가상머신을 거쳐서 인식할 수 있게 class파일로 컴파일하는 것이다.

다들 JDK 설치하고 cmd에 println(“Hello Java”);(혹은 월드)하고 javac로 컴파일 해보지 않으셨는지?ㅋㅋ