Java 변수와 타입 (1)

개발자가 되고 싶어요·2023년 2월 20일
0
post-thumbnail

자바의 변수는 다양한 타입의 값을 저장할 수 없다. 즉, 정수형 변수에는 정수값만 저장할 수 있고, 실수형 변수에는 실수값만 저장할 수 있다.

변수 선언

int A; 
// int는 타입 A는 변수 이름
// 정수(int) 값을 저장할 수 읶는 A변수 선언

double B; 
// double은 타입 B는 변수 이름
// 실수(double) 값을 저장할 수 읶는 B변수 선언

Java의 변수는 캐멀 스타일로 작성하는 것이 관례이다.

변수 값 저장

int A;
A = 100; //대입 연산자 '='를 사용하여 저장

변수선언은 저장되는 값의 타입과 이름만 결정한 것이지 메모리에 할당된 것은 아니다. 변수에 최초로 값이 대입될 때 메모리에 할당되고. 해당 메모리에 값이 저장된다.

변수 선언과 동시에 대입

int C = 100;

초기화 되지 않은 변수는 메모리에 할당되지 않았기 때문에 변수를 통해 메모리 값을 읽을 수 없다.

int value;
int result = value + 10;

변수 value가 선언 되었지만, 초기화하지 않았기 때문에 value + 10에서 value 변수값은 읽어올 수 없다.

수정코드

int value = 30;
int result = value + 10;

타입

정수타입

변수는 선언될 때의 타입에 따라 저장할 수 있는 값의 종류와 허용 범위가 달라진다. 자바는 정수,실수,논리값을 저장할 수 있는 기본 타입 8개를 제공한다.

정수: byte, char, short, int, long
실수: float, double
논리(true/false): boolean

정수타입 메모리 사용 크기순

타입 메모리 크기 저장되는 값의 허용 범위
byte 1byte 8bit -2^7 ~ (2^7-1) -128 ~ 127
short 2byte 16bit -2^15 ~ (2^15 -1) -32,768 ~ 32,767
char 2byte 16bit 0 ~ (2^16-1) 0 ~ 65535(유니코드)
int 4byte 32bit -2^31 ~(2^31-1) -2,147,483,648 ~ 2,147,483,647
long 8byte 64bit -2^63 ~(2^63-1) -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 
정수 타입 메모리 할당 크기

종류byte            short           int            long            
메모리 사용 크기(단위 bit)8   163264

 

문자 타입

