본문 바로가기
👨‍💻 프로그래밍/Java, Kotlin, Spring

자바 4 - 자바 변수, 데이터 타입

by 개발자 진개미 2021. 4. 8.
반응형

간단하게 말하자면, 변수는 데이터에 주는 이름이다. 

 

1. 변수 이름 짓는 규칙 (Naming Rules)

2. 변수 이름 관습 (Naming Conventions)

3. 변수의 데이터 타입 (Type)

4. 변수 활용 시 주의점

5. 변수 타입 변환 (Type Casting)

 


개요

모든 프로그램은 사실 본질적으로 2가지로 이루어져 있다. 데이터 + 알고리즘이다. 컴퓨터 프로그램은 기본적으로 데이터를 어떤 방식으로든 받아와서 (유저가 직접 입력할 수도 있고, 스마트폰에서 터치를 할 수도 있고) 데이터로써 저장하고, 그 데이터를 특정한 방식으로 바꿔서 출력하는 것이다. 이 긴 여정을 시작하기 위한 첫 번째 여정이 바로 변수이다. 변수를 저장하기 위해선 이름이 필요하다. 물론, 컴퓨터에게 있어서는 이름이 필요 없다. 컴퓨터는 단순히 메모리 주소 (0x123456과 같은) 방식으로 데이터를 저장한다. 하지만 우리가 매번 저러한 이름으로 변수를 불러와야 한다면 매우 불편할 것이다. 그래서 인간에게는 그 변수의 특징을 한 번에 알 수 있고 또한 너무 길지 않은, 즉 가동성이 높은 이름이 필요하다.


1. 변수 이름 짓는 규칙 (Naming Rules)

변수를 지을 때는 반드시 지켜야 할 규칙이 있다.

1. 반드시 알파벳, 숫자, '_'만 들어갈 수 있다.

모든 이름에는 키보드 0옆에 있는 _를 제외한 특수문자가 들어갈 수 없다. 알파벳과 숫자를 쓸 수 있다

 

예) my!Var ( '_' 외의 특수문자,! 가 들어가서 불가능), my Var(빈칸이 들어가서 불가능)

 

2. 숫자로 시작할 수 없다.

숫자는 자유롭게 쓸 수 있지만, 처음에 숫자를 쓸 수는 없다.

 

예) 4myVar(처음에 숫자가 들어가서 불가능)

 

3. 대문자와 소문자는 다르게 취급한다.

일상생활에서 대문자와 소문자는 단순히 강조 이외에 차이는 없지만, 프로그램에서는 aAab만큼 다르다.

 

 


2. 변수 이름 관습

1번에서 다룬 변수 이름 규칙은 반드시 지켜야 할 규칙이지만, 꼭 지켜야 할 필요는 없지만 대부분 지켜야 하는 관습 또한 존재한다. 여기서 꼭 지켜야 할 필요가 없다는 것은 컴파일러가 오류를 표시하지 않는다는 의미이지, 관습을 지켜도 되지 않는다는 것은 아니다. 현실적으로 다른 프로그래머와의 협업이나 프로그램의 유지보수를 위해선 이 관습을 반드시 지켜야 한다.

 

1. 변수는 반드시 소문자로 시작해야 한다.

변수는 소문자로 시작한다. 이것은 변수와 클래스(나중에 나옴)을 확실하게 구분하기 위해서이다.

 

예) x (가능), myVar (가능), MyVar(불가능)

 

2. 변수는 카멜 케이스(낙타 표기법)이나 스네이크 케이스(뱀 표기법) 중 하나를 선택해서 일관되게 써야 한다.

카멜 케이스는 마치 낙타처럼 단어를 모두 붙여서 쓰되, 새로 시작하는 단어의 첫 문자는 모두 대문자로 하는 것이다. 예를 들면 "I am fine thank you. And you?"를 카멜 케이스로 쓰면, "iAmFineThankYouAndYou"가 된다. 즉, 첫 번째 문자는 1번 규칙에 따라 소문자로 하고, 새로 시작하는 단어는 대문자로 시작하는 것이다. 보면 알다시피, 마치 낙타처럼 생겨서 이런 이름이 붙었다.

 

