자바를 잡아버려 (4)

지니·2022년 4월 30일
1

자바를 잡아버려!

목록 보기
4/4
post-thumbnail

저번 시간에는 배열을 이용하여 많은 데이터를 효과적으로 다루는법을 알아보았는데
이번장에서는 프로그램을 할때에 사용자와 상호작용 하는
사용자의 텍스트를 입력받아서 프로그램을 실행하는 방법을 배워보자

모니터 화면에 출력

프로그램도 결국은 컴퓨터가 어떤 일을 하고 어떤 일을 완료했는지 알려주어야한다 알려주는 일이 결국 출력이다 이전 프로그램에서는 System.out.println("hello"); 와 같이 화면에 출력하는 프로그램을 사용해 왔는데 이렇게 화면에 텍스트를 출력하는 방법에 대해서 자세히 살펴보자

System.out 이라는 클래스 안에는 여러 가지 출력을 위한 함수를 제공해준다 아래를 보자

  • System.out.println : 내용을 출력하고 자동 줄 바꿈 수행. 주로 한줄 쓰고 줄 바꿈을 하기떄문에 자주쓰임
  • System.out.print : 출력 후 줄 바꿈을 하지 않고 그 줄에서 계속 다른 출력 가능
  • System.out.printf : 출력할 떄 텍스트를 여러 가지 형태로 변환해서 출력 가능 예를 들어 숫자의 소수점 자릿수 조정 왼/오른쪽 정렬 등

예를 들어 name 이라는 string 변수에 문자열 "홍길동" 과 age 라는 int형 변수에 32 라는 값이 들어있는 경우를 생각해보자

소스 코드

String name = "홍길동";
		int age = 32;
		
		System.out.println("이름 :"+name+", 나이 :"+age);
		System.out.print("이름 :"+name+", 나이 :"+age);
		System.out.printf("이름 : %s, 나이 %d ",name,age);

실행 결과

이름 :홍길동, 나이 :32 	// println 문으로 출력후 자동 줄바꿈
이름 :홍길동, 나이 :32이름 : 홍길동, 나이 32 : 	// print 문이니 이어서 printf 문 출력

첫쨰 줄은 출력후 한줄을 자동 줄바꿈 해주었고 둘째 줄은 print문이나 사용했으니 줄바꿈하지 않고 이어서 printf 문이 출력된다 그럼 줄바꿈을 하지않는 print문이나 printf문은 줄바꿈을 못하는걸까? 그건 아니고 줄바꿈 문자를
넣어주면 줄바꿈을 해줄수가있다 뒤에 "\n" 만 붙혀주면 된다

printf 문은 포멧을 하여 출력을 하는데 사용예시와 출력패턴은 다음과 같다

서식문자출력형태사용 예시설명
%d정수%-3d정수를 3자리로 출력하고 왼쪽으로 정렬한다
%f실수%5.2f실수를 5자리로 출력하되 소수점 2째자리까지만 출력한다
%s문자열%s문자열을 출력한다
%c문자%c문자를 출력한다

소스 코드

System.out.printf("이름 : %s 나이 : %d ", name , age);
System.out.printf("나이 : |%-5d| ", age);
System.out.printf("나이 : |%5d| ", age);
System.out.printf("나이 : |%7.2f|\n", (double)age);

실행 결과

이름 : 홍길동 나이 : 32
 나이 : |32   |
 나이 : |   32|
 나이 : |  32.00|

위에 %-5d같은 거는 5칸에 정수인 32를 넣어주고 왼쪽으로 정렬하여 출력하라는거고
%7.2f 같은 경우는 소수점 부호로 1칸 32 로 2칸 비어있는 공백 2칸 으로 총 7칸으로 출력해준다

특수문자

"\n"같은 특수문자에 대해서 더 알아보자 일반 문자로 표현할수 없는 특수문자들은 "\"(백슬래쉬) 문자 뒤에 써서 나타낸다 이 방법을 이스케이프 시퀀스 라고 한다

escape sequence설명
\t탭문자
\b백스페이스
\n개행문자
\r커서를 맨 왼쪽으로 이동
\f새 페이지 처음으로 이동
\'작은따옴표
\"큰따옴표
\\ 백슬레쉬 문자를 출력할때

키보드로부터 문자 입력

화면 출력에 대해 알아보았으니 이제 사용자로부터 값을 입력받는 방법을 알아보자
출력은 System.out을 가지고 사용하였는데 사용자로부터 입력은 System.in에 사용자 입력값이 들어온다 이값을 활용하는 방법을 알아보자

