본문 바로가기

JAVA

[JAVA] 3. 변수

줄 글로 내용을 작성하기에 공부 시간을 너무 뺏어먹는 느낌이 든다. 배운 걸 복습하는 구조로 기록하겠다!

 

변수를 학습하기 위해 새로운 패키지와 클래스를 생성했다.

//는 학습 목표다.

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