archive

[OOP] Chap2. 자바와 절차적/구조적 프로그래밍 본문

STUDY/Java

[OOP] Chap2. 자바와 절차적/구조적 프로그래밍

seonyounggg 2021. 1. 27. 14:46

스프링을 입문을 위한 자바 객체 지향의 원리와 이해 를 읽고 정리한 글입니다.


저자는 스프링 프레임워크는 OOP프레임워크라는 개념을 제품화 한 것이고, OOP개념을 채택한 제품 중 자바를 선택했으므로

1. OOP개념

2. Java의 문법

3. Java가 OOP를 구현한 방식

을 배워야 한다고 말한다

 

2장에서는 변수/메서드가 어떻게 메모리에 저장되고 사용되는지에 대해 다룬다.

 

자바 프로그램의 개발과 구동

JDK(Java Development Kit) : JVM용 소프트웨어 개발 도구

JRE(Java Runtime Environment) : JVM용 OS

JVM(Java Virtual Machine) : 가상의 컴퓨터

 

즉, JDK를 이용해서 개발된 프로그램은 JRE에 의해 가상의 컴퓨터인 JVM 상에서 구동된다.

JDK는 javac.exe(자바 컴파일러)를 포함하고, JRE는 java.exe(자바 프로그램 실행기)를 포함하고 있다.

JDK가 JRE를 포함하고, JRE가 다시 JVM을 포함하는 형태로 배포된다.

이러한 구조 덕분에 JVM은 Java와 OS간의 중개자 역할을 하여, 소스코드가 OS관계없이 실행가능하도록 한다.

 

▶ 자바 프로그램이 메모리를 사용하는 방식

모든 프로그래밍 언어는 메모리를 코드 실행 영역과 데이터 저장 영역으로 나누어서 사용한다.

객체 지향 프로그램에서는 데이터 저장 영역을 다시 스태틱 영역/스택 영역/힙 영역으로 분할해서 사용한다.

이를 앞으로 T메모리 구조라고 지칭하겠다.

 

절차적/구조적 프로그래밍

객체 지향 프로그래밍은 절차적/구조적 프로그램에 기반을 두고 있다.

절차적 프로그래밍은 한마디로 goto를 쓰지 않는 것이다.

구조적 프로그래밍은 논리를 함수단위로 작성하는 것이다. 또한 전역 변수보다는 지역 변수를 사용하라는 것이다.

 

main()메서드 : 메서드 스택 프레임

main()메서드는 프로그램이 실행되는 시작점이다.

T메모리 구조의 영역은 아래 요소들에 의해 사용된다.

스태틱 영역 - 클래스

스택 영역 - 메서드

힙 영역 - 객체

 

JRE는 먼저 프로그램안에 main() 메서드가 있는지 확인하고, 있다면 JVM을 부팅한다.

부팅된 JVM은 목적 파일을 받아 실행한다. JVM은 가장 먼저 전처리 과정을 거친다.

- java.lang패키지를 T메모리의 스태틱 영역에 배치한다.(모든 자바 프로그램은 java.lang 패키지를 포함한다.)

- import된 패키지를 스태틱 영역에 배치한다.

- 개발자가 작성한 모든 클래스를 스태틱 영역에 배치한다.

 

그 후, main()메서드가 실행되기 위해 main() 스택 프레임이 스택 영역에 할당 된다.

스택 프레임의 맨 밑에 메서드의 인자args를 저장할 공간을 확보한다.

그 이후에 main()메서드의  첫 명령문을 실행하게 된다.

명령문은 코드 실행 공간에서 별도로 실행되므로 T메모리에는 변화가 없다.

여는 중괄호를 만나면 스택프레임이 시작되며 닫는 중괄호를 만났을 때 스택 프레임이 소멸된다.

main()메서드가 끝나면 스택프레임이 소멸되며 이는 프로그램의 마지막점이다. 

JRE는 JVM을 종료하고 JRE도 사용했던 시스템 자원을 운영체제에 반납한다. 

 

변수와 메모리

main메서드 내에서 변수를 선언하는 명령문을 만나게 되면,

main() 메서드 스택 프레임 내의 밑에서부터 해당 변수에 크기에 해당하는 저장 공간을 마련하게 된다.

 

블록구문과 메모리 : 블록 스택 프레임

if문을 만나게 되면 조건에 따라 분기를 일으키게 된다. 

참인 경우라 했을 때, if문 중 참인 블록의 스택 프레임이 시작된다.

main() 메서드 스택 프레임 안에 if 블록 스택 프레임이 중첩되어 생성된다.

if문 내의 변수도 동일하게 if 블록 스택 프레임 내에 생성된다.

