본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 6일차 (2023-05-30) 자바 기초 DAY4

by prometedor 2023. 5. 30.

하드디스크 구조 및 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"을 의미