IT 책 독서록

[스프링 입문을 위한 자바 객체지향의 원리와 이해] 1 ~ 2장 정리

robinjoon98 2022. 3. 14. 20:06

1장 : 온고지신. 청출어람

1장에서 얘기하고자 하는 말은 다음 두 문장으로 정리된다.

"스프링같은 신기술은 하늘에서 뚝 하고 떨어진 것이 아니라 이전 기술의 어깨를 디딤돌삼아 그 위에 이전 기술이 제시한 철학과 기법을 정제하고, 이전 기술을 거름삼아 새로운 철학과 기법을 더해 나타나는 것" 

"따라서, 스프링을 온전히 이해하기 위해서는 이전 기술들에 대한 이해가 필요하다."

 

2장 : 객체지향 속 구조적/절차적 프로그래밍

2장의 내용은 객체지향 프로그래밍 언어인 자바에서, 그 이전의 구조적/절차적 프로그래밍 언어에서 사용하던 기법들을 어떻게 사용하고 있는지 보여준다. 자바의 많은 예약어는 C언어에서 왔음을 보여주며 절차적/구조적 프로그래밍의 유선을 객체지향 프로그래밍 언어인 자바에서 사용하고 있음을 보여준다.

 

그 이후 컴퓨터공학 전공자라면 다들 한번 배웠을 법 한 메모리 구조를 설명하며, 이것이 자바에서 어떻게 사용되는지 설명한다.

객체지향 언어에선 메모리를 크게 코드실행 영역과 데이터 저장영역으로 나누고, 데이터 저장 영역은 다시 스태틱 영역, 스택영역, 힙 영역으로 나뉜다. 2장에선 힙 영역에 대한 이야기는 나오지 않고, 스태틱영역과 스택영역만 다룬다. 

스태틱 영역

클래스의 영역이다. 모든 클래스는 이곳에 로드된다. 구체적으로, jvm이 실행되면 스태틱 영역에 java.lang 패키지를 로드하고, 그 후 개발자가 작성한 모든 클래스와 임포트한 패키지를 스태틱 영역에 가져다 놓는다. 이 때, static 키워드로 선언된 클래스 변수도 이곳에 저장된다.

스택영역

스택 영역 내부에선 메서드가 호출될 때 마다 각각의 스택 프레임이 생성되고, 그 안에 메서드의 매개변수와 지역변수들의 공간이 할당된다. 메서드 내부에서, if, for 문 등의 제어문을 만나면 스택프레임 내부에 또다른 스택 프레임이 생성되고, 그 안에서 제어문 내부에서 선언된 변수들의 메모리가 할당된다. 제어문이 끝날 때, 메서드가 끝날 때 스택프레임은 삭제된다.

따라서, 제어문 내부의 변수를 제어문 밖에서 접근 할 수 없고, 제어문 밖의 변수는 제어문 내부에서 접근이 가능한 것과, 메서드 내부의 지역변수를 메서드 외부에서 사용할 수 없는 이유는 근본적인 메모리 구조 때문이다.

멀티쓰레드

멀티쓰레드 환경은 스택영역을 쓰레드 개수만큼 분할하여 사용하고, 스태틱 영역은 분할하지 않고 공통으로 사용한다.

따라서, CPU를 점유하고 있는 쓰레드가 계속 번갈아가면서 스태틱영역에 값을 저장한다면, 각 쓰레드는 각자가 예상하지 못한 값을 참조하게 된다. 이를 방지학 위해 lock 같은 기법이 있지만, 근본적으로 스태틱 영역에 저장되는 변수는 읽기전용으로만 사용하는 것이 좋다.

결론

2장의 마지막 부분에선,

"객체지향 프로그래밍에서는 절차적/구조적 프로그래밍에서 사용되던 함수를 메서드라고 이름만 바꾸어 그대로 사용하고, 따라서 객체지향 프로그래머는 절차적/구조적 프로그래밍 기법도 잘 알고 있어야 한다" 고 얘기한다. 

의견

이 부분은 컴퓨터공학 전공생이나, 이미 자바의 메모리구조에 대해 공부한 적이 있다면 빠르게 읽고 넘어가는게 좋을 거 같다.