본문 바로가기

프로그래밍

Java의 기본 출력함수(print, printf)와 연산자

“Java와 함께하는“은 이제 그만하려구요 ㅠ

지난 번 변수얘기나 이런건 너무 상투적인 내용이 아니었나싶네요..

그래서 그냥 이제는 되는데로 생각나는 아무거나 해보려고 합니다!!!

아 맘편하네요.. 책의 목차를 크게 펼쳐놓고, 흥미가 가는 타겟으로 가서 읽고 연습하려고 합니다.

그냥 가지고 있는 책이나, 참고 교재에 있는 내용들에서

“이걸 해보면 옛날에 했던게 떠오를 것 같아!” 이런거 아무거나 찾아서 해보려고 합니다!

물론 출처는 밝힐 것이고 풀이는 정답이 없다고 생각하고, 제 방식대로 기술할 것입니다~

오늘은 도서관에서 빌려온 책입니다!


초보자를 위한 JAVA 200제
국내도서
저자 : 조효은
출판 : 정보문화사 2005.05.16
상세보기

이 책은 Java를 아주 초보적인 수준을 벗어난 사람이 보기 좋다고 해서 빌려봤습니다. 제가 빌려온 건 1판인데 2판도 나와있네요. Java버전은 5버전입니다. 왜인지 모르겠는데 가지고 있는 책들이 다 5버전이네요.. ㅠㅠ

아무튼 조금 읽어보니 이론에 대해서도 상당히 구체적으로 나와있으나 기본 용어에 대해서는 개인이 따로 찾아서 읽어야 될 것 같네요. 목차만 살짝봤는데 기억이 제대로 나는 것이 많지 않네요.

Part1에 기본연산과 출력이라는 내용이 있는데 이 문제를 한번 봐야겠습니다.. 기본 연산이라면 당연히 연산자 일 것 같군요.

연산 결과를 print와 printf로 출력해보자고 합니다. print나 printf는 C언어를 접해보신 분은 금방 익숙해질 것 같군요. 저자는 여기에 여러 가지 형태의 출력방법을 보여주고자 합니다.

책에 내용은 결과만 참조하고 문제해결은 직접해보도록 하겠습니다.

1. 다섯가지 연산자를 이용한 연산과 결과 출력하기

여기서 다섯가지란 +, -, /, *, %입니다. 다른 책은 쉬프트나 이런 것도 소개식으로 다뤘던 것 같은데, 이 책은 기초영역에서는 다루지 않아주는 군요. 그럼 아무거나 한번 계산을 하고 결과를 내보겠습니다. 우선 계획은 세울께요.

목적 : 다섯가지 연산자를 사용하면서 용도를 이해한다.

조건 : 출력할 연산에는 두 종류의 변수를 각각 2개만 사용(책은 총 12개를 썼지만 저는 줄이겠습니다)

조건을 충족하게 변수를 정하겠습니다. 저는 float형과 int형을 쓸께요. 선언부터해야죠


float은 초기화할 때 수치뒤에 f를 달아줘야 에러가 안납니다. f를 안붙였는데 소수를 갖는 숫자로 초기화 하게 되면 double형으로 인식해서 초기화 오류가 발생합니다.

이제 조건에 만족되었으니 출력해보겠습니다. 한 10개 정도 해보도록 하죠.


이렇게 작성했습니다. int형 끼리의 연산과 float형 끼리의 연산입니다. 코드 내용에 보면 변수끼리의 연산을 먼저 실행하도록 괄호를 표시했습니다. 이유는 Java는 +연산을 통해서 문자열을 이어주는 동작을 합니다. 그럼 괄호를 쳤을 때와 안쳤을 때를 비교해 보겠습니다. 여기서 괄호를 안치면 -연산자는 에러가 나므로 제외하고 진행하겠습니다.


   

괄호달았을 때                                 괄호제외했을 때

이렇게 나오네요. 일단 좌측은 모두 정상 연산이 되었습니다. 그럼 우측은 어떤가요? 우측의 +연산자 결과를 보시죠. 답이 이상합니다. +연산자가 우측에 있는 값들을 모두 문자열로 취급하면서 앞에 있는 문자열에 더해버린 것입니다. 보이는 그대로 1 : + 20 + 65 = 1 : 2065 이런 결과가 나오게 된 것입니다. 그럼 다른 *, / , %연산자가 멀쩡한 이유는 뭘까요? 이건 연산자 우선순위 때문입니다. 수학에서도 덧셈, 뺄셈에 괄호가 없다면 무조건 식에서 곱하기, 나누기 연산부터 진행하는 것처럼 말입니다. 그래서 아까 정상적인 연산결과를 원해서 각 연산에 괄호를 표시한 것이죠. 책에는 모두 연산을 따로 하고 그 결과를 담은 변수를 출력문에 넣는 식으로 했지만 저는 일일이 선언하기를 꺼려해서 이렇게 했습니다.

자 대강 간단히 진행했는데 여기서 또 의문이 하나 생깁니다. 다른 자료형의 연산은 어떻게 진행되는가? 이건 얘기만 할테니 직접해보시고 체감하시길 바랍니다.

다른 자료형의 연산

좌항과 우항이 연산하기 전에 비교를 하는데 좌항의 표현범위와 우항의 표현범위를 판단하는 겁니다. 한쪽이 더 큰 범위를 표현하는 변수형이라면 나머지항도 그 변수형에 맞춰서 casting이 발생하고, 결과도 casting된 자료형으로 결과가 나옵니다. 해보시면 아실 겁니다.

