SturdyCobble's Study Note

[프로그래밍] 2.4 기본 입출력(1) 본문

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

[프로그래밍] 2.4 기본 입출력(1)

StudyingCobble 2019. 7. 14. 19:32

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

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


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

 

 저번 글에서 변수가 값을 대입하고 간단한 연산까지 해보았는데요, 이 값을 출력하고, 또한 새로운 값을 입력받는 방법에 대해 알아보겠습니다. 특히 간단한 콘솔 화면에서의 입출력에 대해서만 알아보겠습니다. 먼저, 출력부터 알아보겠습니다.

 

 C언어부터 알아보자면, printf, puts 등의 함수들이 있으며, 이는 stdio.h라는 헤더 파일에 저장되어 있습니다. 헤더 파일 이름 뜻도, 표준(Standard) 입출력(Input&Output)입니다. 가장 간단하게 문자열만 출력하는 경우 아래와 같이 합니다.

 

#include<stdio.h>

int main(){
	printf("Hello.\n Nice to meet you.\n");
	return 0;
}
#include<stdio.h>

int main(){
	puts("Hello.\n Nice to meet you.");
	return 0;
}

위의 두 코드는 결과적으로 동일한 결과를 나타냅니다. 단순히 문자열만 출력하는 경우, 두 함수 모두 비슷하게 사용하면 되지만, puts의 경우 마지막에 자동으로 개행(New Line)을 해준다는 점에서 차이가 있습니다.

 

 또는 문자열을 저장하는 변수의 값만을 출력한다면, 아래와 코드를 작성해볼 수 있습니다.(간단하게 표시하기 위해 #include부분과 main함수의 괄호 등을 생략하였으나, 실제로는 위의 문자열 출력 예시와 같이 main함수 내에 넣어서 작성하셔야 합니다.)

char str1[] = "Hello";


printf(str1);
puts(str1);
printf(str1);


-----------------------------출력 결과-------------------------
HelloHello
Hello
--------------------------------------------------------------

 

만약, 문자 하나만을 출력한다면 putchar함수를 사용할 수도 있습니다. 그 외 여러가지 함수가 출력 버퍼 사용 여부 등에 따라 있지만은, 이 부분은 나중에 다루도록 하겠습니다. (사용방법은 puts와 동일합니다.)

 

 만약 변수에 들어있는 값을 다른 값과 함께, 또는 다양한 형식으로 출력한다면,  printf함수는 아래와 같이 사용해야 합니다. 

int a = 2019;
printf("Year : %d\n",a);
char b[] = "Sun";
printf("It's %sday.\n",b);

여기서 %+(문자)로 표시된 부분에 자동으로 뒤에 컴마로 구분된 변수값이 표시된다고 보면 됩니다. 이때 %d는 정수형, %s는 문자열을 나타냅니다. 이렇게 주어진 변수의 값을 특정 서식에 맞춰 표시해주는 이러한 문자열을 서식문자열(format string) 또는 그냥 서식 문자, 또는 서식 지정자(format specifier)이라고 부릅니다. 이에 대해서는 한번에 다시 다루겠습니다.

 

 관찰력이 좋으신 분이라면 위에 한글이 하나도 코드 내에 없다는 것을 발견하실 것입니다. 이는, printf가 char*형 문자열만을 가져오기 때문입니다. 저번에 다루었듯이 char형은 1 Byte로 한글을 표현하기엔 역부족입니다. 그렇기에 wchar_t를 사용해야 합니다.

 

 하지만, 이마저도 홀로 쓰이는 경우 문제를 해결할 수 없기도 한데, 2 Byte라는 한계 상 영어와 한글 정도만 표현할 수 있기에, 지역 설정을 해주어야 한글을 쓸 수 있습니다. 따라서 첫번째 예시를 wchar_t로 표현하면 아래와 같이 나타내야 합니다.

 

 

여기서 printf대신 wprintf, puts대신 _putws를 사용했습니다. (L을 붙여 wchar_t형임을 표시하는 것을 잊지 마세요!) 또한, 한국어를 사용한다는 것을 알리기 위해 #include<locale.h>와 _wsetlocale(LC_ALL,L"korean");부분이 추가되었음도 기억해야 합니다.

#include<stdio.h>
#include <locale.h>
int main(){
	_wsetlocale(LC_ALL,L"korean");
	wprintf(L"Hello.\n Nice to meet you.\n");
	return 0;
}
#include<stdio.h>
#include <locale.h>

int main(){
	_wsetlocale(LC_ALL,L"korean");
	_putws(L"Hello.\n Nice to meet you.");
	return 0;
}

다른 언어의 문자까지 섞어서 사용한다면, 훨씬 더 복잡하므로 여기까지만 소개하겠습니다. (이는 다른 언어라면 큰 문제가 되지 않습니다.)

 

 

 C언어에서 기본적인 입출력만 다루었는데도 너무 할 말이 많았네요. 하지만, 다른 언어는 보다 간편한 입출력 방식을 지원합니다.

 먼저 Java부터 보겠습니다.

public class HelloWorld {
  public static void main(String[] args) {
    System.out.printf("Hello, World\n");

    System.out.print("Hello, World\n");

    System.out.println("Hello, World");

  }
}

 같은 결과를 출력하는 세 식입니다. print로 끝나는 것은 개행없이 그냥 출력하고, printf로 쓰인 것도 마찬가지지만, C언어와 마찬가지로 서식문자로 포맷팅할 수 있습니다. 마지막 println은 print line의 의미로 자동으로 개행합니다. 이 중, println이 가장 자주 사용되는 듯합니다.(적어도 초보 자바 강의에서는 말이죠)

 

println에서 변수 값을 출력하려면 다음과 같이 하면 됩니다.

public class HelloWorld {
  public static void main(String[] args) {
    int a = 3;
    String str1 = "World";
    System.out.println("Hello, "+str1+a);
  }
}

단순히 +로 더해주는 것만으로도 알아서 타입을 인식해서 연결해줍니다. 위의 예시의 경우 아래의 값을 출력할 것입니다.

-------------------출력 결과---------------------
Hello, World3
------------------------------------------------

 

여기서 문자열을 숫자와 그냥 더할 수 있다는 점에서 커다란 차이가 보이는데요, 문자열과 숫자를 더하는 경우 알아서 숫자를 적당히 문자열로 변환한 뒤, 문자열과 더해줍니다. 이때 문자열 간의 덧셈이 문자열 간의 연결로 정의된다는 점이 C언어와 차이가 나는 점이라 할 수 있습니다. 이는 Python에서도 마찬가지로 나타납니다. 문자열간 덧셈이 가능합니다.(심지어는 Python에서는 문자열에 숫자를 곱하는 것도 가능한데, 이는 나중에 한번에 다루겠습니다.)

 

 

 그 다음은 C++입니다. C++의 대표적인 입출력함수는 iostream이라는 헤더파일에 정의됩니다. 아래와 같이 문자열을 출력합니다.

#include <iostream>
using namespace std;

int main() {

    string str1 = "HelloWorld";
    int a = 2999;

    cout << str1 << endl;
    cout << "I love you" << " " << a+1;
    return 0;
}

독특한 형태지만, 사용하는 방식은 간단합니다. cout << 다음에 문자열 또는 변수 이름을 쓰고 <<을 계속 이어나가면 됩니다. 그러면 순서대로 공백없이 출력됩니다. 개행을 하기 위해선 마지막에 endl을 쓰면 됩니다.  위 코드의 출력 결과는 아래와 같습니다.

--------------출력 결과---------------
HelloWorld
I love you 3000
-------------------------------------

 

마지막으로 Python입니다. 매우 간단합니다.

a = 3000
print("I love you 3000")
print("I love you %d"%a)
print("I love you",a)
print("I love you {0}".format(a))
print("I","love","you","3000")
print("I ","love ","you ","3000",sep="")
print("I love you 3000\n",end="")

print함수라는 기본 함수가 있고, I love you 3000(+개행)을 표시하기 위해서는 위와 같은 코드들이 가능합니다. 그냥 ""으로 출력할 수도 있고, %d, 즉 서식 문자를 이용하되 C언어의 printf와는 다르게 ""뒤에 %(변수이름)과 같이 붙이는 경우도 가능합니다. 또한, 서식문자로 {}를 사용할 수도 있는데, 이 부분은 이글의 뒷부분에서 다시 다루겠습니다.

 

 만약 인수를 여러개 준 경우 그 사이에 자동으로 띄어쓰기를 하며, print함수는 자동으로 마지막에 개행을 해줍니다. 주어진 변수의 자료형에 따라서 알아서 값을 출력하게 할수도 있습니다. 물론 Java처럼 문자열을 더하는 식도 가능하죠.

 

 또한, 인수 사이를 구분하는 문자를 변경하려면 sep="(구분 문자)"와 같이 하면 되며, 마지막 개행을 없애거나 다른 문자로 바꾸고 싶다면 end="(마지막으로 추가하는 문자)"와 같이 하시면 됩니다.

 

 

 

마지막으로 서식문자를 소개하겠습니다. 서식문자는 C언어의 printf에서는 printf("문자열 %d %d %d문자열",a,b,c);와 같이 하면 순서대로 뒤의 컴마로 구분된 변수의 값이 지정된 서식을 따라 대입되게 됩니다. 예시를 참고해봅시다.(앞으로 main함수 바깥 부분 및 return 구문(C언어), main메소드 바깥 부분 및 return 구문(Java) 등 기본적인 코드는 편의상 자주 생략하도록 하겠습니다.)

 

printf("%c %s %d",'I',"Love you",3000);
---------------출력 결과-------------------
I love you 3000
------------------------------------------

 

 Python에서는 이와는 다르게 "문자열 %d %d %d"%(a,b,c)와 같이 문자열을 서식문자로 나타내는게 가능하며, 뒤에 %를 붙이고 (변수1, 변수2,...)와 같이 순서대로 지정합니다. 그리고 변수를 지정하지 않으면 "%d"라 써도 %d라는 문자열로 표시됩니다. 예시를 참고해보세요.

str1 = "%d%%"%(7) + "7%" + "7%%"
print(str1)
---------------출력 결과-------------------
7%7%7%%
------------------------------------------

 대표적인 서식문자는 다음과 같은 것들이 있습니다. 참고로 문자 '%'를 쓰려면 %%로 쓰면 됩니다. 진하게 표시된 영역은 Python도 공통인 부분입니다. 추가적인 내용은 Microsoft Docs를 참고해보세요. 표 자체는 C/C++입니다.

 

형식 문자 인수 비고
d 또는 i 정수  
o (8진수)정수  
u (부호없는 10진수) 정수  
x 또는 X (16진수)정수 %x는 abcdef를 사용하며,
%X는 ABCDEF를 사용합니다.
e 또는 E (지수 표현)부동 소수점 %e는 지수 형식으로 1.2000e2와 같이 표시합니다.
역시 대문자는 e대신 E를 씁니다.
f 또는 F 부동 소수점 1234.45와 같이 표시합니다.
INF(무한대),NAN(숫자가 아님) 값을 대문자로 표시하려면 대문자, 소문자로 하려면 소문자입니다.
g 부동 소수점 f또는 e중 간단한 것을 택합니다.
G 부동 소수점 f와 E중 간단한 것을 택합니다.
p 포인터(16진수 주소로 표시)  
s 문자열(char *)  
S 문자열(wchar_t *)  
c 문자(char)  
C 문자(wchar_t)  

 

추가적으로 좀더 다양한 서식을 나타내려면, Flag, Width, Precision, Size 등을 지정하는 방법이 있습니다.  % [flags][width][.precision][size]type의 형태로 나타내며, type은 위에서 본 형태이고, width는 문자열또는 숫자를 출력할 때의 너비입니다. 즉, 'a'를 '    a'로 표시할지를 나타내는 것입니다. 출력된 값 사이의 간격을 일정하게 유지하려면 필요한 옵션입니다. 정수라면 앞에 0을 붙여야할수도 있는데 그 경우 %03d와 같이 지정하면, 004와 같이 너비를 맞추되 0을 추가하여 너비를 맞춥니다.(반대로 넘어간다 해서 지우지는 않습니다.) 예시를 봐봅시다.

 

[Python]

print("%4s%4s%4s"%('a',"ab","abc"))

--------------------------------출력----------------------
   a  ab abc
----------------------------------------------------------

 

만약 너비를 변수로 두고 싶으면 숫자대신 *을 두면 그 앞에온 정수형 인수를 가져다가 사용합니다.(int형)

 

[Python]

print("%0*d"%(4,3))

--------------------------------출력----------------------
0003
----------------------------------------------------------

 

Precision은 %.2s와 같이 표시되며, 문자열의 경우 표시할 문자열 길이를, 실수의 경우 소수점 아래 숫자의 수, 정수의 경우 최소로 표현할 숫자의 길이를 나타냅니다.(아니면 0으로 채움)

 

Flag의 경우 여러가지 서식을 지정합니다. 대표적인 플래그들은 다음 표를 참고해보세요.

 

플래그 설명
-

좌측 정렬입니다.

%-3c%는 'a'를 'a  '로 표현합니다. 기본은 우측입니다.

+ 부호를 강제로 붙입니다. (숫자)

 

size는 인수의 크기를 나타내는 서식으로 C/C++에서 사용되는 대표적인 인수 크기에 대한 접두사는 다음과 같습니다.

인수 크기 접두사
char hh
short h
long L(또는 l)
long long LL(또는 ll)
__int32 I32 (Int의 I임에 주의하세요!)
__int64 I64

 

 또한, {}로 서식을 지정할 수도 있는데, {0}, {1}, {2}, ...으로 사용하면, 각각 첫번째, 두번째, 세번째, ... 로 변수가 대응되게 됩니다. 즉, 반복적으로 쓸 때 간편합니다. 아니면 {}와 같이 하여 순서대로 대응되게 할수도 있고, {이름}과 같이 써서 이름을 붙이는 것도 가능합니다. 물론 복잡한 서식도 지정가능하지만, 이 부분은 생략하겠습니다. 아래 예시를 참고해보세요. 

a = 3000
b = 2000
print("I love you {0} {1} {0}".format(a,b))
print("I love you {삼천}".format(삼천=a))

(한글로 코드를 짜는 걸 권장드리지는 않지만, 가독성을 위해서 사용했습니다.)

 

결과는 다음과 같습니다.

I love you 3000 2000 3000
I love you 3000

 

 

Comments