기록방
java 객체 지향 #2 본문
2️⃣ 자바와 절차적/구조적 프로그래밍
자바는 객체 지향 언어이면서 근본적으로 프로그래밍 언어임.
프로그래밍 언어로서의 자바의 변수가 메모리에 어떻게 저장되고 사용되는지, 메소드가 어떻게 호출되고 메모리에 어떤 변화를 일으키는지 살펴보자.
📣 자바 프로그램의 개발과 구동
자바 프로그램의 개발과 구동 과저을 현실 세계에 비교해 표현하면 다음과 같다
현실 세계 가상 세계 (자바 월드)
소프트웨어 개발 도구 | JDK - 자바 개발 도구 : JVM용 소프트웨어 개발 도구 |
운영체제 | JRE - 자바 실행 환경 : JVM용 OS |
하드웨어 - 물리적 컴퓨터 | JVM - 자바 가상 기계 : 가상의 컴퓨터 |
- JDK : Java Development Kit / 자바 개발 도구
- JRE : Java Runtime Environment / 자바 실행 환경
- JVM : Java Virtual Machine / 자바 가상 기계
프로그램의 메모리 사용 방식
일반적인 프로그래밍 언어의 메모리 사용 방식 : 코드 실행 영역 + 데이터 저장 영역
객체 지향 프로그램의 메모리 사용 방식 : 코드 실행 영역 + ( 스태틱(Static) 영역 + 스택(Stack) 영역 + 힙(Heap) 영역 ) => T 메모리 구조
📣 자바에 존재하는 절차적/구조적 프로그래밍의 유산
- goto의 폐해를 막기위해 java는 예약어로 잡아두고 사용을 금지시킴
- 절반 정도의 예약어(키워드)가 절차적/구조적 언어에서 유래됨
📣 다시 보는 main() 메서드 : 메서드 스택 프레임
- 스태틱 영역 : 클래스들의 놀이터
- 스택 영역 : 메서드들의 놀이터
- 힙 영역 - 객체들의 놀이터
java가 실행할대 메모리의 변화를 추적해보자
- JRE가 프로그램 속 main()메소드가 있는지 확인한다. Start 클래스에서 발견할 수 있다.
- main() 메서드 존재가 확인되면 프로그램 실행을 위한 사전 준비에 착수한다.
- JVM 전원 부팅
- 부팅 된 JVM은 목적 파일을 받아 실행
- JVM이 가장 먼저 하는 일은 ‘전처리’
- 모든 자바 프로그램이 반드시 포함하게 되는 패키지인 java.lang 패키지를 T 메모리의 스태틱 영역에 가져다 놓음
- 그 외에 개발자가 작성한 모든 클래스와 임포트 패키지도 스태틱 영역에 가져다 놓음
- 스택 영역에 main() 메서드를 위한 **스택 프레임(stack frame)**을 할당 : [중괄호 열기 ‘{’]
- 메서드의 인자 (args)를 저장할 변수 공간을 스택 프레임 맨 밑에 할당
- 명령문 실행
- 스택 프레임 소멸 : [중괄호 닫기 ‘}’]
- JVM이 가장 먼저 하는 일은 ‘전처리’
- main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다.
(힙 영역은 OOP에서 클래스와 객체를 이야기 한 후 아주 중요한 영역이지만, 지금은 생략)
📣 블록 구문과 메모리 : 블록 스택 프레임
- if문 혹은 else 문으로 열리는 코드 블록이 블록 스택 프레임인데, 기존의 main() 스택 프레임 안에 열리게 된다.
- if문 블록 스택 프레임 안에서는 main() 스택 프레임의 변수를 사용할 수 있지만 반대는 불가능하다. (블록 스택 프레임의 소멸 때문)
📣 지역 변수와 메모리 : 스택 프레임에 갇혔어요!
변수는 메모리에 있다. 더 정확히는 T 메모리 세 영역에 각각 지역 변수, 클래스 멤버 변수, 객체 멤버 변수로 존재한다.
- 지역 변수 : 스택 영역의 스택 프레임 안에서 일생을 보내며, 스택 프레임이 사라지면 함께 사라진다.
- 클래스 멤버 변수 : 스태틱 영역에서 일생을 보내며, 스태틱 영역에 한 번 자리를 잡으면 JVM이 종료될 때까지 고정(static) 상태로 자리를 지킨다.
- 객체 멤버 변수 : 힙에서 일생을 보내며, 객체 멤버 변수들은 객체와 함께 가비지 컬렉터라는 힙 메모리 회수기에 의해 일생을 마치게 된다.
💡 외부 스택 프레임에서 내부 스택 프레임의 변수에 접근하는 것은 불가능하나 그 역은 가능하다.
📣 메서드 호출과 메모리 : 메서드 스택 프레임 2
메서드 사이의 값을 전달하거나 반환하는 방법은 메서드 인자와 반환값으로만 가능하다.
- 값을 복제해서 전달하면 값에 의한 전달(Call By Value)
전역 변수도 있지만 가급적 쓰지 않는것이 좋다.
📣 전역 변수와 메모리 : 전역 변수 쓰지 말라니까요!
메서드 인자와 반환값 말고도 전역 변수로 메서드 사이의 값을 공유할 수 있다.
- 스택 프레임에 종속적인 지역 변수
- 스택 프레임에 독립적인 전역 변수
하지만 전역 변수는 문제를 일으킨다.
📣 멀티 스레드 / 멀티 프로세스의 이해
- 멀티 스레드 (Multi Thread) : T 메모리의 스택 영역을 스레드 개수만큼 분할해서 사용
- 서로 다른 프로세스의 스택 영역 접근 불가
- 스태틱 영역과 힙 영역을 공유해서 사용하기 때문에 메모리를 적게 사용
- 멀티 프로세스 (Multi Process) : 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조
- 각 프로세스 마다 각자의 T 메모리를 갖고, 고유의 공간이므로 서로 참조할 수 없음
- 다른 프로세스가 T 메모리 영역을 절대 침범할 수 없는 메모리 안전 구조이지만 메모리 사용량이 그만큼 큼
⇒ 멀티 스레드에서 전역 변수를 사용하면….문제가 생긴다! (문제 해결을 위해 lock을 걸 순 있지만 멀티 스레드 사용 이유가 없어짐)
필드와 속성, 함수와 메서드 말이 혼용되지만, 절차적/구조적 프로그래밍에서 객체 지향으로 넘어오면서 말을 바꾼 것 뿐임
필드 == 속성 == 전역 변수
함수 == 메소드
(객체 지향에서 필드는 객체 변수 또는 정적 변수를 말하고, 속성은 필드를 외부에 노출시키는 메서드라고 하는 사람도 있음)
📣 2장 중요 내용 상기
- 스태틱 : 클래스의 놀이터
- 스택 : 메서드의 놀이터
- 힙 : 객체의 놀이터
728x90
'FrameWork > Spring' 카테고리의 다른 글
1장 : 스프링 부트 시작하기 (0) | 2024.03.06 |
---|---|
코딩 자율학습단 8기 : 스프링 부트3 (0) | 2024.03.06 |
Bug Report : Errors 객체를 ResponseEntity body에 담아서 JSON 형태로 리턴 (0) | 2023.11.14 |
스프링 JPA? MyBatis? Hibernate? (5) | 2023.01.27 |
java 객체 지향 #1 (0) | 2022.09.29 |