그리고 예외적인 것이 몇 가지가 있습니다.char형 등의 4Byte 미만의 연산인데 기본적으로 Java는 자료형이 char나 byte라고 하더라도 int형으로 형변환하여 연산을 진행합니다. char a = 'A' char b = 'B' 라고 할 때 연산 결과는 131이 나오게 됩니다. 변수에 대해서 자세히 알고 싶으시면 지난번 글에 연결된 링크들을 참조해주세요


그럼 이 책의 이 영역 마지막 문제를 풀어보도록 하겠습니다. printf의 사용인데요, pritf는 print format입니다. 인쇄할 형식을 사용자가 직접정할 수 있습니다. 기본형을 잠깐 보면

System.out.printf("Fomat형태")", Format에 사응하는 값 혹은 변수);

이렇게 됩니다. 실습해보겠습니다.

%d, %f, %c 이런게 나오고, 오른쪽에는 정수, 소수, 그리고 아까 선언한 int형 변수명이 있군요.

좌우가 쌍따옴표아래 콤마(,)로 구분됩니다. 각 자리에 짝이 맞게 들어가는 형태죠.

%d는 int를 받아서 출력하고, %f는 float형을 받아서 출력하고, %c 문자열 혹은 int형을 받아서 출력합니다. 결과는 이렇습니다.

int형과 float형 그리고 char형이 모두 잘 나왔습니다. 근데 아까 문자 출력위치에 매칭시킨건 int형인데 왜 문자가 나왔지? 이유는 int iB는 아까 65로 초기화 했는데 65를 매칭하는 곳에서 char형으로 받으면서 해당값을 갖고 ASCII문자표에서 대응하는 값을 찾아 나타낸 것입니다. 사실 문자들은 모두 정수형으로 표현할 수 있습니다. 나중에 쓸일이 많아질 꺼에요 ^^이제 printf도 형태를 봤으니 사용해보겠습니다.


2. 변수들을 여러형태로 출력해보고, 오늘 날짜를 가져와서 출력하라.

이 책이 왜 입문자가 보기에 안 좋은지 하나둘 거칠 때마다 알겠네요. 뜬금없이 import로 Java에서 기본 제공하는 util을 import하고 거기서 Calendar 클래스를 생성하여 생성된 클래스를 갖고 출력을 해본다. System.out.println()처럼 그냥 사용해보자라는게 하나 더 추가된 것 같아 당황했습니다. 알고 있는 것이 였지만, print알려니 또 하나가 나타났다고 생각할 것 같네요. 계획을 짜보죠

목적 : Calendar 객체를 이용한 날짜정보와 변수형을 printf를 이용해 출력해보자.

조건 : 출력대상은 5종류의 변수와 Calendar 클래스의 내용.

조건대로 선언하겠습니다.


아무리봐도 getInstance()가 거슬려서 자동완성의 설명확인!


읽어보면 대충 내용은 매개변수없이 호출시 Default locale의 Default Time으로 초기화 된 인스턴트가 생성된 답니다(선언해 놓은 class를 메모리에 올려서 실질적으로 사용하기위해 선언).

printf로 변수들을 출력하면서 생성된 인스턴스를 한번 확인하겠습니다.


이번에는 책에 있는 내용을 거의 그대로 했습니다. 결과를 보고 마져 적겠습니다.


결과가 나왔는데 이것을 토대로 포맷에 사용하는 기호들을 한번 정리해보겠습니다.

%d : int형과 long형을 받아서 출력, 실제로는 char형을 넣어도되는데 char형이 들어오면 ASCII코드 번호를 반환

%f, %a, %e, %g : float와 double형을 받아서 출력, 모두 실수형을 받아서 출력하지만 결과는 다릅니다. 사용용도에 따라 쓰시면 됩니다^^

%tm : 현재 날짜의 월을 표현

%th : 현재 월을 국가에 맞춰서 표현(영어권은 영어명칭으로 출력)

%ta : 현재 요일을 간단하게 표현

%tA : 현재 요일의 전체이름을 표현

%te : 현재 일을 간단하게 표현

%td : 현재 일을 한자리면 앞에 0을 채워서 표현

%ty : 현재 년도를 뒤에 두자리만 표현

%tY : 현재 년도를 네자리 모두 표현

%정수자리수.소수자리수f : 정수자리수를 정해준 숫자만큼의 공간을 할당해서 정수를 표현하는데 이보다 작으면 빈공간으로 채운다. 앞에 -가 붙으면 뒤에 채운다. 소수자리수도 .기준으로 뒤를 채운다.

자리수의 차이는 위에 결과를 보시면 알 수 있습니다.

1$ :가장 중요한 매칭할 대상이 format과 매칭하는 수가 적을 때 사용하면 효율적으로 한 개 데이터를 필요한 만큼 불러낼 수 있습니다. 앞에 1이 2가 되면 두 번째 매개변수를 뜻합니다.


이 책을 통해 기본 연산과 출력함수 print와 println을 사용해봤습니다. 나름 재밌네요.

예전에 감각이 점점 돌아오는 느낌이 들어서 기분이 좋습니다^^

좀더 이 책을 보면서 감을 찾아봐야겠네요.

긴 글 읽어주셔서 감사합니다 ^^ 가시는 길에 손가락 한번 눌러주시고 또 오세요~