사용자로부터 입력 받는 방법은 Scanner 라는 클래스를 이용한다 아래를 보자

소스 코드

import java.util.Scanner;

public class main {

	public static void main(String[] args) {
		
		Scanner imputReader = new Scanner(System.in);
		String strInput = InputReader.nextLine();
		System.out.println(strInput);
		
	}
}

실행 결과

123 abc def  // 내가 입력한 값
123 abc def  // 출력

Scanner를 사용하려면 Scanner를 사용하겠다고 우리 Java 한테 말을 해주어야 하는데
그래서 코드 맨 윗줄에 import java.util.Scanner; 를 입력 해준 것이다
이렇게 이미 만들어져있는 도구 같은거를 클래스 라고 부른다 그림을 그릴때 캔버스,붓,물감 등을 써야할텐데 그걸 하나하나 만들수는 없으니 Java에서 준비를 미리 해준 느낌

Scanner imputReader = new Scanner(System.in);Scanner라는 도구를 만들어
주고 입력해서 들어오는 값 (System.in)을 사용하기 위해서 만든다는 뜻이다

Scanner는 화면의 키보드 값이 아닌 파일의 내용이나 문자열 등을 처리하기위해서 사용할수도있다 위에 코드에서는 화면의 키보드 입력을 처리하도록 InputReader 라는 Scanner 변수를 만들어줘서 사용한다

String strInput = InputReader.nextLine(); 이제 입력되는 한줄을 읽기 위해 nextLine() 라는 메소드(함수)를 이용해서 한줄을 읽고 strInput이라는 변수에 한줄의 내용을 저장한다

Scanner 문자열 처리

Scanner에 입력 값으로 키보드 입력이 아닌 문자열을 가지고 처리하는 법을 먼저 익혀보자

소스 코드

import java.util.Scanner;

public class helloworld {

	public static void main(String[] args) {
		
		String strinput = "123 abc def";       // 문자열 생성
		Scanner sc  = new Scanner(strinput);      // strinput 에 스캐너 생성
		int a = sc.nextInt();					// 정수형 스캔
		String b = sc.next();					// 문자열 스캔
		
		boolean tf = sc.hasNext();					// true/false 스캔
		System.out.println("입력값이 있는가?:"+tf);	// 입력값 체크
		String c = null;							
		if(tf) {									// 뭔가 다른방법으로 문자열 스캔
			c=sc.next();
		}
		System.out.println("첫번쨰:"+a);					
		System.out.println("두번쨰:"+b);			// 스캔한거 출력
		System.out.println("세번쨰:"+c);
		
		boolean tf2 = sc.hasNext();						// true/false 스캔
		System.out.println("입력값이 또 있는가:"+tf2);		// 입력값 체크
		
	}	
}

실행 결과

입력값이 있는가?:true
첫번쨰:123
두번쨰:abc
세번쨰:def
입력값이 또 있는가:false

nextint()는 정수 숫자를 읽어서 가져오는 메소드 이고 next() 는 문자열을 읽어서 가져온다 실수를 읽는 메소드는 nextDouble()이다 읽어오는 방식은 입력된 문자열 "123 abc def" 에서 빈공백으로 띄어져 있는 부분을 구분하여 한번씩 읽어온다 hasNext()는 메소드가 읽어올 입력값이 남아있는지 확인해준다 2번쨰 abc 를 읽을때까지는 hasNext()가 true 를 반환하지만 def 까지 읽어오고 나서는false를 반환한다

Scanner의 메소드를 정리하자면 아래와 같다

Scanner의 메소드들수행 기능
nextLIne()한줄 전체 읽기
next()String 읽기
nextBoolean()true/false 읽기
nextLong()long 정수 읽기
nextint()int 정수 읽기
nextDouble()double 실수 읽기
nextFloat()float 실수 읽기

Scanner 파일 처리

Scanner로 파일을 읽어와서 출력하는 프로그램도 만들수있다 차이가 있다면 Scanner(file source) 형태로 입력값이 파일이라는 차이만 있다고 보면 된다 아래를 보자

내 컴퓨터 c드라이버에 tmp라는 폴더를 만들고 a.txt 파일을 메모장으로 적어 넣어놨다 그걸 불러오는 코드다

소스 코드

import java.io.File;
import java.io.FileNotFoundException;         // 클래스 생성
import java.util.Scanner;

public class helloworld {

