#변수
변하는 것
: 일반적인 변수
#상수 (=constant value)
변하지 않는 것
: 값이 정해지면 변하지 않는 것
상수라고 꼭 수가 아니라
변하지 않는 '값'이라고 생각하기
자바에서는 값을 다루기 위해서는 저장공간이 필요하다
변수는 변할 수 있다는 것이므로
어떤 공간을 마련해 놓고 변할 수 있는 값을
넣고 빼는 공간이 필요하므로 저장공간도 세트 개념이다
저장공간의 선언
Int number
Int (=Integer의 약자)로
저장공간의 타입 (=접시의 종류)이다
숫자 종류를 담겠다는 의미
number는 저장공간의 이름
(=접시 이름)이다
변수는 변수의 타입을 정하고 이름을 정하는
'선언'이 필요하다
선언 다음은 값의 저장이며
할당이라고도 불린다
(= 선언과 할당이 변수를 만드는 과정이다)
자바 프로그램에서 저장공간에 값을 저장하는 방법 2가지
1. 선언과 동시에 값을 할당
(= 변수로 선언 및 초기화)
Int number = 10 ;
저장공간 타입 + 저장공간 이름 = 저장할 값(담을 음식)
2. 선언 이후에 값을 저장할 경우, 덮어쓰기로 값 저장하기
(= 변수의 값을 바꾼다
= 덮어쓰기)
number = 10 ;
저장공간 이름 = 저장할 값
저장공간의 개념을 이해한 상태에서
결국 변수와 상수는
변수 : 변하는 저장공간으로
자바 프로그램에서 저장하는 대부분의 값은
변하는 것, 변수가 많다
상수 : 변하지 않는 저장공간
= 한번 할당을 하면 바꿀 수 없는 저장공간
예) pi -> 3.141592...
예) final Int number = 10 ;
number = 11 ;
final이기 때문에 11로 덮어쓰기 할 수 없음으로
에러가 난다!
저장공간의 타입
기본형과 참조형
1. 기본형
숫자형, 문자형, Boolean
2. 참조형
뭔가 복잡한 녀석들
한 번에 저장하기 어렵고 어딘가에 별도로 저장하여
저장한 주소값을 참조하는 식으로 저장
1. 기본형 변수
1) 논리형 변수 : boolean
ture : 1
false : 2
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화
flag = false; // 2. False 값으로도 저장할 수 있습니다.
2) 문자형 변수 : char
A와 1과 같은 문자 하나만 저장
문자열 X
char alphabet = 'A'; // 문자 하나를 저장합니다.
3) 정수형 변수 :
byte, short, int, long
0, 1, 2,.. 99와 같은 정수형 숫자값을 저장
정수형 변수 표현 범위에 따라 변수타입을 나눔
byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.
short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.
int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.
long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.
정수형 리터럴 구분값(리터럴 = 데이터값)**
`int` 와 `long` 의 데이터값(리터럴)을 구분하기 위한 구분자로 long으로 담을 숫자뒤에 L을 붙입니다.
이런식으로 데이터값(리터럴) 뒤에 붙이는 구분값을 “접미사”라고 부릅니다.
long형은 L을 붙임
byte 저장공간 = 1 byte
short 저장공간 = 2 byte
int 저장공간 = 4 byte
long 저장공간 = 8byte
막간의 실습
byte byteNumber = 127; // -128 ~ 127 (1byte = 8bit=256가지를 표현) *bit는 0과 1을 표현하는 최소단위
short shortNumber = 32767; // -32,768 ~ 32,767
int intNumber = 21378943;
long longNumaber = 218345L;
System.out.println(byteNumber);
System.out.println(shortNumber);
System.out.println(intNumber);
System.out.println(longNumaber);
4) 실수형 변수
float, double
0.123, 0.9999.. 같은 소수점 실수값을 저장
실수형 변수 표현 범위
표현 범위가 매우 넓어서
정수형 변수에서 담지 못할 수 있음
= float 가 long 보다 더 넓은 범위를 표현하기 때문에 자동 형변환이 안 된다
long longNumber = 3.14f; // long < float 자동 형변환 불가
float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값
float와 double의 차이는 표현 범위가 다름
컴퓨터는 정수와 소수로 표현되는데
소수점은 고정소수점과 부동소수점으로 나뉜다
부동소수점.... 추가 공부가 필요해서 패스
참조형 변수는 문자열 변수와 그 외로 나뉜다
참조형 변수는 단일 공간에 담을 수 없음
어느 공간에 있는 주소값을 바라보는 변수
복잡한 친구다 ^^
길이를 예측할 수 없는 변수
1. 문자열 변수 : spring
문자형 변수 char가 여러 개 모였을 때 완성
Apple = A+p+p+l+e
String message = "Hello World"; // 문자열을 저장합니다.
2. 그 외
Object, Array, List
객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장
List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장합니다.
// 참조형! 배열 변수
int[]a = {1,2,3};
System.out.println(Arrays.toString(a));
레퍼 클래스 변수
Wrapper Class
기본형 변수(int, byte, boolen..)를 클래스로 감싸는 변수
레퍼 클래스로 한 번 감싸면 유용한 기능을 사용가능
기본형 변수 타입명에서 첫 글자를 대문자로 바꾸어서 래퍼 클래스를 정의
1) 박싱
기본 타입에서 래퍼 클래스 변수로 변수를 감싸는 것
2) 언박싱
래퍼 클래스 변수를 기본 타입 변수로 가져오는 것
// 박싱 VS 언박싱
// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);
// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
// 레퍼 클래스 변수
int number = 21;
Integer num = number; //boxing
System.out.println(num.intValue()); //unboxing
모든 기본 타입에는 래퍼 클래스가 있다.
클래스는 객체지향 언어인 Java 의 핵심기능이다
그렇기 때문에 클래스로 변수를 관리하면
객체지향의 많은 기능을 사용할 수 있게된다
숫자와 문자
아스키코드를 통해 숫자를 문자(char)로 매핑해서 표현한다
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner는 입력한 값을 저장
int asciiNumber = sc.nextInt();
char ch = (char)asciiNumber; // 문자로 '형변환'을 해주면 숫자에 맞는 문자로 표현된다
System.out.println(ch);
}
}
//값
//97
//a
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // Scanner는 입력한 값을 저장
char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기 위해 charAt(0) 매서드를 사용
int asciiNumber = (int)letter; //숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현
System.out.println(asciiNumber);
}
}
//값
a
97
문자형과 문자열
문자형은 기본형
문자열은 참조형
1. 선언 관점에서 차이점
문자형 (Char)
문자 한 개만 저장하며 따옴표를 사용하여 값을 지정 (ex. ’A’)
char alphabet = 'A'; // 문자 하나를 저장합니다.
문자열 (String)
문자 여러 개를 문장형태로 저장하며 큰따옴표를 사용하여 범위를 지정 (ex. “ABCDEFG”)
String message = "Hello World"; // 문자열을 저장합니다.
2. 저장 관점에서 차이점
문자 (char)
문자 뒤에 \0(널문자)가 없습니다.
(1 byte 만 쓰기 때문에 끝을 알아서 데이터만 저장하면 됩니다.)
문자열 (String)
문장의 끝에 \0(널문자)가 함께 저장이 됩니다.
(몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 합니다.)
+ 참조형
복잡한 친구
참조형 변수 = 주소형 변수
기본형 변수는 실제 값을 저장하는 저장공간인 반면
참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장한다.
=크기가 크기 때문에 별도의 저장공간이 필요하다는 뜻
다시 말해 참조형 변수는 주소값을 저장하는 주소형 변수라고 불다.
저장 관점에서 차이점
기본형 변수 : 원본값이 Stack 영역에 있다
참조형 변수 : 원본값이 Heap 영역에 있다
Stack 영역에는 따로 저장해둔 원본값의 Heap 영역주소를 저장한다
Stack 영역 vs Heap 영역
Stack는 정적으로 할당된 메모리 영역
크기가 몇 byte인지 정해져 있는 기본형 변수를 저장한다
또 크기가 정해져 있는 참조형 변수의 주소 값도 저장한다.
Heap의 경우에는 동적으로 할당된 메모리 영역
크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장한다
동적 = 알 수 없을 때 = 동적으로 그 크기에 맞게 커진다
예) int는 4바이트를 사용하는 정적인 영역과 반대 개념
입력&출력
입력
Java 프로그램에서는
Scanner.in 객체의 next() 명령을 사용해서 입력
출력
System.out 객체의 println() 명령을 사용해서 출력
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next(); // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.
Scanner sc = new Scanner(System.in);
String input = sc.next();
System.out.println("입력값 : " + input); // 입력한 글자를 출력합니다.
// 실행 결과
{입력}
입력값 : {입력}
비트&바이트
변수는 Byte(바이트) 에 나누어서 저장한다
Byte = 8 Bit
Bit
Bit(비트)는 0,1 형태의 2진수 데이터
로컴퓨터가 저장(표현)할 수 있는 최소 단위
정수형 값
10진수 숫자(0~10범위의 숫자)
2진수(0~1범위)Bit 로 저장(표현)
4개의 Bit로 16진수 숫자(0~F(16)범위의 숫자)를
2진수(0~1범위)Bit 로 저장(표현).
형변환
변수의 타입을 바꾸는 방법
예) 문자열 -> 숫자,
숫자 -> 실수,
실수 -> 정수
public static void main(String[] args) {
// double or float형 -> int
// 실수 -> 정수 (0.xxx -> 0)
// 정수 - > 실수
int intNumber = 10;
double doubleNumber = (double)intNumber;
float floatNumber = (float)intNumber;
System.out.println("intNumber => " + intNumber);
System.out.println("doubleNumber => " + doubleNumber);
System.out.println("floatNumber =>" + floatNumber);
값
intNumber => 10
doubleNumber => 10.0
floatNumber =>10.0
자동 형변환
자동으로 형변환해주는 것
자동 타입변환은 작은 크기의 타입에서 큰 크기의 타입으로
저장될 때 큰 크기로 형변환이 발생
예시
public static void main(String[] args) {
byte byteNumber = 10;
int intNumber = byteNumber;
// int -> long number 형변환
intNumber = 100;
long longNumber = intNumber;
System.out.println(longNumber);
// int -> double
intNumber = 200;
double doubleNumber = intNumber;
System.out.println(doubleNumber);
// 작은 크기의 타입이 큰 크기의 타입가 '계산'될 때, 자동으로 큰 크기의 타입으로 형변환이 된다
int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber ;
System.out.println("Plus ==> "+ result);
- 작은 타입 > 큰 타입 형변환시 (자동 형변환)
- 더 큰 표현범위를 가진 타입으로 변환되는것이라 값의 손실이 없다
- 컴파일러가 자동으로 형변환을 해준다.
- 큰 타입 > 작은 타입 형변환시 (강제 형변환 = 캐스팅)
- 더 작은 표현범위를 가진 타입으로 변환된는것이라 값의 손실이 생긴다.
- 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 한다.
출처 : 스파르타코딩클럽 <내일배움캠프>
[Java 문법 종합반] 최원장 튜터님
'Java 문법 종합반' 카테고리의 다른 글
[Java 문법 종합반] 연산자, 조건문, 반복문, 컬렉션, 배열, 가변배열 (0) | 2023.05.25 |
---|---|
[Java 문법 종합반] 1주차 : JVM 및 프로젝트 생성 / TIL (0) | 2023.05.22 |
Java 문법 종합반 시작! (0) | 2023.05.22 |