자바 기초 프로그래밍 2일차

awarduuu·2023년 3월 3일
0

230303

복습

switch - case문은 break로 조건문이 빠져나오지 못하면 참인 조건에서 빠져나오지 못하고, 아래 조건문까지 실행된다. 따라서 break를 잘 사용해야 한다!

int a = 100;
switch(a/10){
case 10 : 
case 9 : System.out.print("A");
case 8 : System.out.print("B");
default : System.out.print("F");
}

// 출력 : ABF

출력의 기본 마인드
항상 행 먼저 : 좌 -> 우
그 다음 열 : 상 -> 하


배열

하나의 이름으로 방을 나눠서(index) 여러개의 값을 저장 할 수 있다.

  • 한가지 타입만 가능
  • 객체이다 (반드시 생성해서 사용한다.) -> new로 생성
  • 배열의 길이는 배열이름.length
  • 배열의 index는 0부터 시작

배열 생성 방법

// 정수형 5개 저장하는 배열
//1. 자료형 이름 [] = new 자료형 [길이];
int arr [] = new int [5];

//2. 자료형 [] 이름 = new 자료형 [길이];
int [] arr = new int [5];

//3. 자료형 [] 이름 = new 자료형 []{값,값 ~};
int [] arr = new int []{1,2,3,4,5};

//4. 자료형 [] 이름 = {값};
int [] arr = {1,2,3,4,5};

배열 조회 방법

// 길이는 먼저 계산
int len = arr.length;
for(int i=0; i < len; i++){
	System.out.println(arr[i]);
}

개선된 for문으로 조회


// for (타입 변수명 : 반복 대상 배열){
//}

for(int i : arr){
	System.out.println(i);
}

데이터의 0에 준하는 초기값

  • 정수형 : 0
  • 실수형 : 0.0
  • 논리형 : false
  • 문자형 : '\u0000', 공백
  • Object type : null

2차원 배열

2차원 배열 생성 방법

// 3행 5열 저장하는 배열
//1. 자료형 이름 [][] = new 자료형 [행][열];
int arr [][] = new int [3][5];

//2. 자료형 [][] 이름 = new 자료형 [행][열];
int [][] arr = new int [3][5];

//3. 자료형 [][] 이름 = new 자료형 [][]{값,값 ~};
int [][] arr = new int [3][5]{1,2,3,4,5};

//4. 자료형 [][] 이름 = {값};
int [][] arr = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};

2차원 배열의 길이

  • arr.lenth : arr 행의 길이
  • arr[index].length : index 행 배열의 길이

Scanner

모니터 출력 = 화면 출력 => System.out ----> java.io.OutputStream
키보드 입력 = 입력 => System.in ----> java.io.InputStream

java.util.Scanner

  • 파일, 입력스트림등에서 데이터를 읽어 구분자로 토큰화하고
    다앙한 타입으로 형변환 하여 리턴해주는 클래스
  • 입력 스트림을 다루는 방법을 몰라도 손쉽게 입력처리 가능
  • 데이터 형변환으로 인한 편리함
  • 대량의 데이터 처리 시 수행시간 비효율적인 단점 => 적은 양의 데이터를 입력받아올 때 유용

Scanner(File source)
Scanner(InputStream source)
Scanner(String source)
Scanner(File source)

※ 오버로딩 : 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다. Scanner의 경우 생성자 오버로딩

숫자를 입력받을 때

int no = xx.nextInt(); //개행문자("\n") 무시

문자를 입력받을 때

String data = xx.next();  //공백없이 문자열 : 개행문자("\n") 무시

String data = xx.nextLine(); //공백이 있는 문자열 경우 : 개행문자("\n") 읽어들임

※문자열은 캐스팅이 불가하다! (문자열은 객체이기 때문)

문자열 형 변환

문자열 -> 숫자 변환
Integer.parseInt(String s)
숫자 -> 문자열 변환
Integer.toString(int i)

숫자와 문자를 모두 받는 경우

sc.nextLine()으로 모두 받아오고 나서 형변환을 해주는 것이 깔끔하다

Scanner sc = new Scanner(System.in);
System.out.print("국어 점수는 : ");
int kor = Integer.parseInt(sc.nextLine()); // \n까지 읽으니 buffer에 남은게 없다
		
System.out.print("영어 점수는 : ");
int eng = Integer.parseInt(sc.nextLine());
		
System.out.print("이름은 : ");
String name = sc.nextLine();

IO

  • 한 바이트씩 읽기 위해 InputStream 사용
  • 한 문자씩 읽기 위해 InputStream을 Reader 변환 (byte 단위 --> 문자 단위로 변환)
  • 최종 : 한 줄씩 읽기 위한 입출력 속도향상을 높이기 위한 Buffered 필요
//1
InputStream is = System.in;
System.out.print("입력 = ");

//2
InputStreamReader isr = new InputStreamReader(is);

//3	
BufferedReader br = new BufferedReader(isr);
String data = br.readLine();
System.out.println(data);

System.currentTimeMillis()

현재 시간과 UTC(협정세계시)인 1970년 1월 1일 자정과의 차이로 밀리세컨드(1/1000초) 값을 반환

System.nanoTime()

작동중인 JVM의 정밀한 시간 소스의 현재 값을 long타입으로 나노세컨드(1/1_000_000_000초)를 반환

결론

시스템의 시간을 사용하기 위해서나 오늘 날짜를 알아내기 위해서는
System.currentTimeMillis()를 사용
개발한 프로그램의 성능 측정을 위해 나노초로 정밀하게 구간 시간 측정을 위해서는
System.nanoTime()를 사용


Scanner Vs IO

많은 양의 데이터가 들어는 경우 Bufferd를 활용한 IO방식이 Scanner 방식보다 빠른 성능을 보여준다.

public class ScannerVsIOExam {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		ScannerVsIOExam se = new ScannerVsIOExam();
		
		
		System.out.println("1. Scanner -------------------");
		se.test(); //0.033
		
		
		System.out.println("2. IO -------------------");
		se.test2(); // 0.012
	}
	
//	Scanner로 읽기
	public void test()throws Exception {
		System.setIn(new FileInputStream("src/day02/input.txt"));
		Scanner sc = new Scanner(System.in);
		
		long start = System.nanoTime();
		
		while(sc.hasNext()) {
			String data = sc.nextLine();
			System.out.println(data);	
		}
		
		long end = System.nanoTime();
		
		System.out.print((end-start)/1_000_000_000.0+"s");
		
	}
	
//	IO로 읽기
	public void test2() throws Exception{
		BufferedReader br = new BufferedReader(new FileReader("src/day02/input.txt"));
		
		String data;
		
		long start = System.nanoTime();
		
		while((data = br.readLine()) != null) {
			System.out.println(data);
		}
		
		long end = System.nanoTime();
		
		System.out.print((end-start)/1_000_000_000.0+"s");
		
	}

}

profile
선한 영향력을 만드는 개발자

0개의 댓글