	public static void main(String[] args) throws FileNotFoundException {

		File file = new File("c:\\tmp\\a.txt");           // 파일 위치
		Scanner sc = new Scanner(file, "UTF-8");			// 파일 스캔
		
		while (sc.hasNext()) {
			System.out.println(sc.next());				// 파일 출력 근데 왜 반복문을 쓸까?
		}
	}	
}

파일을 사용하기 위해서 Java 에서 만들어 둔 몇가지 클래스가 더 필요해서 아래 3가지 클래스를 import 해주었다

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

그리고 위에 public static void main(String[] args) throws FileNotFoundException 처럼 main 부분에 일부 변화가 생겼는데 이건 책에서 걍 나중에 알려준다고 하고 중요한 부분은 Scanner sc = new Scanner(file, "UTF-8"); 처럼 Scanner의 입력을 파일로 한다는 부분이다 뒤에 추가된 "UTF-8" 부분은 파일의 입력된 글자의 character set(문자 집합)이 UTF-8 이라고 지정해준 부분이다 파일이 어떤 문자세트로 저장되어있는지 알려주어야 Java가 제대로 파일을 읽어올수있기 떄문이다

실행 결과

abc
def

사용자 입력을 처리하는 덧셈 계산기

우리가 만들고자 하는 계산기는 지금까지 배운 지식을 써서 계산기다운 프로그램을 만들어 보는 것이다 사용자가 직접 입력한 값에 따라 사칙연산을 수행하는 계산기를 만들어 볼것인데 우선 먼저 2개의 값을 입력받아서 덧셈을 수행하는 계산기를 만들어보자

앞에서 배웠던 사용자로부터 값을 입력 받는 방법을 이용해보자 Java에서 준비해준 도구들이 굉장히 많은데
그것들을 하나하나 익혀가다 보면 어느새 중급 개발자가 될수있을것이다 마치 영어단어를 하나씩 배워가는 것과
비슷하다 보면 된다

소스 코드

import java.util.Scanner;             // 클래스 생성

public class helloworld {

	public static void main(String[] args) {

		
		Scanner sc = new Scanner(System.in);        // 스캔할거 고르기
		int i = sc.nextInt();						// 정수1 스캔
		int j = sc.nextInt();						// 정수2 스캔
		int z = i + j ;							// 정수 1,2 더한거
		System.out.println(z);					// 출력
		
		}
	}	

실행 결과

14
8
22

제대로 모습을 갖춘 사칙연산 계산기

위에 덧셈 계산기를 업그레이드해서 덧셈 뿐 아니라 사칙연산을 수행하는 계산기를 만들어보자 그렇게 되려면 사칙연산 부호 (+ - * /)를 추가로 넣어줘야한다 부호는 숫자가 아닌 문자이기 떄문에 문자를 입력받는 Scanner의 기능을 이용해야 한다

앞에 덧셈계산기 처럼 숫자만 따로따로 입력하는게 아니라 부호랑 같이 이어서 입력해야하기 때문에 nextInt()가 아니라 Next()를 이용해 주어야 한다

그런데 Next()는 한 문자를 입력 받는게 아니라 공백으로 분리된 한 단어 를 입력받는 명령어라서
문자열 인 String 변수로 값이 입력되기 때문에 String에 조금 조작을 해주어야 한다

그니까 3*23은 정수라서 int 고 2도 int 인데 *는 문자니까 이새끼만 next로 조지는데 숫자랑 붙어있으니까 떨어뜨려서 저장하겠다는 소리다 책에선 ㅈ나 이해하기 힘들게 써놨다

소스 코드

import java.util.Scanner;

public class helloworld {

	public static void main(String[] args) {

		System.out.println("계산할 값 입력:");
		Scanner sc = new Scanner(System.in);        // 사용자 입력값 받기
		int i = sc.nextInt();
		char c = sc.next().charAt(0);				// 사칙연산 부호만 따로 받기
		int j = sc.nextInt();
		
		int z = 0;
		
		if (c == '+') {									
			z = i + j;
		}
		else if (c == '-') {
			z = i - j;
		}
		else if (c == '*') {						// 연산
			z = i * j;
		}
		else if (c == '/') {
			z = i / j;
		}
		System.out.println(z);
		}
	}	

실행 결과

계산할 값 입력:
3 * 2
6

이제 73장 까지 밀어봤는데 요번 단원은 양도 많고 이해도 어려워서 뒤질거같았다
배운걸 응용할수있어야하는데 왜 이렇게 써있는지 이해하기도 급급헀다...
원래 빡세게 집중하면 하루 안에 끝낼수있겠지만 거진 일주일 동안 질질 끌어버리고..
사람살려

profile
대충 살고싶다

0개의 댓글