변수

변수(Variable)

이 문서에서는 앞서 살펴본 데이터들을 저장하기 위한 변수에 대해서 알아본다.

리터럴(Literal)

리터럴(Literal)이란 의미가 변하지 않는 값을 의미한다. 예를들어 100이라는 값이 있다고 할 때, 이 값은 어떠한 경우에도 의미가 달라지지 않기 때문에 리터럴이라고 볼 수 있다. 이외에도 우리가 일반적으로 알고 있는 값들은 모두 리터럴이라고 볼 수 있다.

  • A

  • 10

  • 3.14

  • true

  • Hello

변수(Variable)

변수란 리터럴을 저장할 수 있는 공간을 의미한다. 필요에 의해 값을 보관해두었다가 꺼내서 쓸 수 있도록 만들어진 공간을 변수(Variable)이라고 부른다. 우선 다음 코드를 보며 변수의 필요성에 대해서 파악해본다.

import java.lang.*;

public class LiteralExample {
    public static void main(String[] args){
        //목표 : 한그릇에 5000원인 자장면과 6000원인 짬뽕이 있을 때, 자장면 3그릇과 짬뽕 2그릇을 주문한 경우의 종류별 금액과 총액을 출력
        
        System.out.println(5000);//자장면 금액
        System.out.println(6000);//짬뽕 금액
        System.out.println(5000 * 3);//자장면 3그릇 금액
        System.out.println(6000 * 2);//짬뽕 2그릇 금액
        System.out.println(5000 * 3 + 6000 * 2);//총 계산 금액
    }
}

위의 예제는 오로지 리터럴만을 사용하여 계산을 수행하였다. 이럴 경우 발생할 수 있는 문제는 다음과 같다.

  • 자장면과 짬뽕 가격이 각각 1000원씩 인상된 경우 몇 군데를 수정하여야 하는가?

  • 자장면과 짬뽕을 주문한 수량이 각각 달라질 경우 몇 군데를 수정하여야 하는가?

프로그램은 언제나 변할 수 있다. 변해야 한다. 다양한 요구사항을 처리할 수 없는 프로그램은 프로그램이라고 말할 수 없으며, 거의 모든 데이터는 변할 수 있다는 것을 전제조건으로 생각하며 진행해야 한다. 따라서 수정하기 쉽게 만들어야하며, 변수를 이용하면 이러한 작업들이 가능해진다.

import java.lang.*;

public class VariableExample{
    public static void main(String[] args){
        int a = 5000;//자장면 가격을 a라는 변수에 저장
        int b = 6000;//짬뽕 가격을 b라는 변수에 저장
        int c = 3;//자장면 주문수량을 c라는 변수에 저장
        int d = 2;//짬뽕 주문수량을 d라는 변수에 저장
        
        System.out.println(a);//자장면 금액을 출력
        System.out.println(b);//짬뽕 금액을 출력
        System.out.println(a * c);//자장면 주문금액 출력
        System.out.println(b * d);//짬뽕 주문금액 출력
        System.out.println(a * c + b * d);//총 주문금액 출력
    }
}

변수의 형태는 아직 자세히 살펴보지 않았지만 코드를 보면 달라진 점이 확연히 눈에 들어온다. 바로 한 번만 수정하여 프로그램을 변화시킬 수 있다는 점인데, 실제로 작성한 뒤 a, b, c, d의 값을 변경시키면 모든 출력내용이 그에 맞게 수정되는 것을 확인할 수 있다. 이러한 프로그램이 더 가치있는 프로그램이며, 우리는 프로그래밍을 할 때 변화할 수 있는 값과 변화하지 않는 값이 무엇인지 고민하면서 구현해야 한다.

위에서 만든 프로그램은 두 가지 문제점을 더 가지고 있다.

  • 이름이 직관적이지 않아서 알아보기 어렵다.

  • a*c, b*d와 같은 중복 코드가 발생한다

이름이 직관적이지 않으면 작성한 후에 이를 알아보기 어려우며, 중복코드가 발생하면 수정이 번거로워진다. 따라서 변수의 이름을 바꾸고, 변수를 추가하여 문제를 해결한다.

import java.lang.*;

