CodeOnWeb
Hanyang ERICA
Log in

산술 연산과 변수

Lee Woosuk 2018/09/10, 19:57

CSE2016 프로그램 설계 방법론

실습 목표

  1. 산술 연산과 변수 사용 이해
  2. 데이터 유형 (type)과 유형 변환 (type conversion) 이해

이 장에서는 숫자나 문자열 데이터 를 입력 받아 처리한 후 결과를 텍스트 형태로 출력하는 간단한 프로그램을 작성하는 데 필요한 자바의 기본 요소들을 다룬다.

변수

우리 일상 생활에서 변수에 비유할 수 있는 예를 들어보자. 한 대학생이 용돈 100,000원
과 식권 20장을 가지고 한 달을 시작한다고 가정하자. 그렇다면 그가 가지고 있는 용돈과
식권의 수는 사용하면서 변하게 된다. 그가 용돈과 식권의 수를 기록할 때 단지 숫자만 적
지 않고 숫자가 의미하는 것을 같이 적는다. 예를 들면 특정한 날에 그가 가진 용돈과 식
권의 수를 다음과 같이 기록할 수 있다.

  • 용돈 72000
  • 식권 12

이 경우 숫자 앞에 쓴 단어가 숫자가 냐타내는 것의 의미를 나타낸다. 이 단어가 프로그램
에서 변수에 해당된다고 볼 수 있다.

프로그램에서 변수는 숫자나 문자와 같은 데이터를 저장하기 위해 사용된다. 변수는 일종
의 데이터를 담는 용기라고 볼 수 있다. 변수에 저장되 어 있는 값은 프로그램 실행 시 바뀔
수 있다.
다음 프로그램은 주어진 섭씨 온도를 화씨 온도로 바꾸어 준다. 이 프로그램에서
celsiusValue와 fah renheitValue리-는 변수를 시용한다. 그 프로그램이 실행될 때 다음
문은 celsiusValue라는 변수에 27이 라는 값을 저장한다.

자바에서 변수는 메모리 공간으로 구현된다. 각 변수에 하나의 메모리 공간이 배정된다. 변
수에 값이 주어질 때 그 값은 이진수로 변환되어 변수에 배정된 메모리 공간에 저장된다.
프로그램에서 변수를 어떻게 선언하고 사용하는지를 알아보자. 모든 변수는 데이터 유형,
이름과 범위를 가지고 있다. 변수의 데이터 유형은 저장할 수 있는 값들과 적용할 수 있는
연산들을 상술한다. 변수의 이름은 프로그램 에서 변수의 값을 언급하는 수단이며 변수 값
이 저장되는 메모라내의 공간에 대한 이름을 나타낸다. 변수 선언의 위치에 따라 그 변수
가 프로그램 내에서 유효한 범위가 결정된다. 변수의 범위에 관한 자세한 내용은 추후에
다룬다.

변수 이름

변수 이름은 식별지- 중의 하나이다. 따라서 식별자에 적용되는 규칙틀이 그대로 적용된다.
그 규직들은 다음과 같다.

  • 변수 이름은 알파뱃 문자들, 아라비아 숫자들(0부터 9), _와 $ 문자 중에서 선택된 문
    자들의 나열이다.

  • 변수 이름은 숫자로 시작될 수 없다. 또한 예약어를 변수 이름으로 사용할 수 없다.

  • 변수 이름의 길이에는 제한이 없다.

  • 변수 이름에서 대문자와 소문자는 구별된다. 예를 들면 name와 NAME은 서로 다른
    변수 이름이다.

잘못된 변수 이름들의 예는 다음과 같다.

  • lstnumber - 변수 이름이 숫자로 시작되었다.
  • Student-number - 붙입표(-)는 변수 이름에 사용될 수 없다.
  • Account Number 변수 이름에 빈 칸이 있어서는 안 된다.

