줄 글로 내용을 작성하기에 공부 시간을 너무 뺏어먹는 느낌이 든다. 배운 걸 복습하는 구조로 기록하겠다!
변수를 학습하기 위해 새로운 패키지와 클래스를 생성했다.
//는 학습 목표다.
package com.br.variable;
public class A_Variable {
//변수가 뭔지, 왜 쓰는지, 어떻게 쓰는지, 명명 규칙은 어떻게 정하는지, 상수가 뭔지
public void printValue() {
}
곧바로 메소드를 선언하고 출력문을 작성해본다. 메인 메소드는 선언하지 않고 다른 패키지에서 메인 메소드를 작성한 뒤 이 A_Variable 클래스를 생성하고 호출하여 아래 출력문들이 잘 출력되는지 확인한다.
package com.br.variable;
public class A_Variable {
public void printValue() {
System.out.println("변수 사용 전");
System.out.println(9160 * 8);
System.out.println(9160 * 8 * 5);
System.out.println(9160 * 8 * 5 * 4);
System.out.println(9160 * 8 * 5 * 4 * 0.1);
System.out.println("=======");
System.out.println("변수 사용 후");
// 1. 변수란? 어떤 값을 메모리 상에 기록하기 위한 공간이다. (박스 같은 개념)
int pay = 9160;
int hour = 8;
int day = 5;
int week = 4;
double tax = 0.1;
System.out.println(pay * hour); //일급
System.out.println(pay * hour * day); //주급
System.out.println(pay * hour * day * week); //월급
System.out.println(pay * hour * day * week * tax); //소득세
System.out.println(pay * hour * day * week - (pay * hour * day * week * tax)); //소득총액
}
}
위 9,160원은 현재 기준 최저시급이라고 한다. 최저시급을 8시간 * 5일 * 4주로 곱하여 한달 임금을 계산해보았다. + 10%의 세금계산까지!
일급, 주급, 월급 + 10% 세금까지 4줄 밖에 안되는 코드 안에 9,160이나 8, 5 ,4 등이 반복해서 들어가는 것을 확인할 수 있다. 위 코드는 올해까지는 활용할 수 있으나 내년이 되면 활용할 수 없고 노동시간이나 일 수 등이 변경되면 다 새로 작성해야 한다. 그래서 우리는 변수를 선언하고 값을 배정(초기화)하여 변화하는 데이터에 능동적으로 대응할 수 있도록 코드를 작성한다.
변수 사용의 이점은 다음과 같다.
- 값의 의미를 부여하기 위함(가독성이 좋아짐)
- 한 번 값을 저장해두고 계속 사용할 수 있음
- 유지보수에 용이
다음으로 변수 선언이라는 메소드를 만들어 보았다.
public void declareVariable() {
/*
* 3. 변수의 선언 (값을 기록하기 위한 변수를 메모리상 공간에 확보해놓겠다)
* -> 변수를 만들겠다
* [표현법] 자료형 변수명;
* 자료형 = 어떤 종류의 값을 담을 지, 어떤 크기의 값을 담을지 정하는 것. 박스의 모양과 크기
* 변수명 = 변수의 이름 정하기 (의미부여해서 이름 짓기)
*
* 주의할점
* - 변수명은 소문자로 시작
* - 여러 단어일 경우 낙타표기법
* - 특정 영역({}) 안에는 동일한 변수명으로 다시 변수 선언 불가 특정영역 = method?
* - 특정 영역({}) 안에서 선언된 변수는 해당 영역 안에서만 사용 가능 (지역변수개념)
*
* > 변수에 대입
* [표현법] 변수명 = 값;
*
* > 변수 선언과 동시에 대입
* [표현법] 자료형 변수명 = 값;
*
*/
//---자료형 종류---
// 1. 논리형 (논리값 = true/false)
//boolean bool;
//bool = true;
boolean bool = false; //변수 선언과 동시에 대입(초기화)
System.out.println("bool의 값 = " + bool);
bool = true;
System.out.println("bool의 값 = " + bool);
boolean bool2 = 1 + 3 < 2 * 6;
// 변수선언 > 대소비교 > 값 초기화 순서로 진행
System.out.println("bool2의 값 = " + bool2);
// 2. 숫자형
// 2-1. 정수형
byte bNum = -128; // 1byte = 2의 8제곱 (-128 ~ 127)
short sNum = 30000; // 2byte = 2의 16제곱 (-32,768 ~ 32,767)
int iNum = 1000000000; // 4byte = 2의 32제곱 (-2,147,483,648 ~ 2,147,483,647)
// 정수형의 가장 대표적인 자료형 (기본형)
long lNum = 10000000000l; // 8byte = 2의 64제곱 (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
// 2-2. 실수형
float fNum = 4.0f; // 4byte
double dNum = 8.0; // 8byte
//실수형의 가장 대표적인 자료형 (기본형)
//float 보다 더 자세한 값을 알 수 있음 = 정확
// 3. 문자형
char ch = 'A'; // 2byte
ch = '강';
// ------------------- 기본자료형 (8개) --------------------
// 4. 문자열 (참조자료형) --> 추후 다시
String str = "ABC";
// 번외 (큰 숫자 값을 입력할 때 _를 활용해 가독성을 향상 시킬 수 있음)
int etc = 999_999_999;
System.out.println(etc);
변수는 값을 담는 상자와 같다. 사과를 담을지, 수박을 담을지 담기는 값에 따라서 그 크기와 종류를 달리해야한다.
변수의 선언 방식은 두 가지 형태가 있다.
1. 변수 선언과 변수 값 대입(초기화)를 각각 하는 방식
[자료형(또는 참조자료형] [변수명];
[변수명] = 값;
2. 변수 선언과 변수 값 대입(초기화)를 한번에 하는 방식
[자료형(또는 참조자료형] [변수명] = 값;
* 당연히 2번 방식이 효율적이다.
자 변수를 선언하는 방법은 알았는데 그럼 변수가 무엇이고 변수의 종류는 무엇이 있을까? 알아보자.
변수는 기본적으로 두개의 형태가 있다. 자료형과 참조자료형
자료형은 3가지 종류의 유형으로 나눠진다.
-논리형 : 논리형은 true 와 false 두 개의 값을 가지며
1. boolean : 1byte의 메모리를 할당한다. true 와 false 두 개의 값만 초기화할 수 있다.
ex) boolea a = true;
-숫자형 : 숫자형은 정수형과 실수형으로 또 다시 나뉜다.
--정수형 : 분수(소수점이 들어간 숫자)를 제외한 음수와 0 양수
2. byte : 정수형 중에서도 가장 작은 값을 다룰 수 있다. 1byte의 메모리를 할당한다. -128 ~ 127
2의 8제곱 / 2 만큼의 값을 초기화할 수 있다. (나누기 2하는 이유는 정수는 양수 뿐만 아니라 음수도 있기 때문. 즉 -128 ~ 127까지의 값을 넣을 수 있다. 왜 128은 담지 못할까?? 바로 정수에는 0을 포함하기 때문에 0부터 숫자를 세야한다 곧 0~127 = 128개이다.)
※ 1byte는 8비트와 같다. 컴퓨터는 이진법을 사용하고 1개의 비트에 0과 1의 값을 넣을 수 있다. 즉, 비트의 자릿수만큼 값을 넣을 수 있는데 1비트는 2 / 2비트는 2x2 / 3비트는 2x2x2 가 된다. 즉, 비트의 자리수는 2의 n제곱(n=비트 자리수)과 같다.
3. short : 2byte의 메모리를 할당한다. 2의 16제곱 / 2 만큼의 값을 초기화할 수 있다. -32,768 ~ 32,767
4. int : 4byte의 메모리를 할당한다. 2의 32제곱 / 2 만큼의 값을 초기화할 수 있다. -2,147,483,648 ~ 2,147,483,647
대입할 수 있는 값이 크고 실생활에서 나타날 수 있는 값을 대부분 커버할 수 있기 때문에 기본형으로 사용한다.
5. long : 8byte의 메모리를 할당한다. 2의 64제곱 / 2 만큼의 값을 초기화할 수 있다.
-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 (어마무시하게 큰 수들을 초기화할 수 있다.)
long이 거의 모든 수를 다 초기화할 수 있음에도 long 대신 int를 사용하는 이유는 메모리 할당에 있다. long은 8byte의 메모리를 할당하는데 사실 일상에서 억을 넘어 조단위의 숫자를 쓸 일은 없다고 봐도 무방하다. 즉, 담으려는 값에 비해서 박스가 지나치게 크기 때문에 비효율이 발생한다. 이러한 비효율은 기업의 입장에선 돈 낭비로 이어질 것이다.
※ long은 다른 변수와 다르게 값을 초기화 할 때 값 뒤에 반드시 l(엘)을 붙여줘야 한다.
ex) long a = 1000000000000L;
--실수형 : 분수(소수점이 들어간 숫자)
6. float : 4byte의 메모리를 할당한다.
※ long과 마찬가지로 값을 초기화 할 때 값 뒤에 반드시 f(에프)를 붙여줘야 한다.
ex) float a = 0.1f;
7. double : 8byte의 메모리를 할당한다.
double은 정수형 때와 다르게 메모리 할당량이 큼에도 불구하고 실수형의 기본형으로 사용된다. 이유는 정수형에서는 메모리 할당 크기가 곧 값을 초기화할 수 있는 크기였지만 실수형에서는 메모리의 크기가 정확도를 의미하기 때문이다. 고로 보다 정확한 값을 얻기 위하여 float 대신 double을 사용한다.
※ float과 double의 차이를 설명하는 애플코딩 유튜브 영상 https://youtu.be/-GsrYvZoAdA
-문자형 : 한 개의 문자를 표현한다
8. char : 2byte의 메모리를 할당한다. 글자에는 유니코드라는 할당된 번호가 존재한다. 0부터 65,535개의 문자를 담고 있다.
char a = '가'; 라던지 'a'; / 'b'; 등 반드시 한 개의 글자만 초기화할 수 있다.
참조자료형은 단 하나 뿐이다
String : String은 위 기본자료형 8개와 다르며 다룰 내용이 많아 추후 다시 다룬다고 한다. 변수 선언과 초기화는 아래와 같다.
ex) String str = "abc";
핵심적인 내용을 정리했고 아래 내용도 추가로 학습해두자!
// 번외 (큰 숫자 값을 입력할 때 _를 활용해 가독성을 향상 시킬 수 있음)
int etc = 999_999_999;
System.out.println(etc);
// 4. 변수 명명 규칙
// - 변수명 중복 불가 단, numBer는 가능 (대소문자 구분함)
int number;
// - 변수명으로 예약어(이미 자바에서 사용되고 있는 키워드들) 사용 불가
/*
int true;
int public;
int class;
*/
// - 숫자 가능 (단, 숫자로 시작하는 것은 안됨)
/*
int age1;
int 1age;
*/
// - 특수문자 가능 (단, _과 $만 가능 맨 앞에도 중간에도 뒤에도 가능, 위치 상관 없음)
int num_ber;
int num$ber;
//int #number;
//int !number;
// * 낙타표기업 지키기 camelcase + 한글은 쓰지말자
String userName; // 관례상 권장 표기법
}
public void constant() {
/*
* 5. 상수란?
* 변수와 동일하게 특정 값을 메모리상에 기록하기 위한 박스 같은 존재
* 변수와의 차이점으로 값을 변경하는게 불가
* 즉, 한번 대입된 값은 더 이상 변경이 불가능
*
* [표현법] final 자료형 상수이름;
* 상수형은 다 대문자로 하는걸 권장
*/
int age = 20;
age = 30; // 변수는 변경 가능
final int AGE = 60;
//AGE = 30;
}
/*
* - 값(data, literal) = 프로그램 상 필요한 명시적인 data 또는 사용자가 마우스 또는 키보드로 입력한 data
* - 변수 = 값을 메모리 상에 저장하기 위한 공간 (박스 같은 존재)
* (한 개의 값만 담을 수 있고 / 자료형에 맞는 값만 담을 수 있고 / 새로운 값을 다시 대입할 수 있음)
* - 상수 = 변수와 비슷하나 값 변경 불가능
* (final 붙여서 선언 / 상수명은 다 대문자로 작성하는 것을 권장)
*/
'JAVA' 카테고리의 다른 글
[JAVA] 06. 연산자 (0) | 2022.10.17 |
---|---|
[JAVA] 05. 형변환 (0) | 2022.10.17 |
[JAVA] 4. Scanner (1) | 2022.10.14 |
[JAVA] 2. 다른 클래스에 있는 메소드 호출하기 (0) | 2022.10.13 |
[JAVA] 1. Package&Class 생성 (0) | 2022.10.13 |