2019. 9. 30. 22:44

[JAVA 개념알기]변수

변수


어떤 언어를 배우든 꼭 등장하는 개념이 있다. 바로 이 변수이다. 변수는 말 그대로 변하는 수를 변수라고 수학에서 표현하지만 우리가 배우고자하는 프로그래밍에서는 조금 다르다.

프로그래밍에서 말하는 변수란 메모리상의 공간을 의미한다. 쉽게 비유적으로 생각하면 값을 담는 상자 정도로 이해하면 좋다.

변수는 하나의 값을 저장하는 상자, 메모리상의 공간!

이 변수는 하나의 상자에 하나의 값만이 대응되므로 또 하나를 넣게 된다면 그 변수의 값은 두 개가 되는 것이 아니라 덮어써서 이전의 값은 사라지게 된다.

즉, 하나의 변수에는 단 하나의 값만 저장할 수 있다는 점.

이제 자바에서 변수를 어떻게 사용하는 지 알아보자.

변수의 선언과 초기화 방법


변수를 사용하려면 먼저 변수를 선언해야하는데, 변수의 선언방법은 이렇다.

int i = 0;
long I = 100L;
char str = "";
final float PI = 3.14f

앞에 붙어있는 int나 Long, char, float는 정수형인지 문자형인지 변수들의 타입을 의미하고 그 뒤에 i나 l, str, PI등은 임의로 지정한 변수의 이름이다.

코드를 작성하는 사람의 임의로 이 이름은 무엇으로 정하든지 크게 상관은 없지만 몇가지 규칙이 있다.

  1. 문자나 특수문자('_','$')로 시작해야한다. →숫자로 시작할 수 없음
  2. 대소문자를 구분한다 → 변수 i와 변수 I는 서로 다른 변수 취급한다.
  3. 길이 제한은 없지만 공백은 포함하지 않는다.

그 이외에 예약어들(이미 자바에서 사용하고 있는 메소드명이나 기타)도 사용이 불가능하다는 것. 위 코드의 타입인 int나 Long String, Final, Float 모두 자바에서 사용되기로 약속되어있는 예약어들이다.

우선은 위 사항들을 기반으로 더 따져야할 것이 있다. 바로 가독성인데 혼자 작업할 때는 나만 이 변수가 무엇인지만 알면 되지만

물론 복잡하게 짜놓으면 다시봐도 모를 수가 있다


만약 팀이나 프로젝트 회사 단위로 협업을 하게된다면 공통적인 규약 컨벤션을 따라 변수를 짓게 되어있다. 누가 보더라도 한 눈에 이 변수에 무엇이 들어있는지 알수있도록 직관적이고 가독성 높은 변수를 짓는 것이 중요하다.

그러기 위해서 나온 용어가 바로 카멜 케이스와 스네이크 케이스인데,

말 그대로 카멜 케이스는 BlogTools 처럼 문장의 단어 사이를 띄어쓰기 대신에 대문자로 대체하는 것이다. 원래는 blog tools라고 표현하지만 공백은 허용하지 않으므로 대문자로 이를 울룩불룩하게 표현한다. 대문자가 소문자 사이에 울룩불룩하게 튀어나온 것이 낙타 등을 닮았다고해서 카멜케이스라고 부른다.

스네이크 케이스는 blog_tool 이렇게 단어 사이에 언더바 _ 를 추가한다. 이 언더바가 뱀을 닮았다고해서 스네이크 케이스라고 부른다.

당신이 앞으로 어떤 회사에서 어떤 컨벤션 규칙을 가지고 일할지는 모르지만 이 두가지 케이스 모두 알고있다면 훨씬 적응하기 쉬울 것이다.
보통은 파이썬에서도 그렇고 변수는 스네이크 케이스를 많이 쓰며 명사로 한정한다. 메소드나 함수의 경우에는 동사를 쓰며 카멜케이스를 사용하는 것이 대부분. 물론 이것은 정해진 규칙 같은 것은 없고 상황과 컨벤션마다 다르다는 점.