변수 이름에 적용되는 규칙은 추후에 다루어지는 상수 메소드 클래스 객체와 배열의 이
름에도 그대로 적용된다.
변수 이름은 저장하는 데이터를 잘 나타내야 한다. 예를 들면 학생들의 수를 저정승{기 위
해 변수를 사용한다면 변수 이름으로 count를 사용하면 적절하나 X를 사용하면 부적절하
다.X라는 변수 이름이 학생들의 수를 나타낸다고 연상되 지 않기 때문이다.

예약어

예약어는 자바 언어에서 특별하게 정의된 의미로 사용되는 단어이다. 따라서 변수, 클래
스와 객제와 같은 식별자의 이름으로 사용할 수 없다. 자바의 모든 예약어는 다음과 같다:

  • abstract assert boolean break byte
    case catch char class const
    continue default do double else
    enum ex!ends false final finally
    float for goto implements
    Import instanceof Int interface long
    natlve new null package pnvate
    protected public return short statlc
    strictfp super switch synchronized this
    throw throws translent true try
    void volatile while

변수의 선언

모든 변수는 사용되기 전에 선언되어야 한다. 변수 선언은 변수의 이름과 저장할 데이 터의
유형을 기술한다. 변수를 선언하는 방법은 데이터 유형 다음에 변수 이름을 적는 것이다.
예를 들면 다음 코드는 변수 선언문의 예이다.

int celsiusValue;
double fahrenheitValue;

첫 번째 선언문에서 celsi us Val ue라는 변수는 int 형 정수 값이 저장되는 메모라내의 공
간에 대한 이름이다. 두 번째 선언문에 서 fahrenheitValue라는 변수는 double 헝 실수
값이 저장되는 메모리 내 의 공간에 대한 이름이다.

같은 유형을 갖는 여러 변수들을 한 선언문에서 동시에 선언할 수 있다. 예를 들면

int age, grade;

또한 변수를 선언할 때 초기 값을 줄 수 있다. 예를 들면

int count = 0;
double total = 0.0;
double average = 96.2;

첫 번째 선언문은 count라는 int 형 변수를 선언히면서 초기 값으로 0을 준다.

변수의 선언문은 보통 클래스나 메 소드 뭄체의 맨 앞 부분에 놓는다.
프로그램 내 의 다른 곳에서 그 변수가 나오면 그 변수의 현재 값이 사용된다. 예를 들면
위에서 정의한 score라는 변수가 다음과 같은 출력문에 나온디면 그 변수의 현재 값인 86
이 출력된다.

int score = 86;
System.out.println(score);

상수

정상인의 눈의 수는 2 개이다. 이는 변하지 않는 값이다. 이 경우 ‘눈의 수’라는 변수 이름
을 사용한다면 그 이름은 2를 의미한다. 상수(Constan비는 프로그램의 실행 중 변하지 않
는 값을 나타내는 변수의 이름이다. 상수의 값을 변경하려고 하는 것은 오류이다.

상수 값(literal)은 정수형 상수 값, 실수형 상수 값, 문자형 상수 값 논리형 상수 값 등이
있다. 각 상수 값에 대한 설명은 다음과 같다.

  • 정수형 상수 값: 정수형 상수 값을 십진수로 나타낼 수도 있고 8진수나 16 진수로 냐타
    낼 수도 있다. 만약 8진수로 정수형 상수 값을 나타내려면 앞에 O를 붙여 시-용한다. 예
    를 틀면 8진수로 15인 경우는 015로 표시한다. 또한 16진수로 정수형 상수 값을 나타내
    려면 앞에 Ox를 붙여 표시한다. 16진수로 15인 경우는 Ox15로 나타낸다 long 형(다음
    절에서 다룬다) 상수 값을 나타내 기 위해서는 값 뒤에 L을 붙인다. 예를 들면 1234L은
    long 형 정수 값을 나타낸다.

  • 실수형 상수 값: 실수형 상수 값은 소수점이 있는 실수를 나타낸다. 또한 십의 몇 승의
    형태로 나타낼 수도 있다. 실수형 상수 값은 기본적으로 double 형이고 float 형(다음
    절에서 다룬다)을 나타내 기 위해서는 상수 값 뒤에 f나 F를 붙인다. (예: 3.14, 1.52f)

  • 문자형 상수 값: 한 문자를 냐타내기 위해 작은 따옴표를 이용한다. (예: 'a', '가')

  • 논리형 상수 값은 true와 false라는 두 가지 값 중의 하나를 가진다.

상수는 프로그램 실행 시 항상 변하지 않는 값을 나타낸다. 상수도 변수와 같이 사용하기
전에 선언해야 한다 상수를 선언할 때 변수가 아닌 상수라는 것을 나타내가 위해 추가적
으로 데이터 형 앞에 final이라는 예약어를 사용한다. 예를 들면 원주율은 변하지 않기
때문에 상수로 선언할 수 있으며 PI라는 상수 이름을 사용한다띤 다음과 같이 선언할 수
있다.

final double PI = 3.1415;

관례적으로 상수 이름은 모두 대문자로 쓴다.

상수들이 유용한 세 가지의 이유가 있다. 첫째 상수들은 불분명한 값들에 의미를 부여한
다. 예를 들면 위의 예에서 3 .1415는 하나의 숫자일 뿐이 다 그러나 그에 대한 상수로 PI를
사용한다면 원주율을 나타낸다는 것을 추측할 수 있다. 둘째 상수들은 프로그램의 수정
을 용이하게 한다. 상수기 프로그램 내의 여러 곳에서 사용된다면 그 값이 변경되는 경우
에 한 곳에서만 변경하면 된다. 셋째 상수들은 값들이 프로그래머에 의 해 잘못 입력되는
것을 방지한다. 위의 예에서 PI의 값을 다른 프로그래 머가 3.2415로 잘못 입력할 수도 있
다. 상수를 정의하면 이러한 입력 오류를 원천적으로 방지할 수 있다.

데이터 유형

데이터 유형은 저장할 수 있는 값들과 그러한 값들에 적용할 수 있는 연산들을 상술한다.
자바의 데이터 유형은 기 본형 (primitive type)과 참조형 (reference type)으로 나눌 수 있
다. 기본형은 하나의 값을 나타내는 데 이터의 유형이다. 반면에 참조형은 실제 값 혹은 값
들의 집합에 대한 참조(위치)를 나타내는 데이터의 유형이다. 참조형은 다음에 설명하기로
하고 이번 장에서 는 기본형을 살펴보자.

기본형에는 다음과 같이 크게 네 가지 가 있다.

  • 정수형: 정수 값을 저장할 수 있는 데이터의 유형으로 음수일 수도 있다.
유형 저장장소의 크기 표현 가능한 정수의 범위
byte 8 bits 128 ~ 127
short 16 bits 32768~ 32767
int 32 bits -2^32 ~ 2^32 - 1
long 64 bits -2^64 ~ 2^64 - 1
  • 실수형: 소수점을 가진 실수 값을 나타낼 수 있는 유형이 다.
유형 저장장소의 크기 표현 가능한 실수의 범위 유효 자리
float 32 bits -3.4 x 10^38 ~ 3.4 x 10^38 7
double 64 bits -1.8 x 10^308 ~ 1.8 x 10^308 15
  • 논리형: 논리형 (boolean)은 true(참) 또는 false(거짓)과 같은 논리 값만을 저장할 수
    있는 유형으로서 저장하기 위해 1비트가 필요하다.

  • 문자형: 한 문자를 나타내는 데이터의 유형이다. 자바에서 문자를 나타내기 위해 사
    용하는 코드는 유니코드(Unicode) 이다. 유니코드는 한 문자를 저장하기 위해 16 비트
    를 사용한다. 따라서 65 , 536(216)개의 문자를 나타낼 수 있다. 그 코드는 국제적인 문
    자 집합을 나타낸다. 여러 나라 언어들의 문자들과 기호들을 포함한다. 물론 한글의 문
    자들도 포함된다. 예를 들면 $는 유니코드 ‘\u0024’로 나타낸다. 특수 문자(escape
    character)를 나타낼 때 (backslash)를 이용하여 대부분 두 자로 냐타내 며 자바가
    제공하는 특수 문자들은 다음과 같다.

특수 문자 의미 설명
\b Backspace 커서가 한 칸 뒤로 이동
\n Newline 커서가 다음 줄 맨 앞에 위치
\t Tab 커서가 Tab key 를 누른만큼 이동하여 위치
\r Carriage Return \n과 동일
\ backslash ()를 나타냄
\' single quote 작은 따옴표
\" double quote 큰 따옴표

배정문 (Assignment)

우리는 변수에 새로운 값을 주거나 변수의 값을 바꾸기 위해서 배정문을 사용한다.
배정문의 구문법과 의미는 다음과 같다.

  • 구문법 : 변수이름 = 연산식
  • 의 미 : = (배정 연산자)의 오른쪽에 있는 연산식을 계산한 결과 값을 왼쪽에 있는 변수 안에 저
    장한다.

예를 들면 다음 코드를 고려하라.

int count = 10;
count = 15;

배정문이 수행되면 변수의 값이 10에서 15로 바뀐다. 변수에 저장되는 값은 변수의 데이터
형의 값이어야한다.

연산식 (Expressions)

연산식은 어떤 계산을 수행하는 식이다. 연산식은 연산자들과 피연산자들의 결합이 다. 계
산되는 값은 숫자일 필요는 없다. 피연산자들은 상수 값들(숫자 문자, 논리 값), 상수들,
변수들 혹은 다른 데이터 공급원들이다. 연산식이 어 떻게 계산되고 사용되는지는 프로그
래밍의 기본적인 것이다. 이 장에서는 계산 결과가 숫자인 산술 연산식만을 다룬다.

산술 연산자

보통의 산술 연산은 정수형 데이터와 실수형 데이터에 적용되는 더하기(+), 빼기(-), 곱하기
(*)와 나누기(/)이다. 자바에서 추가적으로 나머지 구하기 연산을 제공한다. 나머지 연산자
(%)는 첫 번째 피연산자를 두 번째 피연산자로 냐눈 나머지를 구한다. 나머지의 부호는 첫
번째 피연산자의 부호와 같다. 사칙연산과 % (나머지 연산)을 사용할 수 있다.

산술 연산식의 피언산자들의 하나 혹은 둘이 실수라면 계산 결과는 실수이다. 다음은 나
누기 연산의 예이다.

연산식 결과
13 / 4 3
13.0 / 4 3.25
13 / 4.0 3.25
13.0 / 4.0 3.25

위 예에서 13/4의 계신 결과는 피연산자들이 모두 정수이므로 정수형 나누기 연산이 수행
되고 소숫점 이하의 값을 버리므로 3 이다. 그러나 13.0/4, 13/4.0과 13.0/4.0의 계산 결과
는 피연산들 중의 적어도 하나가 실수이므로 실수형 내누기가 수행되어 소수점 이하까지
계산되므로 3.25이다. 더하기 연산자는 피연산자가 하나인 단항 연산자일 수 있다. 예를
들면 - 5는 5를 음수로 만들가 위해 빼기 연산자를 사용한 경우이다.

연산자 우선순위

연산자들은 복잡한 연산식들로 결합될 수 있다. 예를 들면 다음 배정문을 고려하라.

answer = 3 + 21 / 5;

위 연산식의 우변에 있는 연산식을 수행할 때 더하기 연산자와 냐누기 연산자 중 어느 것
을 먼저 수행하느냐에 따라 결과 값이 달라진다. 이 경우에는 나눈셈을 먼저 수행한다. 나
늦셈 (21 / 5) 의 정확한 계산 결과는 4 . 2이지만 소수점 이하의 값을 버리므로 결과 값은 4
이다. 다음으로 덧셈을 수행한다. 따라서 결과 값은 3 + 4 = 7이다. 이와 같이 연산식에서
연산자들이 적용되는 순서를 결정하는 규칙이 잘 정의된 우선순위 규칙 (precedence rule)
이다.

연산자들의 우선순위는 괄호를 사용하여 변경할 수 있다. 예 를 들
면 위의 매정문에서 덧셈을 나늦셈보다 먼저 실행하고자 한다면 다음과 같이 작성한다.

answer = (3 + 21) / 5;

이 경우에는 괄호 안의 덧셈이 먼저 실행된다. 덧셈의 결과는 24이다. 다음으로 나늦셈이
실행된다. 정확한 계산 결과는 4. 8이지만 소수점 이하의 값을 버리므로 결과 값은 4이다.

배정문의 좌변과 우변에 같은 변수를 포함할 수 있다. 이 경우에는 우변에 있는 연산식을
계산한 결과를 좌변에 있는 변수에 저장한다. 예를 들면 다음 배정문을 고려하라.

counter = counter + 1;

이 배정문을 수행하기 전에 변수 counter의 값이 6이라면 먼저 배정 연산자의 오른쪽에
있는 연산식을 계산한다. 그 결과 값은 7이다. 다음으로 그 값을 변수 counter에 저정한
다 따라서 counter의 값은 6에서 7로 비뀐다.

데이터 변환 (type conversion)

데이터를 한 형에서 다른 형으로 변환하는 것은 때때로 편리하다. 예를 들면 특정 상황에
서 우리는 실수를 정수로 다루고 싶을지 모른다. 이러한 변환은 변수의 데이터 형이나 그
안에 저장된 값을 바꾸지 않는다. 대 신 계산 과정 에 서 값을 변환할 필요가 있다.
데이 터 변환은 정보를 잃어버 리 는 것을 피하기 위 해 조심스럽 게 다루어 져야 한다. 데이터
변환이 작은 크기의 데이 터 형 에 서 더 큰 크기 의 데이 터 형으로 변환하는 것(확장 변환)은
가장 안전하다. 예를 들면 short 형에서 int 형으로 변환하는 것은 정보를 잃어벼라지 않
기 때문에 안전하다. 그러나 큰(혹은 복잡한) 데 이터 형에서 더 작은(혹은 간단한) 데 이 터
형으로 변환할 때 정보를 잃어 버 랄 수 있다. 이는 축소 변환이라고 부른다. 따라서 이 변
환은 꼭 필요한 경우가 아니 면 가능한 피해야 한다. 예를 들면 double 형에서 ìnt 형으로
변환하는 것은 소수점 이하 값을 잃어벼린다.

자바에서 데이터 변환은 세 가지 방법으로 일어날 수 있다.

  • 배정문 변환(assignment conversion)
  • 승급 변환(promotion)
  • 강제 변환(casting)

배 정 문 변환은 한 데 이터 형의 값이 다른 데 이 터 헝의 변수에 저 장될 때 일어난다. 예를 들
면 다음 코드는 score의 현재 값인 7을 double 형 실수 값으로 변환히 여 value에 저장
한다.

int score = 7;
double value = score;

변수 score의 값이나 데이 터 형은 변화하지 않는다는 점 에 유념하랴.
승급 변환은 연산식에 있는 연산자들이 피연산자들을 변환할 때 자동적으로 일어 난다. 예
를 들면, 다음 코드에서 나늦셈을 수행하기 전에 total이 실수형이 므로 실수형 나늦셈을
수행하기 위해 count의 값이 실수형 값으로 변환된다.

double total = 85.2;
int count = 17;
double average = total / count;

강제 변환은 가장 강력하나 위험한 방법이다. 확장 변환과 축소 변환 모두 가능하다. 강제
로 형 변환을 하기 위 해 서 변환되는 값 앞에 괄호 안에 변환되는 형을 넣는다. 예를 들면
다음 코드에 서 변수 answer에 저장되는 값은 3이다.

double poi nt = 3.8;
int answer = (int) point;

double 형 변수의 값이 int 형 변수에 저장될 때 반올림하지 않고 소수점 이하의 값을 버
린다. 이 과정에서 정보의 손실이 일어난다.

간단한 입력문

표준 출력을 위해 System.out이 있듯이 표준 입력을 위해 System.in이 있다 System.in은 키보드로부터 입력을 받아들인다. 또한 표준 입력 대신에 콘솔 입력 (console input) 이라는 용어를 사용한다. 입력을 위해 System.in을 사용하는 것은 출력을 위해 System.out를 사용하는 것보다 다소 더 복잡하다.

System .in은 InputStream 클래스의 한 객체이다. 이 객체는 read 메소드로 한 번에 한
바이트(byt리를 읽는 기능만을 제공한다. 그러나 문자열과 같이 많이 사용되는 유형의 데
이터를 나타내기 위해서 여러 바이트들이 요구된다. java.util 패키지 내 의 Scanner 클래
스는 여러 유형의 입력 값들을 읽어 들이기 위한 편리한 메소드들을 제공한다. 입력은 여
러 종류의 입력 장치들이나 파일 등으로부터 이루어질 수 있다.

한 프로그램 내에서 Scanner 클래스를 편리하게 사용하기 위해서 프로그램의 맨 앞에 다
음과 같은 import 문을 포함할 수 있다.

import java.util.Scanner;

그러면 프로그램 내에서 Scanner 클래스를 냐타내기 위해서 java.util.Scanner 대신에
간단히 Scanner라고 쓸 수 있다.

데이터를 키보드로부터 대화식으로 읽어 들이기 위해 먼저 Scanner 객제를 생성하여야
한다. 다음 문은 키보드로부터 데이터를 읽는 Scanner 객체를 생성하고 변수 scan이 그
객체를 가리키게 한다.

Scanner scan = new Scanner (5ystem.in);

Scanner 객체를 사용하여 사용자가 키보드로부터 여러 유형의 값들을 읽어 들이는 주요
메소드들은 다음과 같다.

  • String next(): 다음 입력 토큰(아래 참조)을 한 문자열로 반환한다.
  • String nextLine(): 현 줄에 남아 있는 모든 입력을 한 문자열로 반환한다.
  • int nextlnt(): 다음 입력 토큰을 한 정수로 반환한다.
  • double nextDouble(): 다음 입력 토큰을 한 double 형 실수로 반환한다.
  • float nextFloat(): 다음 입력 토큰을 한 float 형 실수로 반환한다.

nextInt 메소드와 nextDouble 메소드는 각각 int 형과 double 형의 데이터를 읽어 들
인다.

다르게 지정하지 않는다면 Scanner 객체는 흰색 공간 문자들(빈 칸, 빈 줄, Tab 키)을 이
용하여 입력의 구성요소(토큰)들을 서로 분리시킨다. 이 문자들은 구분 문자(delimite에라
고 부른다. 예를 들면 다음은 한 줄의 입력이라고 가정하자

adam 12 825-1234

그러면 이 입력은 세 개의 토큰들(adam, 12, 825-1234)로 구분된다. 구분 문자들은 입
력 토큰들이 다른 문자들에 의해 구분된다면 바뀔 수 있다. 예를 들면 구분 문자에 ‘-’가
추가된다면 이 입력은 네 개의 토큰들(adam , 12, 825, 1234)로 구분된다.

Scanner 객체는 여러 종류의 입력 메소드들을 호출히카 위 해 사용될 수 있다. 예를 들면
현재 줄에 남아 있는 모든 입력을 한 문자열로 읽어 들여 answer 라는 String 형 변수에
저 장하기 위해 다음과 같이 한다.

String answer = scan.nextLine();

간단한 입력문을 사용하는 한 예로서 자동차의 연비 를 계산하는 프로그램을 작성해 보
자. 이 프로그램은 자동차의 주행거리와 사용한 휘발유의 양을 입력 받아 연비를 계산
한다. 주행거리, 휘발유의 양과 연비 를 냐타내 는 변수를 각각 driveDistance, fuel s와
fuelEfficieney라고 가정하자. 그러면 연비 는 다음과 같이 계산된다.

fuelEfficiency = driveDistance / fuels;

완전한 프로그램은 다음과 같다.

마지막 출력문 + 연산자는 두 문자열을 연결(concatenation)하는 역할을 한다.

6945 reads

Author

No discussion

Please log in to leave a comment

16.5.11618.20190612.allo
Report · Terms of Service · Privacy Policy
Lablup Inc. · Teheran-ro 145, Gangnam-gu, Seoul, Republic of Korea · 대표: 신정규 · 사업자번호: 864-88-00080 · +82 70-8200-2587

Decline Confirm

Close
Favorite Bookmark Discussion

Please copy the following address