SturdyCobble's Study Note

[프로그래밍] 2.5 기본 입출력(2) 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 2.5 기본 입출력(2)

StudyingCobble 2019. 7. 15. 22:28

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

 

 이번 글에서는 입력 방법에 대해 알아보겠습니다.

 

 먼저, C언어의 경우 scanf함수로 입력을 받을 수 있으며, 그 외 gets, getchar등의 함수들이 있습니다. 일단 scanf함수부터 그 사용법을 알아보겠습니다. (아래에서 int a=0, b=0;과 같이 쓰는 것은 문법적으로 전혀 문제가 없으나 조금 불편하시다면 따로 초기화하셔도 좋습니다.)

int a = 0, b = 0;
scanf("%d %d",&a,&b);
printf("%d %d",a,b)

printf를 다룰 때 보았던 서식 문자를 똑같이 사용할 수 있습니다. 위 예시의 경우 실행 후 어떤 숫자를 입력한 뒤, 뛰어쓰기를 하거나 엔터를 누른 뒤 새로운 숫자를 입력하고 엔터를 누르면 입력한 두 값을 출력하게 됩니다.  아래는 위 예시의 출력 결과로 처음 두 숫자는 입력 값입니다.

--------------------------------------------
3
4
3 4
---------------------OR---------------------
3 4
3 4
--------------------------------------------

 여기서 printf와는 다르게 변수이름에 &을 붙이는 데, 이는 변수의 주소를 함수에 전달해줘서 값을 변수의 주소에 보내준다고 생각하면 됩니다. 문자열을 입력하는 경우는 약간 다릅니다.

char str1[20];
scanf("%s",str1);
printf("%s",str1);

이 경우 str1이라는 20자의 문자를 담을 수 있는 변수를 만들어 주었습니다. 입력을 받을 때, str1에 &기호가 없는 것을 보실 수 있는데요, 이는 str1자체가 그 변수의 주소를 담고 있기 때문입니다. 이에 대해 나중에 다시 언급하겠습니다. 이 예제를 실행하고, Hello Everyone을 입력하고 엔터를 누르면 아래의 결과를 얻을 수 있습니다.

-----------------------------------------
Hello Everyone
Hello
-----------------------------------------

공백을 기준으로도 구분하기 때문에, Hello만 입력되었습니다. 만약 문장을 입력받고 싶다면, gets함수를 쓰면 됩니다.

char str1[20];
gets(str1);
printf("%s",str1);

결과는 다음과 같습니다.

-----------------------------------------
Hello Everyone
Hello Everyone
-----------------------------------------

문자만을 입력받는 getchar는 다음과 같이 이용합니다.

char ch1 = 'a';
ch1 = getchar();

변수 이름을 앞에 써주는 것이 위의 두 함수와 다릅니다. 그러나 역시 입력하고 엔터를 누르는 점은 동일합니다.

 그 외, wchar_t형과 관련된 wscanf, _getws등의 함수도 존재합니다.

 

 

C++은 좀 단순한 입력 방법을 제공합니다.

int a = 0, b = 0;
cin >> a >> b;
cout << a << b;

두 함수의 <<방향이 다름에만 주의한다면, 서식에 관계없이 쉽게 입력받을 수 있습니다.

 

일반적인 순서라면 Java를 먼저 다뤘겠지만, Python먼저 입력 방식을 소개하겠습니다. 매우 간단하며, 직관적이고, Python 3기준으로 문자열형으로 입력을 받습니다.(숫자든 문자열이든)

str1 = input()

입력한 값으로 문자열 변수를 초기화하는 코드입니다. 만약 숫자등 다른 형태로 입력을 받고 싶다면, 아래와 같이 하시면 됩니다. 이렇게 형태를 바꾸는 연산자에 대해서도 나중에 한번에 다루도록 하겠습니다.

num1 = int(input())
realNum1 = float(input())

 

Java는 별도의 간편한 입력 함수가 있지 않습니다. 당연할 수도 있는 것이, 콘솔 환경에서 입력을 받을 일이 많이 없고, 받더라도 문법을 익히기 위한 용도이기 때문입니다.(다른 언어도 마찬가지 일 것입니다.) 그렇기에 대부분의 Java 강의를 온라인에서 찾아보면 입력은 나중에 소개하는 경우가 많습니다. 하지만, 여러 언어를 함께 소개하는 이 글의 특성상 간략하게 소개하겠습니다.

 

import java.util.Scanner;

public class HelloWorld {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int num1 = scan.nextInt();
    String str1 = scan.next();
    String str2 = scan.nextLine();
    System.out.println("출력 결과:"+num1+"/"+str1+"/"+str2);
  }
}

 일단 첫 줄에 import로 시작하는 문장이 삽입되었는데요, C언어의 #include와 같이 파일을 포함한다는 정도만 알아두면 될 것같습니다.(실제론 여러 면에서 다르지만, 일단 추후 다시 설명하겠습니다.)

 

Scanner로 시작하는 문장은 입력을 받을 Scanne 클래스의 객체를 만드는 것인데, 우리는 이 내용을 이용만 할 것이므로, 일단 생략하겠습니다. 그 다음, scan.next()와 같이 값을 입력받는 데요, 각 문장의 의미를 해석하면 아래와 같습니다.

int num1 = scan.nextInt();  Int형으로 한 단어만큼을 저장(다른 자료형도 가능)
String str1 = scan.next(); 한 단어 만큼을 추가로 가져옴
String str2 = scan.nextLine(); 한 문장을 통째로 가져옴

위 프로그램의 실제 실행결과는 아래와 같습니다. 

----------------실행 1----------------
1 2 3 4 5 6 7 8
출력 결과:1/2/ 3 4 5 6 7 8
----------------실행 2----------------
1 2
출력 결과:1/2/
----------------실행 3----------------
1
2 3 4 5 6 7 8
출력 결과:1/2/ 3 4 5 6 7 8
--------------------------------------

실행1의 결과는 이해하기 쉬운데요, 실행 2는 약간 의문이 드실지도 모르겠습니다. 정확히는 실행 2에서는 문자열 ""가 대입되어 대입이 이루어지지 않은 것처럼 보일 뿐입니다. 두 개 변수에 값을 대입하고 문장을 받을 차례인데, 엔터키가 입력되어 " "도 아닌 ""가 입력된 것입니다.

 더 심화된 내용은 개략적으로 설명하는 이 글의 특성상 생략하겠지만, 인터넷에 찾아보면 다양한 자료가 나오니 참고하시길 바랍니다.

 

참고로 위 코드에서 경고가 뜰 수 있지만,(Scanner가 close되어야 한다는 내용입니다.) scan.close();를 마지막에 넣으셔도 되고, 아니면 굳이 하지 않아도 현재 입출력 수준에서는 큰 문제는 되지 않을 것으로 보입니다.

Comments