본문 바로가기

별걸다하는 IT/프로그래밍언어

[C, Java] Hello World 출력, printf 출력 함수 서식과 포맷, 소수점 자리 지정법, 채우기

[ C/ C++ / Java] 프로그래밍 기초 목차편!

안녕하세요~! 프로그래밍 기초편 포스팅을 시작해봅시다 ㅎㅎ

저번시간에 개발할 수 있는 개발환경을 다 설치했으니 간단한 프로그램을 작성해봐야겠죠 ㅎㅎ

//C / C++ 경우 
#include <stdio.h> 
int main(void) 
{ 
	printf("Hello World!"); 
    return 0; 
} 
//자바 Java의 경우 
class Main { 
	public static void main(String args[]){ 
    	System.out.printf("Hello World!"); 
    } 
}

이렇게 작성해주고 Ctrl + F5를 눌러서 프로그램을 빌드해봅시다. 이클립스의 경우에는 Ctrl+F11!

[Visual Studio] C / C++ 언어 예시 창
[Eclipse] Java 예시 실행창

오!!실행하자마자 콘솔창이 뜨면서 Hello World!가 출력됐어요 ㅎㅎ

여기서 알 수 있는 점은 C, C++의 printf함수와 자바의 System.out.printf 함수는 글씨를 출력해준다는거죠~~

참고로 자바에서 f를 뺀 print함수는 그냥 서식 없이 문자열 그대로를 출력할 때 사용합니다.

 

printf 함수란 ?

기본적인 C언어 출력함수예요. ()안에 들어 있는 내용을 출력 서식에 맞춰서 출력해줍니당.

여기서 f는 formatted의 약자예요! 내가 원하는 형태로 출력하기 위해 여러 서식과 포맷을 지정할 수 있다는 거죠 ㅎㅎ 한 번 알아보까요?

 

기본적인 사용방법

예를 들어 우리가 "11"을 입력하면, 컴퓨터는 방금 들어온 이 데이터가 문자열인지, 숫자인지 구분하지 못해요! 그래서 우리가 출력하려는 이 친구는 숫자야!! 이렇게 지정을 해줘야 합니다. 여기서 우리가 자주 사용하는 10진수 형태 숫자는 %d 이므로, 아래처럼 출력 서식에 맞춰서 코드를 작성해줘야 합니다.