그리고 대부분 상수는 대문자로 표현한다는 점이다. 상수라고 하면 위에 코드에서 float형으로 선언된 PI 가 바로 그 상수라고 할 수 있는데, 파이 값은 3.14로(당연히 무한소수로 정확히 3.14의 값을 가지진 않지만)어느나라나 공통된 고정된 값이다.
자료형 앞에 final이라고 표시된 것은 이것이 변하지 않는 값이라고 표기해준 것이다. 협업 중에 이 코드를 작성하지 않은 사람이 실수로 상수에 다른 값을 덮어씌우면 안되기 때문에 사전에 방지하기 위해서 이렇게 final이라고 앞에 붙여주게 되면 IDE상에서 The final local variable I cannot be assigned. 라는 오류를 뱉으며 실행이 되지 않는다.
요일이나 어떤 계수같이 바뀌지 않고 항상 고정된 값들을 상수라고 부른다.
이정도가 공통되고 암묵적인 규약이라고 할 수 있지만 잊지 말아야 할 것은,

언제나 핵심은 가독성이라는 것

 

변수의 타입


위에서 짧게 int나 long, char 등이 변수의 타입을 의미한다고 언급했다. 이 변수의 타입에는 크게 두 가지로 나뉘는데 앞서 언급한 정수형과 문자형, 정수형, 실수형, 논리형이 포함되어 있는 기본형, 또는 primitive type이라고 한다.

그리고 자바에서 제공되는 클래스나 사용자가 만든 클래스 등 객체로 만들 경우 이 객체의 타입을 참조형 또는 reference type이라고 부른다.
쉽게 기본형 이외의 변수 타입은 전부 참조형이라고 생각하면 편하다.]

기본형

  • 논리형 boolean
  • 문자형 char
  • 정수형 byte, short, int, long
  • 실수형 float, double

차례로 논리형은 truefalse 중 하나의 값을 갖는 것을 말하고 따라서 저장 가능한 값도 truefalse만 넣을 수 있다.

문자형 char는 유니코드의 2바이트에 해당하는 문자를 담을 수 있다. 우리가 흔히 문자열을 담을 수 있는 String 으로 알고있는 타입은 기본형이 아니라 자바에서 제공하는 클래스에 해당는 참조형 변수 이므로 햇갈리지 않도록 주의하자.

정수형은 가장 많이 사용되므로 타입을 4가지나 제공한다. 주의해야하는 것이 각 타입마다 저장할 수 있는 값의 범위가 다르므로 사용할 정수의 크기에 따라서 알맞게 변수에 넣으면 된다.
보통은 int형이 CPU가 가장 효율적으로 처리할 수 있는 타입이기 때문에 int형을 많이 사용한다.
사용하는 메모리가 다르기 때문에 자원이 없는 옛날 컴퓨터 같은 경우에는 변수를 값에 따라 타이트하게 잡아 저장시켰지만 현대의 컴퓨터들은 메모리 자원이 상대적으로 풍족하기 때문에 그냥 편하게 int나 조금 크다 싶으면 long을 써주면 된다.

이때 해당하는 변수의 범위가 벗어나게되면 그 유명한 오버플로우가 걸리게 되니 주의할 것

마지막으로 실수형 또한 범위에 따라 float와 double로 갈리는데 실수형이란 말 그대로 소수점을 포함한 정밀도를 담고있는데 정밀도가 높을 수록 발생할 수 있는 오차의 범위가 줄어든다. 따라서 높은 계산을 해야하는 소수의 경우에는 float을 묻고 더블로 가도록하자

묻고 더블로 가!

 

두 변수의 값 교환하기


int a = 1;
int b = 2;

위 처럼 a와 b라는 변수에 각 각 1과 2라는 값이 들어있다. 두 변수에 담긴 값을 서로 바꾸려면 어떻게 코드를 짜야할까?