스네이크 케이스는, 새로운 단어를 우리가 유일하게 변수 이름에서 사용 가능한 특수문자인 '_'를 사용해서 구분해 주는 것이다. 똑같이 위의 "I am fine thank you. And you?"를 스네이크 케이스로 쓰면, "i_am_fine_thank_you_and_you"가 된다.

 

일반적으로 한 프로그램 내에서는, 어느쪽이든 하나를 쓰기로 정했으면 일관되게 계속 같은 표기법을 써야 한다.

 

3. 변수 이름은 일반적으로 명사여야 한다.

보통 변수는 우리가 다루고자 하는 대상을 나타내고, 매소드(함수)가 우리가 하려는 동작을 나타내기 때문에 변수는 명사로 하고 매소드는 동사로 해야 한다. 예를 들면, 섭씨를 화씨로 변환하는 프로그램을 작성한다고 할 때, 온도를 나타내는 변수는 명사로 하고, 그 온도를 변환시키는 매소드는 동사로 한다.

 

예를 들어, 온도는 temperature, 화씨로 바꿔주는 매소드는 convertTemperature로 할 수 있다.


3. 변수의 데이터 타입

모든 변수에는 각자 다른 타입이 있다. 이를 미리 지정하는 이유는 컴퓨터의 공간(메모리)은 한정되어 있고, 어떤 변수에 많은 공간만 할당하기보다는 미리 정해진 공간을 할당해서 메모리를 효율적으로 관리하는 것이다. 예를들어 보면, 우리가 100이 넘는 숫자를 저장하는데 필요한 메모리와, 맞는지 아닌지, 켜졌는지 꺼졌는지 등을 저장하는데 필요한 메모리의 개수를 비교해 보면, 100을 2진수로 저장하는데 드는 메모리 개수는 최대 8개 (1100100)이고, 맞는지 아닌지를 저장하는데 필요한 메모리 개수는 1개이다. (0 혹은 1)

 

모든 변수는 '=' 기호로 쓰는 대입 연산자(Assignment Operator)를 써서 값을 부여한다. 즉, a = 5를 하면, 수학에서와는 달리 a가 5랑 같냐고 묻는 게 아니라, a에 5라는 값을 준다는(대입한다는) 것이다.

 

변수는 크게 4가지 종류로 나눌 수 있다. 정수(소수점이 없는 수)와 실수(소수점이 있는 수), 문자, 그리고 불타입(맞는지 아닌지)이다.

 

정수(Integer)는 사실 같은 대상을 나타내지만, 서로 사용하는 메모리의 개수가 다르다.

 

byte - 1 바이트(0과 1을 나타낼 수 있는 메모리 1개), -128부터 127까지 나타낼 수 있음

short - 2 바이트, -32768부터 32767까지 나타낼 수 있음

int - 4 바이트, -2147483648부터 2147483647까지 나타낼 수 있음

long - 8 바이트, -9223372036854775808부터 9223372036854775807까지 나타낼 수 있음

 

즉, 만약에 게임에서 레벨을 저장하는 변수를 만들고 싶은데, 최대 레벨이 100이라면 굳이 int나 short를 쓸 필요 없이 byte를 쓰면 좋다. 최대 레벨이 100을 넘는 일은 없기 때문에, 굳이 필요 없는 공간을 메모리에 미리 차지할 필요가 없기 때문이다.

 

아래의 코드를 예로 들면,

public class IntegerEx {
	public static void main(String[] args) {
    	int var1 = 100;
        short var2 = 100;
    }
}

 

var1과 var2는 똑같은 값을 저장하고 있음에도 불구하고, 실제 메모리에서는, 다음과 같이 더 많은 공간을 차지한다.

 

var1의 경우 총 12바이트를 사용한다.
var2의 경우 겨우 8바이트의 메모리만을 차지한다.

