IT/BaekJoon

[백준/JAVA] 10926번. ??! 문제 - Scanner 클래스와 Next 메소드 설명

Buang 2022. 11. 20. 12:53
반응형

1. 문제

https://www.acmicpc.net/problem/10926

 

10926번: ??!

준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때

www.acmicpc.net

 

 

문자열을 입력받은 뒤

입력받은 문자열 뒤에 ?!! 를 붙여서 출력하는 문제다.

 

예를 들어서 '김부엉'이란 문자열을 입력했다고 한다면

'김부엉?!!' 으로 출력 되도록 하면 된다.


2. 정답

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
 
		Scanner scan = new Scanner(System.in);
		
		String questionMark = "??!";
		String name = scan.next();
		
		scan.close();
		
		System.out.println(name + questionMark);
		
	
	}
}

3. 풀이

 

위의 프로그램을 만들기 위해선 문자(혹은 숫자)를 읽는 클래스인 Scanner와

Scanner의 메소드인 next 메소드를 사용해야 한다.

 

Scanner 객체를 생성하고 next 메소드에 사용법에 대해 알고 있어야 하는 문제라

하단에선 이에 대해 설명하고자 한다.

 

* 잠깐! next 함수가 아닌 next 메소드라고 부르는 이유가 궁금하다면?

아래 '더보기'를 클릭해 주세요!

더보기

 

자바에선 메소드와 함수를 구분하지 않고,

보통 함수를 메소드라고 부른다.

 

자바 외의 파이썬의 경우 메소드와 함수를 구분해서 부르기도 한다.

 

클래스에 포함되는 함수는 메소드라 부르고

클래스에 포함되지 않고 독립적으로 사용되는 함수는 함수라 부른다.

 

public static void ADD (int a, int b) { //ADD 함수 선언
	retrun a + b;
}

class에 포함되지 않은 함수는 위와 같은 형태다.

ADD란 이름의 함수가 독립적으로 존재한 모습이니

ADD는 ADD 메소드라 부르지 않고 ADD 함수라 부른다.

 

그렇다면 클래스 안에 포함된 함수 형태는 어떤 모습일까?

 

class Math { //Math 란 이름의 class가 있다.

	public static void ADD (int a, int b) { //class 안에 ADD라는 함수가 있다.
      	return a + b;
    }
}

 

문법적으로 좀 이상하지만 그건 뒤로하고

위에처럼 Math란 이름의 class 안에

ADD란 이름의 함수가 있다면, 즉 class 안에 함수가 있을 경우엔

ADD를 ADD 메소드라고 부른다.

왜냐하면 ADD 함수는 class에 종속되는 함수고

class에 종속되는 함수는 메소드라 부른다고 위에서 말했기 때문이다. 

 

 


 

3-1. Scanner 클래스의 next 메소드

 

scanner라는 클래스 안에는

next란 메소드가 있다.

 

위의 문제에서 사용자의 아이디를 입력받아야 한다고 했었다.

자바에서 입력을 받을 때 사용하는 메소드인 next 를 사용하면 된다.

 

next 메소드는 입력을 받는 메소드로 

하나의 문자나 하나의 문자열을 입력받는 메소드다.

 

여기서 문자는 a나 p 같은 알파벳을 예로 들 수 있다.

문자열은 문자의 조합으로

apple 혹은 banana가 문자열의 예가 될 수 있다.

 

문자가 아닌 정수를 입력받을 때는 nextInt

실수를 입력받을 때는 nextDouble 메소드를 사용한다.

 

일단 여기서 중요한 건

문자나 문자열을 입력받을 땐 next 메소드란 걸 쓰는구나!이다.

 

 


3-2. Scanner &  next 메소드 사용법

 

Scanner 클래스에 포함된

next 메소드를 사용하기 위해선 아래와 같은 절차가 필요하다.

 

 

1. Scanner를 호출한다.

2. Scanner 객체를 생성한다.

3. next 메소드를 사용한다.

 


1. Scanner 호출

import java.util.Scanner;

 

첫 번째 Scanner를 호출하는 구문은 위와 같다.

 

Scanner를 호출하는 이유는 우리가 곧 사용할 next 메소드가 Scanner 안에 있기 때문이다.

Scanner 앞에 java.util이 있는데 Scanner란 클래스는

java.util란 패키지 안에 있기 때문이다.

 

위의 한 줄은

java.util란 패키지 안에서 Scanner란 클래스를 꺼내와줘!가 될 것이다.

위의 말이 이해가 잘 안 간다면

마트(java.util)에서 모든 과일(Scanner)을 다 사와줘!

라고 비유를 덧대어서 생각해보자. 

 

 

2. Scanner 객체 생성

 

Scanner scan = new Scanner(System.in);

 

1) 객채 형식

 

Scanner란 클래스를 사용하기 위해선 객체 생성을 해줘야 한다.

 

객체가 무엇인지 궁금하다면?

하단의 '더보기'를 클릭해 주세요!

 

더보기

객체는 '수술 기구'를 생각하면 이해하기 쉽다.

 

수술 기구는 종류가 다양한데

가위처럼 생긴 수술 기구만 해도

'클램프', '디버', '웨잇레이너', '모스키토' 등이 있다.

 

위의 수술기구는 가위와 비슷하지만 쓰임새가 다르다.

적절한 상황에 적절한 수술 기구를 사용해야 하는 상황에서

의사가 집도 중에 갑자기 '가위 주세요.'라고 말하면

