기록방

java 객체 지향 #2 본문

FrameWork/Spring

java 객체 지향 #2

Soom_1n 2022. 9. 29. 16:16

2️⃣ 자바와 절차적/구조적 프로그래밍


자바는 객체 지향 언어이면서 근본적으로 프로그래밍 언어임.

프로그래밍 언어로서의 자바의 변수가 메모리에 어떻게 저장되고 사용되는지, 메소드가 어떻게 호출되고 메모리에 어떤 변화를 일으키는지 살펴보자.

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

자바 프로그램의 개발과 구동 과저을 현실 세계에 비교해 표현하면 다음과 같다

현실 세계 가상 세계 (자바 월드)

소프트웨어 개발 도구 JDK - 자바 개발 도구 : JVM용 소프트웨어 개발 도구
운영체제 JRE - 자바 실행 환경 : JVM용 OS
하드웨어 - 물리적 컴퓨터 JVM - 자바 가상 기계 : 가상의 컴퓨터
  • JDK : Java Development Kit / 자바 개발 도구
  • JRE : Java Runtime Environment / 자바 실행 환경
  • JVM : Java Virtual Machine / 자바 가상 기계

https://languagefight.tistory.com/131

프로그램의 메모리 사용 방식

일반적인 프로그래밍 언어의 메모리 사용 방식 : 코드 실행 영역 + 데이터 저장 영역

객체 지향 프로그램의 메모리 사용 방식 : 코드 실행 영역 + ( 스태틱(Static) 영역 + 스택(Stack) 영역 + 힙(Heap) 영역 ) =>  T 메모리 구조

📣 자바에 존재하는 절차적/구조적 프로그래밍의 유산

  • goto의 폐해를 막기위해 java는 예약어로 잡아두고 사용을 금지시킴
  • 절반 정도의 예약어(키워드)가 절차적/구조적 언어에서 유래됨

📣 다시 보는 main() 메서드 : 메서드 스택 프레임

  • 스태틱 영역 : 클래스들의 놀이터
  • 스택 영역 : 메서드들의 놀이터
  • 힙 영역 - 객체들의 놀이터

java가 실행할대 메모리의 변화를 추적해보자

  1. JRE가 프로그램 속 main()메소드가 있는지 확인한다. Start 클래스에서 발견할 수 있다.
  2. main() 메서드 존재가 확인되면 프로그램 실행을 위한 사전 준비에 착수한다.
    1. JVM 전원 부팅
    2. 부팅 된 JVM은 목적 파일을 받아 실행
      • JVM이 가장 먼저 하는 일은 ‘전처리’
        • 모든 자바 프로그램이 반드시 포함하게 되는 패키지인 java.lang 패키지를 T 메모리의 스태틱 영역에 가져다 놓음
        • 그 외에 개발자가 작성한 모든 클래스와 임포트 패키지도 스태틱 영역에 가져다 놓음
      • 스택 영역에 main() 메서드를 위한 **스택 프레임(stack frame)**을 할당 : [중괄호 열기 ‘{’]
      • 메서드의 인자 (args)를 저장할 변수 공간을 스택 프레임 맨 밑에 할당
      • 명령문 실행
      • 스택 프레임 소멸 : [중괄호 닫기 ‘}’]
  3. 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장 중요 내용 상기

  • 스태틱 : 클래스의 놀이터
  • 스택 : 메서드의 놀이터
  • 힙 : 객체의 놀이터

 

원본 노션 정리 글

 

java 객체 지향 #2

2️⃣ 자바와 절차적/구조적 프로그래밍

probable-legume-162.notion.site

 

728x90