하나의 문자를 작은따옴표로(') 감싼 것을 문자 리터럴이라고 한다. 문자 리터럴은 유니코드로 변환되어 저장된다. 자바는 이러한 유니코드를 저장할 수 있도록 char 타입을 제공한다.

char c1 = 'A'; //'A' 문자와 메핑되는 숫자: 65로 대입
char c3  = '가';  //'가' 문자와 매핑되는 숫자: 44032로 대입
package hello;

public class hello {
	public static void main(String[] args) {
		char c1 = 'A';  	//문자 저장
		char c2  = 65;  	//유니코드 직정 접정
		
		char c3 = '가';  	//문자 저장
		char c4  = 44032;  	// 유니코드 직접 저장 
		
		System.out.println(c1);
		System.out.println(c2);
		System.out.println(c3);
		System.out.println(c4);
	}
}

char 타입의 변수에 어떤 문자도 대입하지 않고 단순히 초기화를 할 목적으로 작은 따옴표 두 개를 연달아 붙인 빈(empty) 문자를 대입하면 컴파일 에러가 생긴다. 이 경우에는 공백 하나를 포함하여 초기화 해야한다.

실수 타입

실수 타입에는 float과 double이 있으며 다음과 같이 메모리 할당 크기와 저장되는 값의 범위를 가지고 있다.

최상위 1bit는 양수 및 음수를 결정짓는 부호 bit로 0이면 양수, 1이면 음수가 된다. 지누는 float 타입은 8bit, double타입은 11bit로 표현하고 나머지 bit는 모두 기수를 표현하는데 사용된다.

double은 float보다 지수와 가수 부분의 bit수가 크기 때문에 더 크고 정밀한 실수를 저장할 수 있다.

코드에서 실수 리터럴

double x = 0.25;
double y = -3.14;
double x = -3.14
double y = 0.12E-2

기본 타입이 double이기 때문에 double 타입 변수에 대입해야 한다. float 타입에 대입하고 싶다면 리터럴 뒤에 소문자'f'나 대문자 'F'를 붙여야 한다.

double var = 3.14;
double var = 314e-2
float var = 3.14f;
float var = 3E6F;

float과 double 타입의 소수 이하 유효 자릿수 확인
, 10의 거듭제곱 리터럴 대입 출력 예제

package hello;

public class FloatDoubleExample {
	public static void main(String[] args) {
		float var1 = 0.123456789123456789f;
		double var2 = 0.123456789123456789f;
		System.out.println("var1: " + var1); // var1: 0.12345679
		System.out.println("var2: " + var2); // var2: 0.12345679104328156
		
		double var3 = 3e6;
		float var4 = 3e6F;
		double var5 = 2e-3;
		System.out.println("var3: " + var3); // var3: 3000000.0
		System.out.println("var4: " + var4); // var4: 3000000.0
		System.out.println("var5: " + var5); // var5: 0.002
	}
}

 

논리 타입

참과 거짓을 의미하는 논리 리터럴은 true 와 false이다.
논리 리터럴은 boolean 타입 변수에 다음과 같이 대입할 수 있다.

boolean stop = true;
boolean stop = false;

 
boolean 타입 변수는 주로 두 가지 상태 값을 저장할 필요가 있을 경우 사용되며, 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 사용된다.

int x = 10;
boolean result = (x == 20);
boolean result = (x != 20);
boolean result = (x > 20);
boolean result = (0 < x && x < 20);
boolean result = (x < 0 || x > 200);

 
stop 변수값에 따라 if,else 중 하나를 실행하고 연산식 결과를 boolean 변수에 저장

package hello;

public class BooleanExample {
	public static void main(String[] args) {
		boolean stop = true;
		if(!stop) {
			System.out.println("중지합니다");
		} else {
			System.out.println("시작합니다");
		}
		
		int x = 10;
		boolean result1 = (x == 20);
		boolean result2 = (x != 20);
		System.out.println("result1: "+ result1);
		System.out.println("result2: "+ result2);
	}
}

문자열 타입

작은따옴표(')로 감싼 한 개의 문자는 char 타입이지만, 큰따옴표(")로 감싼 여러 개의 문자들은 유니코드로 변환되지 않는다.

char var1 = "A"; // 컴파일 에러
char var2 = "홍길동"; // 컴파일 에러

큰따옴표로 감싼 문자들을 문자열이라고 부른다. 문자열을 변수에 저장하고 싶다면 String 타입을 사용하여야 한다.

String var1 = "A";
String var2 = "홍길동";

 
문자열 내부에 사용하는 역슬래쉬()가 붙은 문자를 이스케이프 문자라고 하고, 이스케이프 문자를 사용하면 특정문자를 포함할 수 있고, 출력에 영향을 미치기도 한다.

이스케이프 문자
\"" 문자 포함                                                                      
\'' 문자 포함                                                                       
\\ \\ 문자 포함                                                                     
u16진수16진수 유니코드애 해당하는 문자 포함                              
\t출력 시 탭만큼 띄움                                                          
\n출력 시 줄바꿈 (라인피드)                                                 
\r출력 시 캐리지 리턴                                                           
package hello;

public class StringExample {
	public static void main(String[] args) {
		String name = "홍길동";
		String job= "프로그래머"; 
		System.out.println(name); //홍길동
		System.out.println(job);  //프로그래머
		
		String str = "나는 \"자바\"를 배웁니다";
		System.out.println(str); // 나는 "자바"를 배웁니다
		
		str = "번호\t이름\t직업 ";
		System.out.println(str); // 번호	이름	직업 
		
		System.out.println("나는\n");
		System.out.println("자바\n");
		System.out.println("배웁니다\n");
        
        // 	나는

		 	자바를

			배웁니다
	}
}

 

텍스트 블럭 문법

큰따옴표 3개로 감싸면 이스케이프, 라인 피드 등 상관없이 작성된 문자열 그대로를 보여준다.

String str = """
...

""";
package hello;

public class TextBlockExample {
	public static void main(String[] args) {
		String str1 = "" + 
		"{\n" + 
		"\t\"id\": \"winter\",\n" +
		"\t\"name\": \"눈송이\"\n" +
		"}";

		String str2 = """ 
				
				{
					"id": "winter",
					"name": "눈송이"
				}
				""";
		System.out.println(str1);
		System.out.println("---------------------------------");
		System.out.println(str2);
		System.out.println("---------------------------------");
	
		String str = """
			나는 자바를 \
			학습니다. 
			나는 자바 고수가 될 겁니.	
			""";
		// 줄바꿈 하지 않고 출력하고 싶을경우 \역래쉬를 입력하면 한줄에 출력된다.
		System.out.println(str);
	}
}

//result
{
	"id": "winter",
	"name": "눈송이"
}
---------------------------------

{
	"id": "winter",
	"name": "눈송이"
}

---------------------------------
나는 자바를 학습니다.
나는 자바를 공부합니다.

\가 없을 경우
나는 자바를 
학습니다.

str1과 str2는 동일한 문자열이 저장된다.

profile
I want to be a Backend Developer

0개의 댓글