수술 기구를 전달해주는 사람은 혼란스러운 낯을 띄울 것이다.

 

"선생님. 가위처럼 생긴 수술 기구가 많은데 어떤 걸 드릴까요."

 

 

 

 

클래스를 사용하기 위해선 '객체'를 생성해줘야 한다.

 

객체는 이름 붙이기와 비슷하다.

 

 

 

객체를 생성하는 방법은 아래와 같다.

 

[클래스이름] [객체이름] = new [클래스이름](System.in);

 

우리는 사용할 클래스가 Scanner니

[클래스이름]에 들어가는 건 Scanner가 될 것이다.

 

 

2) 객체 이름

 

[객체이름]에는 본인 마음대로 작성하면 된다.

Scanner 클래스의 객체이름으론 scan이나 sc가 많이 쓰여서

나는 scan으로 객체이름을 정했다.

 

 

3) System.in

 

new Scanner 옆에 괄호로 System.in이 보일 것이다.

 

"나 입력을 받을 건데 키보드로 입력을 받을 예정이야" 를 나타낸다.

입력을 키보드로 받지, 다른 걸로 받을 수도 있나?란 생각을 할 수도 있다.

입력은 파일로도 받을 수 있다.

 

지금은 키보드를 통해 입력을 받을 예정이라

System.in이라고 써놓았다.

 

 


3. next 메소드 사용

 

1) next와 nextLine 차이점

 

위에서 next 메소드가 문자나 문자열을 입력받는 메소드라고 했었다.

아이디는 보통 공백없는 문자열 형태이기 때문에

여기선 문자열을 입력받는 next 메소드를 사용하는 게 맞다.

 

next 메소드 대신 nextLine 메소드를 사용해도 정답인데

나는 next 메소드를 사용하는 게 적절하다고 생각한다.

 

왜냐하면 위의 문제에서 아이디를 입력받아야 한다고 했고,

아이디는 보통 공백을 포함하지 문자열이다.

 

아이디의 형태가 applebanana 일 수는 있어도

apple banna 처럼 중간에 띄어쓰기가 들어가진 않는다.

 

next 메소드의 경우 applebanana를 입력받았을 때

이를 출력하면 applebanana가 출력되나

공백이 포함된 apple banana를 입력하게 되면

출력할 때 banana는 빠지고 apple만 출력된다.

 

반면에 nextLine 메소드는

applebanana를 입력하면 applebanana가 출력되고

띄어쓰기가 있는 apple banana를 입력해도

apple banana 전체가 출력된다는 차이점을 가지고 있다.

 

 

String name = scan.next();

 

 

2) next 메소드 사용법

 

next 메소드를 사용한다고 했을 때

위의 코드처럼 next 메소드 앞에 Scanner의 객체명인 scan을 작성한 뒤

next 메소드를 작성한다.

 

위에처럼 작성하면 문자열을 입력받고

그 입력받은 문자열을 name이란 변수에 반환하게 된다.

 

내가 김부엉을 입력했다면 name이란 변수에 김부엉이란 문자열을 넘겨주는 것이다.

 

Scanner scan = new Scanner(System.in);
		
	String name = scan.next();
	String questionMark = "??!";

	scan.close();

 

3)  scan.close();

 

위의 코드 맨 하단을 보면 scan.close()가 보일 것이다.

scan.close()를 왜 쓴지에 대한 설명은 조금 길어서

궁금하신 분들께선 하단의 '더보기'를 클릭해 주시면 감사할 듯 하다.

 

더보기

 

마지막에 scan.close()를 사용한 게 보인다.

이걸 왜 쓰는지 궁금할 수 있다.

 

close는 '반찬 뚜껑닫기'고 생각하면 된다.

우리가 밥 먹을 때 반찬 뚜껑을 연 뒤에 반찬을 먹는다.

그리고 밥을 다 먹었으면 반찬 뚜껑을 닫아줘야 한다.

뚜껑을 닫지 않고 열어놓은 채로 냉장고로 직행하면

음식이 금방 상할 것이다.

 

자바에서도 마찬가지다.

현재 우리는 키보드를 통해서 숫자 3이나 4와 같은

정수를 입력 받을 수 있도록 해줬다.

 

이러한 입력은 키보드가 아닌 파일을 통해서

입력을 해줄 수도 있는데 파일의 경우

 

1) 파일을 열어서

2) 파일 안에 있는 내용을 사용한 다음

3) 열었던 파일을 반드시 닫아주는

 

순차적인 작업이 필요하다.

반찬 뚜껑 안 닫을 때 음식이 잘 상하듯이 파일을 연 뒤에

닫아주지 않으면 파일이 손상될 수 있다.

 

혹시라도 키보드가 아닌 파일을 통해서 입력받을 경우

열었던 파일을 닫아주기 위해 마지막에 close()를 작성하는 것이다.

귀찮아도 작성하는 습관을 들여놓는 게 좋다.

 

 

최종

 

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
 
		Scanner scan = new Scanner(System.in);
		
		String name = scan.next();
		String questionMark = "??!";

		scan.close();
		
		System.out.println(name + questionMark);
		
	
	}
}

 

 

최종적으로 Scanner 클래스 호출(import)하고

Scanner 클래스의 객체를 생성하고

문자열을 입력받고 반환하는 next 함수를 사용해서

위의 코드를 짜보았다.

 

이렇게 정리하고 보니

간단해 보여도 참 많은 개념이 들어간 코드란 생각이 든다.

반응형