그렇지만 보통 정수는 int를 사용해서 나타내고, 때때로 매우 큰 수를 사용해야 할 경우엔 long, 정말 작은 수를 나타내야 할 경우에는 그에 따라 다른 데이터를 사용한다.

 

실수(소수점)의 경우도, 크기에 따라 2가지 경우로 나뉜다.

 

float - 4 바이트

double - 8 바이트

 

정수와 마찬가지로 크기에 따라 적절하게 사용해야 하지만, 실제론 double을 주로 사용하고, float는 가끔 사용한다.

 

문자(Character)는 유니코드를 사용한 한 가지 타입이 있다.

 

char - 2 바이트

 

주의할 점은, char은 1개의 문자를 저장하는 변수라는 것이다. 즉, a하나, b하나를 저장할 수 있지, 문장을 저장할 수는 없다. 여러 개의 char는 String으로 나타내는데, String은 데이터 타입이 아니라 char 배열의 포인터이다. 이에 관해선 나중에 자세히 알아보자.

 

마지막으로 불 타입(맞냐 아니냐 두 종류)는 boolean으로 나타낸다.

 

boolean - 1 바이트 (true나 false 둘 중 하나의 값을 가짐)

 

아래의 예제에서는 switch라는 불 타입 변수를 선언하고, 그 값을 true로 한 뒤, 다시 false로 바꿨다.

public class BooleanEx {
	public static void main(String[] args) {
    	boolean switch = true;
        switch = false;
    }
}

4. 변수 활용 시 주의해야 할 점

변수를 사용할때는 주의해야 할 점이 몇 가지 있다.

 

1. 변수를 사용하기 전에 반드시 먼저 변수를 선언해야 한다

아래 예제에서는 연봉이라는 변수를 만드기 전에 사용을 하려고 했기 때문에 오류가 발생했다.

public void Salary {
	salary = 100000000.0;
    double salary;
    System.out.println("연봉은 " + salary);
}

 

2. 변수는 반드시 한 번만 선언해야 한다.

중간에 변수의 값을 바꿀 수는 있지만, 똑같은 변수를 2번 선언(앞에 변수 타입을 붙여서)할 수는 없다.

 

아래 예제에서는 연봉이라는 변수를 여러 번 선언하려 해서 오류가 발생했다.

public void printSalary {
	double salary = 50000000.0;
    System.out.println("연봉은 " + salary);
    double salary = 60000000.0; //오류! 옳바른 방법은 double을 빼고 그냥 salary  =
    System.out.println("바뀐 연봉은 " + salary);
}

 

3. 변수는 범위( {} 사이)에서 벗어나면 사라진다.

변수는 프로그램 어디서나 쓸 수 있는것은 아니다. 변수는 범위 내 (일반적으로 중괄호 사이)에서만 쓸 수 있다.

 

아래의 예제에서는 변수를 범위 밖에서 사용하려고 해서 오류가 발생했다.

public void Ex {
	double x = 100.0;
    if(x > 0.0) {
    	double y = 5.0;
    }
    System.out.println("y: " + y) //y는 괄호 밖에 있어 이미 사라졌다.
}

5. 변수의 타입 변환 (Type Casting)

아무리 변수를 신중하게 선언해도 중간에 변수의 타입을 바꾸고 싶을 때가 있다. 이럴 땐 어떻게 해야 할까?

 

타입을 변환하는 문법은 생각보다 간단하다.

double var1 = 10.5;
int var2 = (int)var1; //var1의 정수부분(10)만 int로 저장

이렇게 할 경우 float/double에서 byte/short/int/long으로 갈 경우 소수점 부분이 사라지고, 반대로 변환할 경우에는 소수점 부분이 생긴다.

int var1 = 10;
double var2 = (double)var1; //이렇게 할 경우 var2는 10.0이 된다.

 

참고로 불 타입에서는 변환이 허락되지 않는다!


혹시 모르는 점이나 더 궁금한 점, 지적할 점이 있으면 언제든지 댓글 남겨주세요. 늦어도 24시간 이내에 답변드립니다

반응형