if문을 닫는 중괄호를 만나면 스택 영역에서 사라지며, if 블록 스택 프레임 내의 변수의 저장공간 또한 사라진다.

 

지역변수와 메모리

변수는 T메모리 세 영역에 모두 있다. 아래와 같은 목적을 가진다.

스택 영역 - 지역 변수

스태틱 영역 - 클래스 멤버 변수

힙 영역 - 객체 멤버 변수

 

지역 변수는 스택 영역 안의 스텍 프레임 내에서 위치한다. 스택 프레임이 사라지면 함께 소멸된다.

클래스 멤버 변수는 스태틱 영역 내에 위치한다. 한 번 위치하면 JVM이 종료될 때까지 고정된(Static) 상태로 존재한다.

객체 멤버 변수는 힙 역역에 위치한다. 객체와 함께 가비지 컬렉터(GC)에 의해 소멸된다.

 

T메모리의 변화에 따라, 외부 블록에서 내부 블록의 변수에는 접근할 수 없지만 그 역은 가능하다.

따라서 스택 메모리 내의 스텍 프레임 안의 변수를 지역 변수라고 한다.

지역 변수는 그 지역이 사라지면 함께 메모리에서 소멸된다.

 

메서드 호출과 메모리 : 메서드 스택 프레임

메서드 호출이 일어나면 무조건 호출되는 메서드의 스택 프레임이 스택 영역에 새로 생성된다.

해당 스택 프레임에는 반환값을 저장할 공간이 맨 아래, 그 다음으로 인자를 저장할 변수 공간, 마지막으로 메서드의 지역변수가 자리한다.

주의할 것은 main() 메서드의 변수와는 별도의 변수 공간이라는 것이다.

메서드를 호출하면서 인자로 전달되는 것은 변수 자체가 아니라 변수가 저장한 값만을 복사해서 전달한다.

이를 Call by Value라고 한다.(다른 메서드 안에서 변수를 조작해도 main함수의 변수 값에는 변함이 없다.)

메서드를 닫는 중괄호를 만나면 반환값 공간에 담긴 값을 돌려주면서 스택에서 사라진다.

입력값과 반환값에 의해서만 메서드 사이에서 값이 전달될 뿐, 서로 내부의 지역 변수를 볼 수 없다.

스택 프레임은 메서드를 호출할 때마다 생성된다. 같은 메서드를 호출하여도 별개의 공간이다.

 

전역변수와 메모리

메서드 사이에 값을 공유하는 방법에는 인자와 반환값 이외에도 전역변수를 사용하는 방법이 있다.

전역변수가 선언되면 스태틱 영역에 할당된다. 

여러 메소드들이 공유하여 사용할 수 있으므로 공유변수라고도 한다.

T메모리를 추적하지 않는 이상 어떤 값이 저장되어있는지 파악하기 쉽지 않다.

상수값을 전역으로 읽기 전용 변수로 선언하여 공유하는 것은 좋은 활용 예시이다.

이외에는 사용을 자제하는 것이 좋다.

 

멀티 스레드/멀티 프로세스의 이해

멀티 스레드의 T 메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다.

멀티 프로세스는 다수의 데이터 저장 영역, 즉 다수의 T메모리를 갖는 구조이다.

이러한 특징에 따라, 멀티 프로세스는 각 메모리가 고유의 영역이므로 서로 참조할 수 없다.

멀티 스레드는 하나의 스레드에서 다른 스레드의 스택 영역은 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용한다.

멀티 프로세스는 그만큼 안전한 구조이지만 메모리 사용량이 크다.

멀티 스레드는 그에 대비하여 메모리 사용량이 적은 구조이다.

 

멀티 스레드에서 전역 변수를 사용하게 되면 문제가 발생할 수 있다.

스레드1에서 스레드2로 CPU사용권이 넘어간 상황에서 전역 변수 값이 변경되면 예상하지 못한 결과를 얻을 수 있다.

쓰기 가능한 전역변수를 쓰게 되면 쓰레드 안정성이 깨진다고 표현한다.

(락을 거는 방법도 있지만 그렇게 되면 멀티 스레드의 장점을 해친다.)

 

 

'STUDY > Java' 카테고리의 다른 글

[OOP] Chap4. 자바가 확장한 객체지향  (0) 2021.02.04
[OOP] Chap3. 자바와 객체지향  (0) 2021.02.01
[Java] 변수와 자료형  (0) 2021.01.25
Java 애플리케이션 작동 원리  (0) 2021.01.07
Java 개발환경구축 / Java API문서  (0) 2021.01.07
Comments