변수 시작
package variable;
public class Var1 {
public static void main(String[] args) {
System.out.println(10);
System.out.println(10);
System.out.println(10);
}
}
패키지(package)
- 지금 단계에서는 자바 파일을 구분하기 위한 폴더로 이해하면 된다.
- `variable`라는 패키지를 만들었다면, 해당 패키지에 들어가는 자바 파일 첫줄에 `package variable;`와 같이 소속된 패키지를 선언해주어야 한다.
- 자바 파일이 위치하는 패키지와 `package variable` 선언 위치가 같아야 한다.
실행 결과
단순히 숫자 10을 3번 출력하는 코드이다. 그런데 여기서 숫자 10을 3번 출력하는 대신에 숫자 20을 3번 출력하도록 코드를 변경해보자.
package variable;
public class Var1 {
public static void main(String[] args) {
System.out.println(20); //변경 10 -> 20
System.out.println(20); //변경 10 -> 20
System.out.println(20); //변경 10 -> 20
}
}
숫자 10이라고 적혀있는 곳을 모두 찾아서 숫자 20으로 변경해야 한다. 단순한 예제여서 코드를 3번만 변경했지만, 만약 숫자 10을 출력하는 부분이 100개라면 100개의 코드를 모두 변경해야 한다.
더 나아가서 사용자가 숫자를 입력하고, 사용자가 입력한 숫자를 출력하고 싶다면 어떻게 해야할까? 사용자가 입력한 값은 항상 변한다. 결국 어딘가에 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있는 저장소가 필요하다. 쉽게 비유하자면 데이터를 담을 수 있는 그릇이 필요하다.
모든 프로그래밍 언어는 이런 문제를 해결하기 위해 변수(variable)라는 기능을 제공한다. 변수는 이름 그대로 변할 수 있다는 뜻이다.
변수 사용
package variable;
public class Var2 {
public static void main(String[] args) {
int a; // 변수 선언
a = 10; // 변수 초기화
System.out.println(a);
System.out.println(a);
System.out.println(a);
}
}
20을 세 번 출력하고 싶다면 `a = 20`으로 변경하면 된다.
변수 선언
변수를 선언하면 컴퓨터의 메모리 공간을 확보해서 그곳에 데이터를 저장할 수 있다. 그리고 변수의 이름을 통해서 해당 메모리 공간에 접근할 수 있다. 쉽게 이야기해서 데이터를 보관할 수 있는 공간을 만들고, 그곳에 이름을 부여한다.
`int a`
- 숫자 정수(integer)를 보관할 수 있는 이름이 `a`라는 데이터 저장소를 만든다. 이것을 변수라 한다.
- 이렇게 변수를 만드는 것을 변수 선언이라 한다.
- 이제 변수 `a`에는 숫자 정수를 보관할 수 있다.
변수는 다음과 같이 하나씩 선언할 수도 있고
int a;
int b;
다음과 같이 한번에 여러 변수를 선언할 수도 있다.
int c, d;
변수 초기화
변수를 선언하고, 선언한 변수에 처음으로 값을 지정하는 것을 변수 초기화라 한다.
`a = 10`
- 자바에서 `=`은 오른쪽에 있는 값을 왼쪽에 저장한다는 뜻이다.
- 숫자를 보관할 수 있는 데이터 저장소인 변수 `a`에 값 `10`을 저장한다.
package variable;
public class Var5 {
public static void main(String[] args) {
// 1. 변수 선언, 초기화 각각 따로
int a;
a = 1;
System.out.println(a);
int b = 2; // 2. 변수 선언과 초기화를 한 번에
System.out.println(b);
int c = 3, d = 4; // 3. 여러 변수 선언과 초기화를 한 번에
System.out.println(c);
System.out.println(d);
}
}
- 변수의 선언과 초기화를 각각 따로 할 수 있다.
- 변수를 선언하면서 동시에 초기화할 수 있다.
- `int b`를 사용해서 변수 `b`를 만들고 그 다음에 바로 `b = 2`를 사용해서 변수 `b`에 값 2를 저장한다.
- 여러 변수를 선언하면서 초기화도 동시에 진행할 수 있다.
초기화 하지 않은 변수 읽기
package variable;
public class Var6 {
public static void main(String[] args) {
int a;
System.out.println(a); //주석을 풀면 컴파일 에러 발생
}
}
다음과 같은 컴파일 에러가 발생한다.
java: variable a might not have been initialized
- 해석해보면 변수가 초기화되지 않았다는 오류이다.
컴퓨터에서 메모리는 여러 시스템이 함께 사용하는 공간이다. 그래서 어떠한 값들이 계속 저장된다.
변수를 선언하면 메모리상의 어떤 공간을 차지하고 사용한다. 그런데 그 공간에 기존에 어떤 값이 있었는지는 아무도 모른다. 따라서 초기화를 하지 않으면 이상한 값이 출력될 수 있다. 이런 문제를 예방하기 위해 자바는 변수를 초기화 하도록 강제한다.
지금 학습하는 변수는 지역 변수(Local Variable)라고 하는데, 지역 변수는 개발자가 직접 초기화를 해주어야 한다. 나중에 배울 클래스 변수와 인스턴스 변수는 자바가 자동으로 초기화를 진행해준다.
변수 값 읽기
`System.out.println(a)`
- 변수에 저장되어 있는 값을 읽어서 사용하는 방법은 간단하다. 변수 이름을 적어주기만 하면 된다.
- 변수 `a`에 `10`이 들어가 있다면 자바는 실행 시점에 변수의 값을 읽어서 사용한다.
- 변수의 값은 반복해서 읽을 수 있다. 변수의 값을 읽는다고 값이 없어지는 것이 아니다.
변수 값 변경
변수는 이름 그대로 변할 수 있는 수 이다. 변수 `a`에 저장된 값을 언제든지 바꿀 수 있다는 뜻이다.
package variable;
public class Var3 {
public static void main(String[] args) {
int a; //변수 선언
a = 10; // 변수 초기화 a(10)
System.out.println(a);
a = 50; //변수 값 변경: a(10- > 50)
System.out.println(50);
}
}
변수 타입
package variable;
public class Var7 {
public static void main(String[] args) {
int a = 100; //정수
double b = 10.5; //실수
boolean c = true; //불리언(boolean) true, false 입력 가능
char d = 'A'; //문자 하나
String e = "Hello Java"; //문자열, 문자열을 다루기 위한 특별한 타입
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
}
변수는 데이터를 다루는 종류에 따라 다양한 형식이 존재한다. 이러한 형식을 영어로는 `타입`(type)이라 하고, 우리말로는 `형식`또는 `형`이라 한다. 예를 들어서 `int`타입, `int`형식, `int`형 등으로 부른다.
변수 타입의 예
- `int`: 정수를 다룬다. 예) `1`, `100`, `1000`
- `double`: 실수를 다룬다. 예) `0.2`, `1.5`, `100.121`
- `boolean`: 불리언 타입이라 한다. `true`, `false` 값만 사용할 수 있다. 주로 참과 거짓을 판단하는 곳에서 사용한다.
- `char`: 문자 하나를 다룰 때 사용한다. 작은따옴표(`'`)를 사용해서 감싸야 한다. 예) `'A'`, `'가'`
- `String`: 문자열을 다룬다. 큰따옴표를 사용해야 한다. 예) `"hello java"`
자신의 타입에 맞는 데이터 사용
각 변수는 지정한 타입에 맞는 값을 사용해야 한다. 예를 들어서 다음의 앞의 두 코드는 컴파일 오류가 발생한다.
- `int a = "백원"`: 정수 타입에 문자열(X)
- `int a = "100"`: 정수 타입에 문자열(X), 이것은 숫자 100이 아니라 문자열 `"100"`이다. 문자를 나타내는 쌍따옴표(`"`)로 감싸져 있다.
- `int a = "백원"`: 정수 타입에 정수 100(O)
리터럴
코드에서 개발자가 직접 적은 `100`, `10.5`, `true`, `'A'`, `"Hello Java"`와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다.
int a = 100; //정수 리터럴
double b = 10.5; //실수 리터럴
boolean c = true; //불리언 리터럴
char d = 'A'; //문자 하나 리터럴
String e = "Hello Java"; //문자열 리터럴
변수의 값은 변할 수 있지만 리터럴은 개발자가 직접 입력한 고정된 값이다. 따라서 리터럴 자체는 변하지 않는다.
숫자 타입
package variable;
public class Var8 {
public static void main(String[] args) {
//정수
byte b = 127; //-128 ~ 127
short s = 32767; // -32,768 ~ 32,767
int i = 2147483647; //-2,147,483,648 ~ 2,147,483,647 (약 20억)
//-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
long l = 9223372036854775807L;
//실수
float f = 10.0f;
double d = 10.0;
}
}
메모리를 적게 사용하면 작은 숫자를 표현할 수 있고, 메모리를 많이 사용하면 큰 숫자를 표현할 수 있다.
변수를 선언하면 표현 범위에 따라 메모리 공간을 차지한다. 그래서 필요에 맞도록 다양한 타입을 제공한다.
변수와 메모리 공간 크기
- 정수형
- `byte`: -128 ~ 127 (1byte)
- `short`: -32,768 ~ 32,767 (2byte)
- `int`: -2,147,483,648 ~ 2,147,483,647 (약 20억) (4byte)
- `long`: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (8byte)
- 실수형
- `float`: 대략 -3.4E38 ~ 3.4E38, 7자리 정밀도 (4byte)
- `double`: 대략 -1.7E308 ~ 1.7E308, 15자리 정밀도 (8byte)
- 기타
- `boolean`: `true`, `false` (1byte)
- `char`: 문자 하나(2byte)
- `String`: 문자열을 포현한다. 메모리 사용량은 문자 길이에 따라 동적으로 달라진다. (특별한 타입)
리터럴 타입 지정
- 정수 리터럴은 `int`를 기본으로 사용한다. 따라서 `int` 범위까지 표현할 수 있다. 숫자가 `int` 범위인 약 20억을 넘어가면 `L`을 붙여서 정수 리터럴을 `long`으로 변경해야 한다. (대문자 `L`, 소문자 `l` 모두 가능하다. 그런데 소문자 `l`은 숫자 1과 착각할 수 있어서 권장하지 않는다.)
- 실수 리터럴은 기본이 `double`형을 사용한다. `float`형을 사용하려면 `f`를 붙여서 `float`형으로 지정해야 한다.
거의 사용하지 않는 타입
- `byte` : 표현 길이가 너무 작다. 또 자바는 기본으로 4byte(`int`)를 효율적으로 계산하도록 설계되어 있으므로 `int`를 사용하자.
- `byte` 타입을 직접 선언하고 여기에 숫자 값을 대입해서 계산하는 일은 거의 없다.
- 대신에 파일을 바이트 단위로 다루기 때문에 파일 전송, 파일 복사 등에 주로 사용된다.
- `short`: 표현 길이가 너무 작다. 또 자바는 기본으로 4byte(`int`)를 효율적으로 계산하도록 설계되어 있다. `int`를 사용하자.
- `float`: 표현 길이와 정밀도가 낮다. 실수형은 `double`을 사용하자.
- `char`: 문자 하나를 표현하는 일은 거의 없다. 문자 하나를 표현할 때도 문자열을 사용할 수 있다.
메모리 용량은 매우 저렴하기 때문에 메모리 용량을 약간 절약하기 보다는 개발 속도나 효율에 초점을 맞추는 것이 더 효과적이다.
자주 사용하는 타입
실무에서 자주 사용하는 타입은 다음과 같다.
- 정수 - `int`, `long`: 자바는 정수에 기본으로 `int`를 사용한다. 만약 20억이 넘을 것 같으면 `long`을 쓰면 된다.
- 파일을 다룰 때는 `byte`를 사용한다.
- 실수 - `double`: 실수는 고민하지 않고 `double`을 쓰면 된다.
- 불린형 - `boolean`: `true`, `false` 참 거짓을 표현한다. 이후 조건문에서 자주 사용된다.
- 문자형 - `String`: 문자를 다룰 때는 문자 하나든 문자열이든 모두 `String`을 사용하는 것이 편리하다.
변수 명명 규칙
자바에서 변수의 이름을 짓는데는 규칙과 관례가 있다.
규칙은 필수이다. 규칙을 지키지 않으면 컴파일 오류가 발생한다. 관례는 필수는 아니지만 전세계 개발자가 해당 관례를 따르기 때문에 사실상 규칙이라고 생각해도 된다.
규칙
- 변수 이름은 숫자로 시작할 수 없다. (예: `1num`, `1st`)
- 그러나 숫자를 이름에 포한하는 것은 가능하다. (예: `myVar1`, `num1`)
- 이름에는 공백이 들어갈 수 없다.
- 자바의 예약어를 변수 이름으로 사용할 수 없다. (예: `int`, `class`, `public`)
- 변수 이름에는 영문자(`a-z`, `A-Z`), 숫자(`0-9`), 달러 기호(`$`) 또는 밑줄(`_`)만 사용할 수 있다.
관례
- 소문자로 시작하는 낙타 표기법
- 변수 이름은 소문자로 시작하는 것이 일반적이다. 여러 단어로 이루어진 변수 이름의 경우, 첫 번째 단어는 소문자로 시작하고 그 이후의 각 단어는 대문자로 시작하는 낙타 표기(camel case)를 사용한다. (예: `orderDetail`, `myAccount`)
자바 언어의 관례
클래스는 대문자로 시작, 나머지는 소문자로 시작
- 자바에서 클래스 이름의 첫 글자는 대문자로 시작한다. 그리고 나머지는 모두 첫 글자를 소문자로 시작한다. 여기에 낙타 표기법을 적용하면 된다.
- 예시
- 클래스: `Person`, `OrderDetail`
- 변수를 포함한 나머지: `firstName`, `userAccount`
- 예외
- 상수는 모두 대문자를 사용하고 언더바로 구분한다.
- `USER_LIMIT`
- 패키지는 모두 소문자를 사용한다.
- `org.spring.boot`
- 상수는 모두 대문자를 사용하고 언더바로 구분한다.
변수 이름은 의미있고, 그 용도를 명확하게 설명해야 한다.
- `a`, `b`: 이런 변수는 용도를 설명하지 않으므로 단순한 예제에서만 사용하는 것이 좋다.
- `studentCount`, `maxScore`, `userAccount`, `orderCount`: 용도를 명확하게 설명한다.
'Java' 카테고리의 다른 글
[Java/김영한] 조건문 (0) | 2024.08.12 |
---|---|
[Java/김영한] 연산자 (0) | 2024.08.12 |
[Java/김영한] Hello World (0) | 2024.08.11 |
Record (0) | 2024.07.03 |
Servlet (0) | 2024.05.13 |