Programming/JAVA

자바 개념정리하기 - JVM, Memory, OOP

긍정왕웹서퍼 2021. 12. 14. 21:26
728x90

시작하며

뜬금없지만. 혼자 블로그에 글로 쓰면서 자바, 스프링의 이론이나 개념 혹은 단어의 뜻을 한번 적으면서 정리하고자 합니다..

워낙 프로그래밍에서 쓰이는 단어들이 낯설고 익숙하지 않거나, 자주쓰이지 않지만 알고있어야하는 단어와 뜻들이 있는거같습니다.

애매하게 알고있거나, 대략 이런뜻이겠거니, 혹은 공부했지만 까먹었던걸 한번 복기하자는 의미에서 포스팅을 하게 되었습니다.

 

 

JVM - Java Virtual Machine 

자바 가상머신, 말 그대로 가상으로 존재하는 소프트웨어이다. 자바언어는 os에 독립적이고자 JVM을 활용해, 자바코드를 바이트 코드로 변환하고 각 os에 맞게 전달한다. 이처럼 JVM이 동작하는 몇가지 특징이나 기능들을 살펴보자면,

  1. 자바 인터프리터 (interpreter) : 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할입니다.
  2. 클래스 로더(class loader) : 자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행중인 런타임때서야 모든 코드가 JVM과 연결됩니다. 이렇게 동적으로 클래스를 로딩하게 해주는 역할입니다.
  3. JIT 컴파일러 (Just in time compiler) : 프로그램이 실행 중인 런타임에 실제 기계어로 변환해주는 컴파일러를 의미합니다. 동적 번역이라고도 불리는 이 기법은 프로그램의 수행속도를 향상시키기 위해 개발되었고 JIT컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용하게 됩니다. 
  4. 가비지 컬렉터 (garbage collector) : JVM은 메모리 관리를 효과적으로 하기 위해 가비지 컬렉터를 사용해 더 이상 사용하지 않는 메모리를 자동으로 회수해 줍니다. 따라서 개발자가 따로 메모리 관리를 하지않아도 되게 됩니다.

메모리 구조 - Memory

모든 자바 프로그램이 JVM을 통해 실행되게 되며, 이때 운영체제로부터 해당 프로그램을 수행할 수 있도록 메모리를 할당받습니다.

이 할당받은 메모리를 JVM은 용도에 따라 분류하게 됩니다. 

  • 메소드(Method) 영역 : 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역입니다. JVM은 프로그램이 특정 클래스를 사용하면 해당 클래스의 클래스 파일(.class)을 읽어 해당 클래스에 대한 정보를 메소드 영역에 저장합니다. 
  • 힙(heap) 영역 : 자바 프로그램에서 모든 인스턴스 변수가 저장되는 영역입니다. JVM은 자바 프로그램에서 new 키워드를 사용해 인스턴스가 생성되면 해당 정보를 힙 영역에 저장합니다. 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
  • 스택(stack) 영역 : 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역입니다. 메소드의 호출과 관계되는 지역변수와 매개변수를 스택영역에 저장하며 이렇게 스택 영역은 메소드의 호출과 함께 할당되고 호출이 종료되면 소멸합니다. 이렇게 스택 영역에 저장되는 메소드의 호출정보를 스택 프레임(stack frame) 이라고 합니다. 
    • 스택 영역은 푸쉬(push)로 데이터를 저장하고, 팝(pop)으로 데이터를 인출합니다. 그리고 스택의 데이터를 저장하는 방식을 LIFO(Last in first out), 즉 후입선출 방식이라고 하며 가장 늦게 저장된 데이터가 가장 먼저 인출되게 됩니다. 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

메모리 영역과 높낮이에 따른 흐름도

 

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

객체지향프로그래밍은 컴퓨터 개발 설계방법론 중 하나입니다. 그리고 자바는 이 방법론을 표준으로 정하고 사용하고 있는데 

객체지향이란 이전 컴퓨터 프로그래밍에서 사용하던 방법론은 현실세계의 사람이 기준이 아닌, 컴퓨터 시점이 기준으로 절차지향같은 문제해결에만 초점을 맞추었고, 관점에 차이로 인한 설계방법에 변화가 필요하여 나타나게 되었다. '객체'란 현실세계에서 바라보는 사물 또는 생물등을 하나의 객체로 지정하고 그 객체의 특징을 변수로 담아 표현하는 설계방법입니다. 객체지향 프로그래밍에선 큰 특징들이 있는데

  1. 캡슐화 : 캡슐화는 하나의 객체가 특정한 목적을 위해 필요한 변수나 메소드들을 하나로 묶어 그룹화하는 것을 의미하며, 묶는 가장 큰 이유는 정보의 은닉화입니다. 이렇게 보호해야할 정보들을 감싸고 공통된 내용을 그룹화하는 것이 캡슐화입니다. 
  2. 추상화 : 추상화는 말 그대로 우리가 표현하고자 하는 객체를 보여줄 때 불필요하거나 세부 중요정보들은 숨겨서 보여주고 싶은 정보만 보여줄 수 있게 됩니다. 이렇게 추상화하는 이유를 사물에 빗대어보자면 일반인들은 자동차나 비행기가 목적지까지 가는 시간과 경로등만이 필요하지, 이게 어떻게 동작하고 어떤원리나 어떤부품을 사용했는지는 별로 궁금하지 않거나 숨겨야할것입니다. 이렇게 추상화는 사용자들이 특정 기능이 구현되는 방식을 걱정할 필요가 없어지므로 프로그래밍 노력과 복잡성이 줄어듭니다. 
  3. 상속 : 상속은 코드의 중복을 없애기 위해 고안되었으며 부모(상위)클래스가 자식(하위)클래스에게 속성들을 상속시켜 재사용할 수 있습니다. 코드의 중복을 줄여 재사용성을 높이게 되고, 이로인해 유지보수성이 높아지게됩니다. 이는 곧 비용과도 연결되는 중요점이죠. 
  4. 다형성 : 다형성은 상속을 통해 기능을 확장하거나 재정의하여 변경하는 것을 가능하게 해줍니다. 자바에서는 다형성의 개념을 활용하는 대표적인 방법이 오버라이딩(Overriding) 오버로딩(Overloading)입니다. 
    오버라이딩(Overriding)은 부모클래스가 가지고 있는 메소드를 자식클래스가 재정의해서 사용하는 것을 의미합니다. 
    오버로딩(Overloading)은 메소드의 이름은 똑같이 상속받아 사용하지만, 각 메소드마다 다른 용도로 사용하며, 이를 매개변수의 타입과 종류, 갯수등으로 다르게 사용하는 것입니다.