public class VariableExample2 {
    public static void main(String[] args){
        int noodles = 5000;//자장면 가격을 noodles라는 변수에 저장
        int champon = 6000;//짬뽕 가격을 champon라는 변수에 저장
        int noodlesCount = 3;//자장면 주문수량을 noodlesCount라는 변수에 저장
        int champonCount = 2;//짬뽕 주문수량을 champonCount라는 변수에 저장
        
        int noodlesPrice = noodles * noodlesCount;//자장면 주문금액을 미리 계산하여 noodlesPrice라는 변수에 저장
        int champonPrice = champon * champonCount;//짬뽕 주문금액을 미리 계산하여 champonPrice라는 변수에 저장
        
        int totalPrice = noodlesPrice + champonPrice;//총 주문금액을 미리 계산하여 totalPrice라는 변수에 저장
        
        System.out.println(noodles);//자장면 금액을 출력
        System.out.println(champon);//짬뽕 금액을 출력
        System.out.println(noodlesPrice);//자장면 주문금액 출력
        System.out.println(champonPrice);//짬뽕 주문금액 출력
        System.out.println(totalPrice);//총 주문금액 출력
    }
}

코드는 더 길어지지만 이해하기 쉽고 중복코드가 제거된 프로그램이 완성되었다. 물론 한글로 이름을 작성해도 되지만, 한글을 지원하지 않는 운영체제에서 오류가 발생할 수 있기 때문에 일반적으로 영어로 작성한다. 모든 개발자들이 영어로 작성하기 때문에 처음부터 영어로 작성하는 연습을 하는 것이 좋다. 이름이 생각나지 않을 경우 번역기를 적극적으로 활용할 것을 권장한다.

변수를 사용하면 프로그램이 좀 더 고치기 쉽고, 이해하기 쉽게 변한다. 하지만 그만큼 난이도가 올라가고, 생각을 정리해야하기 때문에 어려워진다는 단점이 있다. 따라서 프로그래밍을 하기 전 필요한 값들에 대해서 정리하고, 어떠한 변수를 만들 것인지에 대해서 충분히 생각하는 시간을 가지는 것이 좋다.

변수의 종류

변수는 자료와 정보에서 살펴본 형태로 구분되어 있다. 크게 숫자, 논리, 사용자 정의 자료형으로 구분되며 문자열은 사용자 정의 자료형에 포함된다.

  • 숫자

    • 정수 : 소수점이 없는 숫자(byte, short, int, long)

    • 실수 : 소수점이 있는 숫자(float, double)

    • 문자 : 번호가 부여된 글자(char)

  • 논리 : / 아니오 처럼 두 가지 상태를 표현할 수 있는 값(boolean)

  • 사용자 정의 자료형 : 사용자의 필요에 의해 직접 만드는 형태

    • 문자열 : 긴 문자 모음을 처리하기 위해 자바에서 제공하는 도구(String)

숫자는 저장 형태의 차이로 인해 소수점이 없는 정수와 소수점이 있는 실수로 나눠지며 문자정수에 포함되는 특수한 형태의 데이터이다. 구체적인 저장 형태의 특징과 차이점에 대해서는 해당 문서에서 다룬다.

변수의 선언

변수는 사용하기 전 선언을 통해 사용할 것임을 명시해야 한다. 가장 대표적인 정수 형태인 int를 예로 들어 선언 방법에 대해서 살펴본다.

int a;

변수는 위와 같이 선언해야 사용할 수 있다. 지금은 선언만 한 뒤에 값을 집어넣은 적이 없기 때문에 사용이 불가하며, 사용하기 위해서는 초기화를 수행해야 한다.

a = 10;

변수를 사용할 수 있는 형태로 만드는 것을 초기화라고 한다. 변수에 어울리는 형태의 데이터를 집어 넣어야 초기화가 정상적으로 수행된다. 다음과 같이 한 번에 선언과 초기화를 할 수도 있다.

int a = 10;

초기화까지 마친 변수는 원하는 장소에 이름을 통해 불러와서 사용할 수 있다. 예를 들어서 출력을 하고 싶다면 다음과 같이 작성할 수 있다.

System.out.println(a);

만약 선언 후 초기화를 여러 번 수행하면 마지막 값이 남는다. 기존에 초기화된 값은 덮어쓰기 처리되어 사라진다.

int a;
a = 10;
a = 20;
System.out.println(a);

Last updated