printf("%d", 11); //C의 경우
System.out.printf("%d", 11); //자바의 경우
출력: 11
printf("화면에 보여질 숫자는 %d입니다., 11 ); //C의 경우
System.out.printf("화면에 보여질 숫자는 %d입니다., 11); //자바의 경우
출력: 화면에 보여질 숫자는 11입니다.

예시에서 알 수 있듯이

printf의 첫번째 인자에는 출력할 문구가 서식과 함께 들어갑니다. 서식이 없는 경우에는 그대로 출력을 하고, 서식을 만나면 두 번째 인자 값을 대입해서 보여줍니다.

 

개행 입력법

참고로 개행(엔터, 한줄 띄어쓰기)는 '\n'을 입력해주면 됩니다.

printf("\n\n 안녕하세요 ");

출력결과: 안녕하세요 전에 두 번 개행이 들어감

다양한 출력 서식을 적용하고 싶을 경우?

[C/C++ 비주얼스튜디오]
Java 이클립스

출력값: 몰랑이의 코딩성적은 100이야

(참고로 여기서 String 타입이나 name[] 이와 같은 배열 형식은 차차 자세히 배울겁니다. 현재는 문자열을 저장하기 위해 사용되었다 정도로 이해하시면 완벽!)

 

printf의 서식과 포맷

고럼 이제 서식과 포맷을 알고 다양하게 표현해보는 연습을 해봅시다.

 

서식

변환 문자열

의미

%d

10진수 형태로 출력

%o

8진수 형태로 출력

%x

16진수 형태로 출력

%f

실수 (소수점 형식) 형태로 출력

%e 

실수 (지수 형식) 형태로 출력

%g

%f와 %e중 짧고 보기 좋은 형태로 출력

%c

값에 대응하는 문자 (char)

%s

문자열

%p

포인터의 주소 값 (나중에 차차 알게 될 것)

 

%c vs %s

여기서 %c와 %s 차이를 잘 모르실 수 있습니다.

%c는 character의 약자로, 한 글자!를 말해요!! 하나의 문자!!

보통 하나의 문자는 작은 따옴표로 표현합니다.

printf("%c", 'a'); //OK
printf("%c", "a"); //ERROR
printf("%s", "a"); OK

%s는 string 즉 문자열을 의미합니다. 한 문자가 하나 이상으로 묶여진 상태로 양쪽에 큰따옴표 ("")를 이용해 문자열을 감싸서 표현합니다.

 

%f 출력

소수를 한 번 출력해볼게요

//C & C++
#include <stdio.h>
int main(void)
{
    float pi = 3.14;  //3.14도 되고 3.14f도 됨
    printf("%f", pi);
    return 0;
}
//Java
import java.util.*;
class Main {
    public static void main(String[] args)
         float pi = 3.14f; //Java의 경우 C언어와 다르게 뒤에 f를 명시해줘야 해요. 생략안됨
         System.out.printf("%f", pi);
    }
}

출력결과: 3.140000

 

포맷 FORMAT

그런데~!! 나는 3.140000이거 말고 3.14만 갖고 싶어 소수점 뒤에 쓸데없는 0은 없앨 수 없나요??

내가 원하는 포맷이 아니예요~! 그래서 포맷 형식 문법이 따로 있습니다.

 

자리수 지정 방법

◈ % [자리수] [서식]

//자바일 경우 앞에 System.out.을 붙여주세요!
printf("자리수 지정을 안했을 경우 왼쪽 정렬\n");
printf("%d\n",1); 
printf("%d\n",10);
printf("%d\n",100);
printf("%d\n",1000);

printf("자리수 지정을 했을 경우 오른쪽 정렬\n");
printf("%5d\n",1);
printf("%5d\n",10);
printf("%5d\n",100);
printf("%5d\n",1000);

 

 

참고로 \n은 개행이야요~

서식 앞에 자리수가 오면 총 출력 폭을 지정한다는 뜻입니다. (예시에서는 총 출력 폭이 5이고 남은 공간만큼 빈 공간을 두었네요)

 

 

 

 

 

플래그 지정 방법

근데 공백이 싫고 0으로 채우고 싶어!! 이럴수도 있겠죠? 그래서 이렇게 특별 지정을 위한 플래그를 설정해줄 수 있습니다.

◈ % [플래그] [자리수] [서식]

플래그

설명

-

왼쪽 정렬

+

양수일 때는 +부호, 음수일 때는 -부호 출력

공백

양수일 때는 부호를 출력하지 않고 공백으로 표시, 음수일때는 -부호 출력

#

진법에 맞게 숫자 앞에 0, 0x, 0X를 붙입니다.

0

출력하는 폭의 남는 공간에 0으로 채웁니다.

 

▶ 플래그가 0일 때 - 공백 대신 0으로 채우기 

//Java일 경우 System.out.printf("%05d\n, 1);
printf("%05d\n",1);
printf("%05d\n",10);
printf("%05d\n",100);
printf("%05d\n",1000);

결과

▶ 플래그가 공백일 때 - 음수일 경우 (-) 부호 표시하기

▶ 플래그가 플러스(+)일 때 - 플마 부호 표시하기

printf("% d\n",10);
printf("% d\n",-10);
printf("% 5d\n",10);
printf("% 5d\n",-10);
printf("%+5d\n",100);
printf("%+5d\n",-100);

 

결과

▶ 플래그가 마이너스(-)일 때 - 왼쪽 정렬

참고로 이렇게 오른쪽으로 가있는게 싫으면 앞에 -플래그를 통해 왼쪽정렬을 해줄 수 있습니다.

printf("%-5d\n",10);
printf("%-5d\n",100);
printf("%-+5d\n",100);
printf("%-+5d\n",-100);

 

정밀도 지정 방법

이제 우리가 궁금하던 실수 즉 소수점 자리 지정하는 방법으로 넘어가볼게요

실수의 자유로운 정밀도 표현을 위해서 정밀도 포맷을 제공하고 있답니다!

실수를 출력하는 %f나 %e는 정밀도를 지정할 수 있습니당

◈ % [플래그] [자리수] [.정밀도] [서식]

float pi = 3.141592f;
printf("%.1f\n",pi);
printf("%.2f\n",pi);
printf("%.2e\n",pi); //지수
printf("%.3f\n",pi);

 

 

4번째 결과를 보면

3.1415492..가 반올림되서 3.142가 된 것을 알 수 있습니다.

즉 해당 자리수까지 출력을 원하면, 버림이 아니라 반올림이라는 것!

 

 

 

#include <stdio.h>
int main()
{
	char name[] = "12345";
	printf("%.3s\n", name);
	printf("%.4s\n", name);
	printf("%.5s\n", name);
	printf("%.6s\n", name);
	return 0;
}

정밀도를 문자열에서 사용하면 원하는 자리만큼 지정해서 출력할 수 있습니다 

 

복합적으로 사용해보기

다양하게 연습하면서 손에 익혀줍시당

printf("%010.3f\n", 3.141592f); //출력 폭은10칸, 소수 셋째 자리까지 출력하는데 남은 공간은 0으로!
//결과: 000003.142

 

보면 알겠지만, 소수를 표현하는데 들어가는 점(.)도 한 칸으로 계산됩니다.

printf("%010c\n", 'a'); //출력 폭을 10칸으로 지정하고 남은 공간을 0으로 채우기 
//결과: 000000000a

 

★[특정 길이만큼 출력] 

printf("%.*s\n", str_len, str);

문자열을 잘라서 앞에 몇 자리만 보여주고 싶을 때 사용하는 방법이예요.

str을 str_len길이만큼 출력한다!

 

마무리하며,, 타입 지정에 대해

왜 C언어 출력함수는 편하게 자동으로 타입 변한을 해주지 않는가.

파이썬이나, ruby나 자바스크립트나 다른 프로그래밍 함수를 먼저 다루고 나서 C/C++/Java를 하시는 분들도 계실거예요. 저 위의 경우 언어들은 변수를 선언하거나 출력을 하는데 타입을 굳이 지정해줄 필요가 없답니다.

그래서 처음 접하시는 분들은 '번거롭다'라고 느낄 수 있어요.

 

안보이는 것 뿐...

사실 다른 언어도 다 타입 지정이 필요합니다. 타입 없이 메모리에 저장하는 건 불가능해요. 타입이 메모리 할당에 관한 정보(데이터 크기)를 갖고 있기 때문이죠. 메모리에 관한 이유도 있지만, 사용성에 대한 이유도 존재합니다. 수인지를 알아야 더하기 뺄셈 등등을 할 수 있는거고, 즉, 내가 3+5를 그대로 "3+5"로 출력하고 싶은건지, 3+5를 수행한 결과 값인 8을 출력해주고 싶은건지 등..

 

타입지정 vs 타입추론

사실 타입 지정을 필요로 하지 않는 언어는 안하는 게 아니라, 컴파일러가 몰래 내부적으로 다 이 작업을 수행해줍니다. 그래서 우리가 모르고 편하게 사용할 수 있던 거~ 이걸 타입추론이라고 합니다.

한 예로 소문자를 대문자로 변환해주는 함수가 있다고 합시다 . Uppercase()라고 대충 정할게요.

그러면 Uppercase(alpha)의 인자인 alpha는 당연히 문자열이겠죠. 이렇게 추론해서 문자열이라고 자동으로 내부적으로 얘네가 타입을 지정해주는거죠 ㅎㅎ

타입추론이든 타입지정이든 결국 타입은 다 있다!!

 

그리고 이와 같이 타입추론해주는 많은 언어들이 사실 C언어로 만들어졌습니다. 사실 이런 작업도 다 C가 아랫단에서 돌아가고 있는거죠~! 한 예로 파이썬, 펄, 리눅스, Java등등 모두 C언어 베이스로 만들어졌다는거~!!

 

C언어

'C언어는 가장 원칙적이고 하드웨어에 가까이 다가갈 수 있는 언어입니다.'

C언어는 이렇게 지정해줘야 하는게 많기 때문에 흔히 STRICT한 언어라고 표현을 합니다.

C언어는 하드웨어를 다룰 수 있는 즉 메모리에 직접 접근이 가능한 언어입니다. 이러한 특성 덕에 우리가 사용하고 있는 윈도우즈 운영체제 역시 C언어로 만들어졌어요 ㅎㅎ 그래서 다양한 언어들이 C로 만들어지기도 하고 코어엔진의 경우 대부분 C로 만들기도 하는 이유입니다.

자바가 C언어가 많은 부분 겹치고, 그로 인해 같이 튜토리얼을 할 수 있는 이유가 되기도 하지요 ㅎㅎ

오늘은 여기까지이~!! 공감, 댓글, 광고보답 항상 감사드립니당 :) 모두 즐거운 주말되세요ㅎㅎ