하드디스크 구조 및 CPU cache
ㄴ 설명은 아래 참조
ㄴ https://m.blog.naver.com/capemay/220221154613?view=img_4
ㄴ https://www.youtube.com/watch?v=yi0FhRqDJfo
ㄴ https://www.youtube.com/watch?v=oEORcCQ62nQ
ㄴ Primitive Data type(원시 데이터 타입) : byte, short, int, long, char, float, double, boolean
ㄴ Reference Data type(참조 데이터 타입) : 메모리의 시작 주소를 저장하는 데이터 타입
ㄴ Primitive Data type의 변수에 값 저장 시 2진수로 저장됨 (2의 보수 -> 부호있는 정수타입일 경우)
ㄴ Reference Data type의 변수에 값 저장 시 해당 객체의 메모리 주소가 2진수로 할당됨
java.util.Scanner
package com.eomcs.lang.ex99;
// 키보드 입력 받기 - System.in 과 java.util.Scanner
public class Exam0210 {
public static void main(String[] args) {
// 1) 키보드로 입력한 데이터를 읽을 때 사용할 도구를 준비
java.io.InputStream keyboard = System.in;
// 2) InputStream은 바이트 단위로 읽는 기능이 있음
// 바이트 단위로 읽어서 int나 문자열로 바꾸려면 또 코딩해야 하는 불편함이 있음
// 이런 불편함을 줄이기 위해 자바에서는 바이트를 개발자가 원하는 값으로 바꿔주는 기능이 들어 있는 도구를 제공
// 그 도구가 java.util.Scanner
// => 키보드를 스캐너에 연결
java.util.Scanner keyboardScanner = new java.util.Scanner(keyboard);
// print()는 문자열을 출력한 후 줄 바꿈을 하지 않는다.
System.out.print("팀명? ");
// nextLine()
// - Scanner 도구를 사용하여 키보드로부터 한 줄의 문자열을 가져올 때 사용하는 명령
// - 동작은?
// 사용자가 한 줄 입력할 때까지,즉 입력 데이터에 줄바꿈을 의미하는 0d0a 2바이트가 들어올 때까지 대기함
// 사용자가 엔터키를 누르면 입력값으로 0d0a 2바이트 값이 들어오고, nextLine()은 그 전까지 들어온 데이터를 문자열로 만들어 리턴
String str = keyboardScanner.nextLine();
// 사용자가 입력한 문자열을 출력
System.out.println(str);
// 스캐너는 사용 후 키보드와의 연결을 끊고 닫음
keyboardScanner.close();
}
}
// System.out
// - 표준 출력 장치
// - 즉 콘솔(모니터, 명령창)을 가리킴
// System.in
// - 표준 입력 장치
// - 즉 키보드를 가리킴
Scanner 와 배열, 반복문을 이용하여 여러 개의 데이터를 입력 받기
package bitcamp.myapp;
// 코드 본문에서 사용할 클래스가 어떤 패키지의 클래스인지 지정
import java.util.Scanner;
public class App {
public static void main(String[] args) {
System.out.println("나의 목록 관리 시스템");
System.out.println("-------------------------------");
// 키보드 스캐너 준비
Scanner scanner = new Scanner(System.in);
// java에서 []를 앞에 해주는 이유 : primitive type 변수가 아닌 레퍼런스(주소를 담는)라는 것을 알려줌
int[] no = new int[3];
String[] name = new String[3];
int[] age = new int[3];
boolean[] working = new boolean[3];
char[] gender = new char[3];
float[] leftEye = new float[3];
float[] rightEye = new float[3];
for (int count = 0; count < 3; count++) {
System.out.print("번호? ");
no[count] = scanner.nextInt();
System.out.print("이름? ");
name[count] = scanner.next();
System.out.print("나이? ");
age[count] = scanner.nextInt();
System.out.print("재직중(true/false)? ");
working[count] = scanner.nextBoolean();
System.out.print("성별(남:M, 여자:W)? ");
String str = scanner.next();
gender[count] = str.charAt(0);
System.out.print("시력(왼쪽, 오른쪽)? ");
leftEye[count] = scanner.nextFloat();
rightEye[count] = scanner.nextFloat();
// count++; // count += 1; // count = count + 1
}
System.out.println("--------------------------------------------");
for (int count = 0; count < 3; count++) {
System.out.printf("번호: %d\n", no[count]);
System.out.printf("이름: %s\n", name[count]);
System.out.printf("나이: %d\n", age[count]);
System.out.printf("재직자: %b\n", working[count]);
System.out.printf("성별(남자(M), 여자(W)) : %c\n", gender[count]);
System.out.printf("좌우시력: %.1f,%.1f\n", leftEye[count], rightEye[count]);
}
scanner.close();
}
}
ㄴ 프로젝트 전체 컴파일 => $gradle compileJava
ㄴ 컴파일 된 프로젝트 실행 => $java -cp app/build/classes/java/main bitcamp.myapp.App
배열 - 배열 레퍼런스와 배열 인스턴스
package com.eomcs.lang.ex04;
//# 배열 - 배열 레퍼런스와 배열 인스턴스
//
public class Exam0530 {
public static void main(String[] args) {
int[] arr1 = new int[5];
// 메모리의 주소를 보관하는 변수를 '레퍼런스(reference)'라 부름
// new 명령은 사용할 메모리를 확보하는 명령
// 리턴 값은 확보된 메모리의 시작 주소
arr1[0] = 100; // arr1에 저장된 주소로 찾아가서 0번째 항목에 값을 넣어라!
arr1[1] = 200; // arr1에 저장된 추소로 찾아가서 1번째 항목에 값을 넣어라!
System.out.println(arr1[0]);
System.out.println(arr1[1]);
}
}
[정리]
레퍼런스(reference)란?
ㄴ 값이 아닌 메모리의 주소를 담는 변수.
인스턴스(instance)란?
ㄴ 값을 저장하는 메모리.
package com.eomcs.lang.ex04;
//# 배열 - 배열 레퍼런스와 배열 인스턴스 III
public class Exam0550 {
public static void main(String[] args) {
int[] arr1;
arr1 = new int[5];
// 언제든 배열 인스턴스의 주소를 다른 레퍼런스에 담을 수 있음
int[] arr2 = arr1;
// arr2와 arr1은 같은 배열 인스턴스를 가리킴
arr2[0] = 100;
// arr2를 통해 값을 저장한 후, arr1을 통해 값을 꺼낼 수 있음
System.out.println(arr1[0]);
}
}
ㄴ arr2와 arr1은 같은 배열 인스턴스를 가리킴
ㄴ arr2를 통해 값을 저장한 후, arr1을 통해 값을 꺼낼 수 있음
Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit 오류 발생 이유
int[] arr3 = new int[2147483647]; // 실행 오류 => VM의 배열 크기 제한을 초과
// Exception in thread "main" java.lang.OutOfMemoryError: Requested array size
// exceeds VM limit
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 오류 해결
실행 오류 발생!
=> Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
=> JVM이 OS로부터 사용 허가를 받은 메모리 크기를 벗어났기 때문에 발생한 것
해결책?
=> JVM을 실행할 때 최대 힙(heap) 메모리의 크기를 늘리면 됨
=> JVM 실행 옵션에 다음을 추가하라!
- Xmx메모리크기
예) $ java -Xmx20000m ...
ㄴ compile 후 실행 시 추가해 넣는 것!
컴파일 => javac -d bin/main src/main/java/com/eomcs/lang/ex04/Exam0510.java
실행 => java -Xmx20000m -cp bin/main com.eomcs.lang.ex04.Exam0510
* java -Xmx20000m 명령
ㄴ Java 프로그램을 실행할 때 최대 힙 크기를 20,000 메가바이트 (20 기가바이트)로 설정하는 데 사용
ㄴ -Xmx 옵션은 JVM(Java 가상 머신)이 프로그램에 할당할 수 있는 최대 힙 크기를 지정하는 데 사용
ㄴ "X"는 "eXtended"를 나타내는 줄임말이며, "mx"는 "maximum"을 의미
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 9일차 (2023-06-02) 자바 기초 DAY7 (0) | 2023.06.02 |
---|---|
JAVA 7일차 (2023-05-31) 자바 기초 DAY5 (0) | 2023.05.31 |
JAVA 5일차 (2023-05-26) 자바 기초 DAY3 (0) | 2023.05.26 |
JAVA 4일차 (2023-05-25) 자바 기초 DAY2 (0) | 2023.05.26 |
JAVA 3일차 (2023-05-24) 자바 기초 DAY1 (0) | 2023.05.25 |