즉, a에는 2가 b에는 1이 들어가야하는 것이다.

단순하게 생각했을 때는 그냥 int a = 2, int b=1 이렇게 하면 되는거 아닌가? 할 수도 있지만 사실 이건 그냥 변수를 재선언해서 원래 있던 값에 덮어씌운 것 뿐이다.
결론부터 말하자면 두 변수를 서로 바꾸기 위해서는 임시로 넘겨 받은 값을 보관할 세번째 변수가 필요하다.

제 3의 공간인 c를 선언해준 뒤, c에 a의 값을 임시로 저장해두고, b의 값을 a에 넣고 다시 c에 넣어둔 값을 b에 넣으면 a와 b의 위치가 바뀌게 된다.

class Change {
    public static void main(String[] args){
        int a = 1, b = 2; //한줄에 여러개를 한번에 선언할 수 있음, 단 자료형이 같아야함
        int c = 0; //임시 변수 c를 선언해주고 0으로 초기화를 해줌

        c = a; //임시 변수에 a의 값을 잠시 보관, a=1, b=2, c=1
        a = b; //b에 있는 값을 a로 옮겨준다, a=2, b=2, c=1
        b = c; //잠시 저장해둔 값을 b에 넣어준다, a=2, b=1, c=1

        System.out.println("a:"+ a + " b:" + b); //a=2,b=1
    }
}

여담으로 파이썬의 경우에는 살짝 다른 프로그래밍 언어와 다르게

a, b = b, a

이런 식으로만 적어주면 두 변수가 서로 바꾸게 해주는 놀랍도록 간편한 문법을 제공한다.

공대식 유우머

하지만 위 사진과 같은 프로그래머식 조크가 생길 정도로 대부분의 언어에서는 두 변수의 값을 교환하기 위해서는 세 개의 변수가 필요하다. 의자는 변수를 담을 공간을 비유하는 아주 괜찮은 메타포니, 사진을 이해하고 피식했다면 바로 다음으로 넘어가도 좋다.

형변환


캐스팅 또는 Casting이라고 부르며 프로그램을 짜다가 보면 서로 다른 타입간의 연산을 해야하는 경우가 생길 수 있다. 이럴 때는 연산하기 전에 서로 타입을 일치시켜야 하는데, 이럴 때 변수를 다른 타입으로 변환하는 것을 형변환이라고 한다.

형변환이란 변수 또는 상수의 타입을 다른 타입으로 변환하는 것을 말한다.

class CASTING {
    public static void main(String[] args) {
        double num = 52.3;
        int casting_num = (int)num;

        System.out.println("double형을 int형으로 형변환 :"+casting_num);
    }
}

실행해보면 터미널에 출력된 값은 double형을 int형으로 형변환 :52 로 나오게 된다. 실수형에서 정수형으로 변환되어 소수점 이하는 버려져서 표시가 된다는 점을 알 수 있다.

위 코드처럼 우리는 해당하는 변수명 앞에 변환하려는 타입을 소괄호 안에 적어주면 해당하는 타입으로 형변환이 된다.

여기서 몇가지 참고해야할 점

  1. boolean 타입은 나머지 기본형과 서로 형변환이 불가능하다.
  2. 작은 덩어리에서 큰 덩어리로의 형변환(예를 들어 byte에서 int)은 자동 형변환이 되므로 형변환은 생략할 수 있다.
  3. 기본형과 참조형은 서로 형변환할 수 없다.

문제


- 37.7778도의 온도를 변수에 담고 소수점 두 번째 자리에서 반올림해서 표시해보세요

...더보기
  • 정답 확인

      float temp = 37.7778f;
              temp = (int) ((temp * 100) + 0.5);
              temp = (float)(temp / 100f);
              System.out.println(temp);
              System.out.printf("%.2f",37.7778); //printf 포맷 구문을 이용

    둘다 똑같이 37.78로 반올림되어 출력된다.