<목차>
3. 변수와 상수
4. 변수를 담는 저장공간의 종류
5. 변수타입 간의 변환
변수와 상수
<변수>
-변하는 저장공간
-java 프로그램에서 저장하는 대부분의 값들은 변수
-하나의 값을 저장할 수 있는 저장공간이라고 보면 됨
-변수에 변수명을 붙여서 필요한 값을 저장
-저장되는 값의 형태에 따라서 여러가지 모습을 지님
<상수>
-변하지 않는 저장공간
-저장 효율을 위해 변하지 않을 값을 따로 저장하는 곳이 있다.
*저장 공간의 선언
-java 프로그램에서 값을 다루기 위해서는 값을 저장해둘 저장 공간의 선언이 필요
-선언할 때는 저장 공간에 담을 값의 타입과 이름을 명시해야함
---값의 타입: 저장 공간의 종류
---값의 이름: 저장 공간의 이름
*값의 저장
-방법1 : 선언과 동시에 저장, 초기화
-방법2: 선언 이후에 값을 저장, 덮어쓰기
변수 저장공간의 종류
-저장공간은 변수와 상수로 나뉘지만 대부분 변수 용도로 쓰이기 때문에 편의상 변수라고 지칭하는 경우가 많음
-변수의 종류는 저장공간에 담을 수 있는 데이터 종류
-변수는 저장공간에 담는 데이터
*저장공간 1칸 = 1byte
<기본형 변수>
1. 논리형 변수 : boolean
-true, false 값만 저장
boolean flag = true;
---타입이름 = 값;
2. 문자형 변수 : char
-'A', '2'와 같은 문자 하나만 저장
-문자열이 아니기 때문에 '작은따옴표'로 묶어야함/ "큰따옴표"XXXX
char alphabet = 'A';
3. 정수형 변수 : byte, short, int, long
-0,1,2,99 와 같은 정수형 숫자 값을 지정
-정수형 변수는 각 변수 표현 범위를 넘는 숫자를 넘게 되면 오버플로우 발생, 해당 숫자를 출력하면 입력값과 다른값으로 표현됨
-byte : -128 ~ 127
-short(2byte) : -32768 ~ 32767
-int(4byte) : -21억 ~ 21억
-long(8byte) : 9백경 정도의 매우 큰 수를 저장할 수 있음
byte byteNumber = 127;
short shortNumber = 32767;
int intNumber = 2148484;
long longNumber = 28283848L;
---long은 숫자 뒤에 알파벳 L을 붙여서 표기
-short 에 32767 보다 높은 값을 넣어봤더니 에러가 뜸
*정수형 리터럴 구분 값(리터럴=데이터값)
-int와 long의 데이터 값을 구분하기 위한 구분자로 long을 담을 숫자 뒤에 L을 붙인다.
-이런식으로 리터럴 뒤에 붙이는 구문 값을 "접미사"라고 부른다
4. 실수형 변수 : float, double
-0.123, 0.9999와 같은 소수점 실수값을 저장
-실수형 변수도 표현범위를 넘는 숫자를 넣게 되면 오버플로우가 발생
-특히, 실수는 표현 범위가 매우 넓어서 정수형 변수에서 담지 못할 수 있음
-float(4byte): 3.4* -10^38 ~ 3.4*10^38 / long보다 큼
-float는 소수점 7자리까지 표현 가능
-double(8byte): 1.7*-10^308 ~ 1.7*10^308
-double은 소수점 16자리까지 저장 가능
float floatNumber = 0.123f;
double doubleNumber = 0.123123123;
-float는 부동소수점 방식으로 숫자를 지정하기 때문에 4byte만 사용해도 long 보다 더 넓은 범위를 표현 가능
----float가 long보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안됨
*부동소수점 방식
-가수와 지수를 구분해서 저장하고 이 값들을 곱한 값을 저장(표현)하는 방식
*실수형 리터럴 구분 값
-float와 double의 리터럴을 구분하기 위한 구분자로 float로 담을 숫자 뒤에 f를 붙임
<참조형 변수>
-어딘가에 별도로 저장해놓은 데이터를 참조해서 가져온다고 생각하면 쉬움
-주소형 변수
-다른 기본형 변수가 실제 값을 저장하는 저장공간이라면, 참조형 변수는 실제 값이 아닌 원본 값의 주솟값을 저장
*저장 관점에서 차이점
-기본형 변수 : 원본 값이 stack 영역에 있음
-참조형 변수 : 원본 값이 heap 영역에 있음
---stack 영역에는 따로 저장해둔 원본 값의 heap 영역 주소를 저장
*stack 영역
-정적으로 할당 된 메모리 영역
-크기가 몇 byte인지 정해져 있는 기본형 변수를 저장
-크기가 정해져 있는 참조형 변수의 주소값도 저장
*heap 영역
-동적으로 할당된 메모리 영역
-크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장
1. 문자열 변수 : String
-"apple", "텍스트" 와 같은 문장을 저장
-"큰따옴표"로 묶음
String message = "Hello World;
2. 그 외 : Object, Array, List...
-객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
List<int> alphabet = [0,1,2,3];
---기본형 변수 여러개를 저장
<래퍼 클래스 변수>
-wrapper calss : 기본형 변수를 클래스로 한번 랩핑하는 변수
-기본형 변수 타입명에서 첫 글자를 대문자로 바꿔서 래퍼 클래스를 정의
-래퍼 클래스를 사용하는 이유
: 클래스는 객체지향 언어인 java의 핵심기능, 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게 됨
기본타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
*박싱 vs 언박싱
-박싱 : 기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것
-언박싱 : 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것
int number = 21;
Integer num = number; // boxing
System.out.println(num.intValue()); //unboxing
*숫자와 문자
-저장공간에 저장하는 값은 0,1 을 통한 숫자 값을 저장
-문자를 숫자로 저장하는 방법
--숫자(int)를 문자(char)로 매핑해서 표현
--여러가지 방법이 있지만 java에서는 기본적으로 아스키코드라는 규칙으로 문자를 저장하고 있음
-숫자 -> 문자
Scanner sc = new Scanner(System.in);
int asciiNumber = sc.nextInt();
char ch = (char)asciiNumber;
-문자 -> 숫자
char letter = sc.nextLine().charAt(0);
int asciiNumber = (int)letter;
*문자 vs 문자열
1. 선언 관점에서 차이점
-문자(char) : 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정
char alphabet = 'A';
-문자열(String) : 문자 여러개를 문장 형태로 저장하며 쌍따옴표를 사용하여 범위를 지정
String message = "Hello World";
2. 저장 관점에서 차이점
-문자(char) : 문자 뒤에 \0(널문자)가 없음.
---1byte만 사용하기 때문에 끝을 알아서 데이터만 저장하면 됨
-문자열(String) : 문장의 끝에 \0(널문자)가 함께 저장이 됨.
---몇개의 byte를 쓸지 모르기 때문에 끝을 표시
*널문자 \0 - 값이 0인 제어문자
*입력 & 출력
-입력 : java 프로그램에서는 기본적으로 System.in 객체의 next() 명령을 사용해서 입력받음
Scanner sc = new Scanner(System.in);
String input = sc.next();
-출력 : java 프로그램에서는 기본적으로 System.out 객체의 println() 명령을 사용해서 출력
System.out.println("입력값 : " + input);
*비트
-Bit 는 0,1 형태의 2진수 데이터로써 컴퓨터가 표현할 수 있는 최소 단위
-정수형 값은 10진수 숫자(0~10)이며 2진수(0,1) Bit로 저장
-4개의 Bit로 16진수 숫자를 2진수 Bit로 저장
*바이트
-Byte는 8개의 비트로 구성
-1바이트 내에서 숫자변수는 비트 2진수를 10진수로 저장
---10진수로는 0~255(2^8)까지 저장
-1바이트 내에서 문자 변수의 경우만 비트 2진수를 16진수로 저장(표현)
*변수 타입 별 크기 순서
byte(1) -> short(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)
-float, double이 byte 가 낮은데 크기가 큰 이유는 부동소수점 사용하기 때문
형변환
-변수 타입 바꾸기
<형변환>
-java 프로그래밍을 하다보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶은 경우, 문자열에 숫자 값을 추가하고 싶은 경우 등 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많음
-형변환은 주로 기본형 변수인 정수<->실수<->문자 들 사이에서 일어남
<예시>
1. 문자열 -> 숫자
2. 정수 -> 실수
-int -> double or float
int intNumber = 10;
double doubleNumber = (double)intNumber;
float floatNumber = (float)intNumber;
3. 실수 ->정수
-double or float -> int
double doubleNumber = 10.101010;
float floatNumber = 10.1010f;
//double -> int 변환
int intNumber;
intNumber = (int)doubleNumber;
System.out.println("Double Type =>" +doubleNumber);
System.out.println("Int Type =>" + intNumber);
//float -> int 변환
int intNumber;
intNumber = (int)floatNumber;
System.out.println("Float Type =>" + floatNumber);
System.out.println("Int Type =>" + intNumber);
<자동 형변환>
-형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환되는 케이스가 있음
-프로그램 실행 도중에 값을 저장하거나 계산할 때 자동으로 타입 변환이 일어남
1. 자동 타입 변환은 작은 크기 타입에서 큰 크기의 타입으로 저장될 때 큰 크기로 형변환이 발생
-변수 타입별 크기 순서
byte(1) -> short(2byte) -> int(4byte) -> long(8byte) -> float(4byte) -> double(8byte)
2. 작은 크기 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생
*작은타입 -> 큰타입 (자동 형변환)
-더 큰 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 없음
-값의 손실 없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해줌
*큰타입 -> 작은타입 (강제 형변환 = 캐스팅)
-더 작은 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 생김
-값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 함
'TIL(Today I Learned) > java' 카테고리의 다른 글
[내일배움캠프/2주차] JAVA 문법종합반 3주차 강의 1. 클래스 (0) | 2024.10.18 |
---|---|
[내일배움캠프/2주차] JAVA 문법종합반 2주차 강의 2 (2) | 2024.10.14 |
[내일배움캠프/2주차] JAVA 문법종합반 2주차 강의 1 (2) | 2024.10.12 |
[내일배움캠프/2주차] JAVA 문법종합반 1주차 강의 1 (5) | 2024.10.08 |