자바를 공부하면서 가장 힘들었던 파트가 바로 이 객체지향이었다. 이해가 될듯 하면서도 다시보면 생소하고 몇번을 반복해서 봐도 난해한 개념이었다.
객체지향(Object_Oriented Programming)은 프로그램을 '객체'라는 기본 단위로 나누고 객체들간의 상호작용을 통해 프로그래밍하는 기법을 말한다.
객체란 상태와 행동을 가지는 모든것이다. 따라서 각 객체는 책임과 역할이 있다.
프로그래밍에서는 클래스를 이용해 같은 종류의 집단에 속하는 속성과 행위를 정의한다. 이 클래스가 실제 메모리상에 할당되어, 객체화 되었을때 그 인스턴스를 객체라고 할 수 있다.
객체지향을 이용하게 되면 기능별로 역할별로 객체들이 나뉘어져 있어 코드를 재사용하거나 기능을 확장하거나 유지보수성이 높아진다. 또한 캡슐화, 다형성 등을 이용해 보안성을 높일 수도 있다. 따라서 대규모 프로젝트에 있어서 굉장한 강점을 가지고 있다.
객체지향에 나오는 개념들이 아직 익숙하지 않고 객체지향이 가지는 장점들을 많이 체험해보지 않아서 와닿지 않지만 계속해서 예제코드나 실제 프로그램들의 코드를 살펴보고 뜯어보며 익숙해진다면 객체지향과 더 친해질 수 있을거라고 믿는다.
언어주차 중에 객체지향을 이용해 코드를 리펙토링하는 과제가 있었는데 이미 작성된 코드를 보고 이해하는 것은 어렵지 않지만 확실히 내가 직접 작성하는 것은 어렵고 복잡했다. 객체지향의 특징들을 살리려니 더 어려웠던것 같다. 하지만 지금까지는 주어진 예제들만 보고 이해하고 넘어갔었는데 내가 직접 리펙토링해보고 구현해보고 하니 객체지향에 조금더 익숙해진것 같다. 스프링 들어가기 전까지 계속해서 복습하면서 최대한 객체지향에 익숙해져야겠다.
자바라는 언어는 Java Virtual Machine, JVM에서 실행된다. 따라서 OS에 종속받지 않고 언어를 사용할 수 있다.
자바를 공부하기전부터 들어봤고 계속해서 들어본 말이지만 정확히 무엇을 뜻하는지는 몰랐다. 언어 공부하기 바쁘고 알고리즘 문제 풀기 바빠서 깊은 내용은 나중에 찾아봐야지 하고 잊고 있었는데 WIL을 통해 간단하게나마 알아봐야겠다.
우리가 컴퓨터와 소통하기 위해서는 사람의 언어를 컴퓨터 언어로 번역하는 과정이 필요한데 두 가지 방식이 있다.
프로그램 전체를 스캔하여 한번에 기계어로 번역하는 컴파일러, 한번에 한 문장씩 번역하는 인터프리터가 있는데 자바는 컴파일러와 인터프리터가 모두 필요하다.
자바가 기계어로 번역되는 과정을 살펴보자.
먼저 우리가 작성하는 소스코드는 OS가 알아들을 수 있도록 컴파일을 해줘야 하는데 자바는 JVM이라는 가상머신을 통해 OS에 도달한다. 따라서 JVM이 인식할 수 있는 코드 바이트 코드
로 컴파일 하게 된다. 이 바이트 코드를 JVM이 다시 OS가 알아들을 수 있도록 해석해준다.
소스코드를 바이트코드로 컴파일만 해준다면 어느 JVM에서도 작동시킬 수 있기 때문에 OS에 종속받지 않는것이다.
이 과정을 간단하게 살펴보면 먼저 우리는 .java
파일을 생성해 소스코드를 작성한다. 자바 컴파일러인 javac
가 소스코드를 컴파일해 .class
파일을 만들어 준다. 이 파일에 바이트 코드가 들어있는 것이다. 이후 바이트 코드는 JVM을 통해 기계어로 최종 해석된다.
소스 코드를 바이트 코드로 번역하는데 컴파일러가 사용되고 바이트 코드를 기계어로 번역하는데 인터프리터가 사용되는것이다.
평소 궁금하던 JVM에 대해서 간단하게 알아봤는데 더 깊게 들어가면 이해해야하는 개념이 훨씬 많다. 요즘들어 느끼는 건데 뭔가 지식이 늘어가면 늘어갈수록 공부해야 하는게 점점 많아지는것 같다. 그만큼 시야가 넓어지는 느낌이다. 항해 커리큘럼 따라가면서도 틈틈이 주변지식도 공부해야겠다.