20210816

오늘 공부한 내용 ✍🏻

Python 정리

  • abs(x) : 절대값 합수
   abs(-99) = 99 
  • enumerate 함수 : 리스트의 인덱스와 값을 전달
  data = enumerate((1, 2, 3))

  for i, value in data:
      print(i, ":", value)

  # 출력 
  0 : 1
  1 : 2
  2 : 3
  • join 함수 : 매개 변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 변환
# 구분자.join(문자열 리스트)
"".join([avg>=90 and "A" or avg>=80 and "B" or avg>=70 and "C" 
      or avg>=60 and "D" or avg>=50 and "D" or "F" for avg in avgs])
  • zip(*iterable) 함수 : 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수
print(list(zip([1, 2, 3], [4, 5, 6])))

# 출력 
[(1, 4), (2, 5), (3, 6)]

# 2차원 배열 행렬 바꾸기 
list(map(list, zip(*scores)))

스프링 입문을 위한 자바 객체 지향의 원리와 이해 02

  • JVM 존재와 역할을 아는 것은 자바 개발 환경을 이해하는데 필수적
  • 소프트웨어 개발 도구 = JDK(Java Development Kit : 자바 개발 도구)
    운영체제 = JRE(Java Runtime Environment : 자바 실행 환경)
    하드웨어 - 물리적 컴퓨터 = JVM(Java Virtual Macgube : 자바 가상 기계)
    JDK를 이용해 개발된 프로그램은 JRE에 의해 가상 컴퓨터인 JVM에서 구동된다
    배포 편의를 위해 JDK가 JRE를 포함하고 다시 JRE는 JVM을 포함한다
  • JDK는 자바 소스 컴파일러 javac.exe를 포함하고 JRE는 자바 프로그램 실행기인 java.exe를 포함하고 있다.
  • 개발자가 본인의 OS용 JVM으로 프로그램을 작성하고 배포하면
    JVM이 중재자로서 각 플랫폼에서 프로그램을 구동하는 데 아무 문제가 없게끔 만들어준다 = Write Once Run Anywhere
  • 프로그램이 메모리를 사용하는 방식은 코드 실행 영역 + 데이터 저장 영역(static영역/stack영역/heap영역)
    - Static 영역 : 클래스들의 놀이터
    - Stack 영역 : 메서드들의 놀이터
    - Heap 영역 : 객체들의 놀이터
    일반 개발자가 코드 실행 영역을 깊게 할습할 필요는 없다
  • 절차적 프로그래밍 = goto를 사용하지 말자
  • 구조적 프로그래밍 = 함수를 써라 , 전역 변수보다는 지역 변수를 써라, 중복을 제거하고 논리를 분할하라
  • 자바의 절차적/구조적 프로그래밍 = 순서도와 제어문/메서드
  • 함수와 메서드 차이 : 함수는 클래스나 객체와 아무 관계가 없지만 메서드는 반드시 클래스 정의 안에 존재해야 한다
  • 예제
    public class Start {
    	public void static main(String[] args){
    		System.out.println("Hello OOP !!");
    	}
    }

JRE은 프로그램이 시작되는 시작점 main()메서드가 있는지 확인한다. main()메서드를 발견하면 JRE는 프로그램 실행을 위해 JVM을 부팅한다. 부팅된 JVM은 목적 파일을 받아 실행된다. JVM이 먼저 하는 일은 전처리 과정이다. 모든 자바 프로그램이 반드시 포함하는 java.lang 패키지를 static 영역에 가져다 놓는다. 그 다음 JVM은 개발자가 작성한 모든 import 패키지와 클래스들을 static 영역에 가져다 놓는다.
main() 메서드가 실행되기 위해서 stack frame이 스택 영역에 할당된다. (클래스를 정의하는 중괄호 빼고 다른 여는 중괄호를 만날 때마다 스택 프레임이 하나씩 생긴다, 여는 중괄호를 만났을 때 해당 메서드의 스택 프레임이 생기고 닫는 중괄호와 만났을 때 스택 프레임이 소멸된다. ) 그리고 메서드의 인자(args)를 저장할 수있는 변수 공간을 스택 프레임 맨 밑에 확보해야 한다. 이렇게 메모리를 구성하고 나서야 main() 메서드 안의 첫 명령문을 실행하게 된다
요약 ⇒ JRE은 JVM 자바 가상 기계를 부팅하고, JVM은 메모리 구조를 만들고 거기에 java.lang. 패키지와 각종 클래스 로딩, main() 메서드 스택 프레임 배치, 변수 공간 배치 등등의 일을 한다. main() 메서드가 끝나면 JRE는 JVM을 종료하고 JRE 자체도 운영체제 상의 메모리에서 사라진다. 그러면 T 메모리도 사라진다.

지역 변수와 메모리 : 스택 프레임에 갇혔어요 !

변수는 Static, Stack, Heap 영역 모두에 있는데 각각에 있는 변수는 각기 다른 목적을 가진다

  • 클래스 멤버 변수 : Static 영역에서 JVM이 종료될 때까지 있다
  • 지역 변수 : Stack 영역에 Stack frame 안에 있다. 해당 Stack frame에서만 사용할 수 있고 외부에서는 사용할 수 없다
  • 객체 멤버 변수 : Heap에 있다가 가비지 컬렉터라고 하는 힙 메모리 회수기에 의해 객체와 함께 제거된다.

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

public void ckass Start4{
	public static void main(String[] args){
		int k = 5;
		int m = squre(k);
	} 
	private static int square(int k){
		int result;
		k = 25;
		result = k;
		return result;
	}
}
  • square 메서드의 Stack frame에는 반환값을 저장할 변수 공간이 맨 아래, 그 다음으로 인자를 저장할 변수 공간, 마지막으로 메서드의 지역 변수가 자리 잡는다

  • 스택 프레임간 변수에 접근할 수 없다. 입력 값들(인자 리스트)과 반환값에 의해서만 메서드 사이에서 값이 전달될 뿐 서로 내부의 지역 변수를 볼 수 없다

전역 변수와 메모리 : 전역 변수 쓰지 말라니까요 !

  • 메서드 밖에서 선언된 변수는 메서드들 사이에서 공유해서 사용할 수 있는 전역 변수가 된다.
  • 스레드 안정성이 깨지기 때문에 가급적 쓰지 않는 것이 좋다

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

  • 멀티 스레드 : T 메모리 모델에서 스택 영역을 스레드 개수만큼 분할해서 사용
  • 멀티 프로세스 : 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조
  • 멀티 프로세스는 서로참조할 수 없고 멀티 스레드는 하나의 T 메모리만 사용하는데 스택 영역만 분할해서 사용하는 구조이기 때문에 다른 스레드의 스택 영역에 접근할 수는 없지만 Static영역과 Heap영역을 공유해서 사용한다
  • 멀티 스레드가 멀티 프로세스보다 메모리 사용량이 적다

기타

  • 필드 = 속성 = 프로퍼티
    함수 = 메서드 = 기능 = 행위

좋은 웹페이지 즐겨찾기