과제 하기 전에 복습을 한번 더!
1-2. 변수 (접시에 값 담기)
1-2-1. 변하는 것과 변하지 않는것
1-2-1.1 저장공간의 선언과 값의 저장
Int number;
(1) 저장공간의 선언
1) Int : 저장공간 타입 (접시 종류)
2) number : 저장공간 이름 (접시 이름)
(예시) Int number; // number 이라는 int (숫자) 타입의 저장공간을 선언 String name; // name 이라는 이름의 String (문자열) 타입의 저장공간을 선언 |
(2) 값의 저장
프로그램에서 값을 저장하는 방법은 2가지이다.
선언과 동시에 저장을하는 "초기화"와 선언 이후에 값을 저장하는 "덮어쓰기"가 있다.
1) 초기화
Int number = 10;
2) 덮어쓰기
number = 10;
(예시) int number = 10; // 선언과 동시에 값을 저장공간에 저장 (초기화) number = 11; // 선언 이후에 다른 값을 저장공간에 저장 (덮어쓰기) |
1-2-1.2 변수와 상수
수로 끝나지만, 숫자만 말하는 것이 아니라, 하나의 값을 저장할 수 있는 저장 공간을 의미한다.
변수 : 변하는 저장 공간
상수 : 변하지 않는 저장 공간
1-2-2. 저장공간의 종류 (변수 타입)
1-2-2.1 변수의 종류와 범위
(1) boolean | 논리형 변수 | true / false 값만 저장 (예시) boolean flag = true; // 1. 논리형 변수 boolean으로 선언 및 true 값으로 초기화 flag = false; // 2. false 값으로도 저장할 수 있음 |
(2) char | 문자형 변수 | 'A','1' 처럼 문자 하나만 저장 (예시) char alphabet = 'A'; // 문자 하나를 저장합니다. |
(3) byte, short, int, long | 정수형 변수 | 0,1,2,99 와 같은 정수형 숫자값을 저장 <정수형 표현 범위> 각 변수 표현 범위를 넘는 숫자를 넣게 되면, 오버플로우가 발생하고, 해당숫자를 출력해보면, 입력값과 다른 값으로 표현됩니다. 그렇기 때문에 각 변수들의 표현 범위를 잘 알아야 버그가 생기지 않습니다. 1) byte : 1바이트 2) short : 2바이트 3) int : 4바이트 4) long : 8바이트 byte byteNumber = 127; short shortNumber = 32767; int intNumber = 2147483647; long longNumber = 2147483647L; <정수형 리터럴 구분값> int와 long의 데이터값(리터럴)을 구분하기 위한 구분자로 long을 담을 숫자 뒤에 L 을 붙입니다. 이럴 식으로 리터럴 뒤에 붙이는 구분값을 "접미사"라고 한다. |
(4) float, double | 실수형 변수 | 0.123, 0.99999와 같은 소수점 실수값을 저장합니다. 실수는 표현범위가 매우 넓어서 정수형 변수에서 담지 못할 수도 있다. 1) float (4byte) : long보다 큼 2) double (8byte) : long보다 큼 *고정 소수점과 부동 소수점 float은 부동 소수점 방식으로 숫자를 저장하기 때문에, long보다 더 넓은 범위를 표현 가능 long longNumber = 3.14f; // long < float 자동 형 변환 불가 |
(5) 참조형 변수
(5.1) String | 문자열 변수 | "Apple", "텍스트" 와 같은 문장을 저장 (예시) String message = "Hello World"; // 문자열을 저장 |
(5.2) Object, Array, List 등 | 그 외 | 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장 (예시) List<int> alphabet = [0, 1, 2, 3]; // 기본형 변수 여러개를 저장합니다. |
(6) 래퍼 클래스 변수 (Wrapper Class) : 기본형 변수를 클래스로 한번 랩핑(감싸는) 변수
// 박싱 // Integer 래퍼 클래스 num 에 21 의 값을 저장 int number = 21; Integer num = new Integer(number); // 언박싱 int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드를 제공한다. |
기본 타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Int |
long | Long |
float | Float |
double | Double |
char | Char |
boolean | Boolean |
굳이 래퍼 클래스를 사용하는 이유는? 클래스는 객체지향 언어인 Java의 핵심기능이다. 그렇기 때문에 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게 된다.
코드를 연습해서 정리해본 노션 |
https://funky-baron-4b5.notion.site/JAVA-1-26eb73950f4346a189149cc82fca9e25 |
<아스키 코드>
(1) 숫자 ≫ 문자
(2) 문자 ≫ 숫자
<문자와 문자열>
(1) 선언 관점에서 차이점
1) 문자(char)는 문자 한 개만 저장하며 따옴표를 사용하여 값을 지정한다.
char alphabet = 'A'; // 문자 하나를 저장한다. |
2) 문자열(String)은 문자 여러개를 문장형태로 저장하며, 쌍따옴표를 사용하여 범위를 지정한다. (ex. "ABCDEFG")
String message = "Hello world"; // 문자열을 저장한다. |
(2) 저장 관점에서 차이점
1) 문자 (char)
문자 뒤에 \0 (널문자) 가 없다. 1 byte만 쓰기 때문에 끝을 알아서 데이터만 저장하면 된다.)
2) 문자열 (Sring)
문장의 끝에 \0 (널문자)가 함께 저장이 된다. 몇 개의 byte를 쓸지 모르기 때문에 끝을 표시해야 한다.)
String
a | b | c | d | e | f | g | \0 |
<참조형 변수>
(1) 참조형 변수 = 주소형 변수?
다른 기본형 변수가 실제 값을 저장하는 저장 공간이라면, 참조형 변수는 실제 값이 아닌 원본 값의 주소값을 저장한다.
(2) 저장 관점에서 차이점
기본형 변수 : 원본 값이 Stack 영역에 있다.
참조형 변수 : 원본 값이 Heap 영역에 있다.
Stack 영역에는 따로 저장 해둔 원본 값의 Heap 영역 주소를 저장한다.
(3) Stack영역 과 Heap 영역
1) Stack : 정적으로 할당된 메모리 영역
크기가 몇 byte인지 정해져 있는 기본형 변수를 저장한다. 크기가 정해져 있는 참조형 변수의 주소값도 저장한다.
2) Heap : 동적으로 할당된 메모리 영역
크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장한다.
<입력과 출력>
(1) 입력
Java 프로그램에서는 기본적으로 Scanner.in 객체의 next() 명령을 사용해서 입력받는다.
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성한다. String input = sc.next(); // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있다. |
(2) 출력
Java프로그램에서는 기본적으로 System.out 객체의 printin() 명령을 사용해서 출력한다.
Scanner sc = new Scanner (System.in); String input = sc.next(); System.out.println("입력값 : " + input); // 입력한 글자를 출력한다. // 실행 결과 {입력} 입력값 : {입력} |
<비트와 바이트>
Byte(바이트)는 8개의 Bit(비트)로 구성되어 있다.
(1) Bit
- 0,1 형태의 2진수 데이터로써 컴퓨터가 저장(표현)할 수 있는 최소 단위
정수형 값은 10진수 숫자(0~10범위의 숫자)이며 2진수(0~1범위)Bit로 저장(표현)한다.
4개의 Bit로 16진수 숫자(0~F(16)범위의 숫자)를 2진수(0~1범위)Bit로 저장(표현)한다.
(2) Byte
- 1 Byte 내에서 숫자 변수는 Bit 2진수를 10진수로 저장(표현)한다.
10진수로는 0~255(2의 8승)까지 저장(표현)한다.
- 1 Byte 내에서 문자 변수의 경우만 Bit 2진수를 16진수로 저장(표현)한다.
<형 변환> 변수 타입 바꾸기
(1) 형변환에 대한 이해
Java 프로그래밍을 하다보면 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶을 경우, 문자열에 숫자값을 추가하고 싶은 경우 등, 어떤 변수형을 다른 형으로 변환이 필요한 경우가 많다.
형변환은 주로 기본형 변수인 정수 ⇔ 실수 ⇔ 문자 들 사이에서 일어나며 방법은 아래와 같다.
(2) 정수형, 실수형 간 발생하는 형변환
정수 ⇔ 실수 간에 변환할 때는 {{원하는 타입}} 명령을 통해 변환할 수 있다. (캐스팅)
1) Double, Float to Int
(Int)캐스팅 방식으로 실수를 정수로 치환하는 방법이다.
이 때 실수형의 소수점 아래자리는 버려진다.
2) Int to Double,Float
(Double, Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법이다.
(3) 자동 형변환
- Java 프로그래밍에서 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환되는 케이스가 있다.
- 프로그램 실행 도중에 값을 저장하거나 계산할 때, 자동으로 타입변환이 일어난다.
1) 자동 타입변환은 작은 크기의 타입에서 큰 크기의 타입으로 저장될 때 큰 크기의 형변환이 발생한다.
변수 타입별 크기 순서 |
byte (1) ⇒ short (2) ⇒ int (4) ⇒ long (8) ⇒ float (4) ⇒ double (8) |
2) 작은 크기의 타입이 큰 크기의 타입과 계산될 때 자동으로 큰 크기의 타입으로 형변환이 발생한다.
(4) 자동 형변환 과 강제 형변환
1) 작은 타입 ≫ 큰 타입 형변환 시 (자동 형변환)
더 큰 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 없다. 값의 손실없이 변환이 가능하기 때문에 컴파일러가 자동으로 형변환을 해준다.
2) 큰 타입 ≫ 작은 타입 형변환 시 (강제 형변환 = 캐스팅)
더 작은 표현 범위를 가진 타입으로 변환되는 것이라 값의 손실이 생긴다. 값의 손실이 생기기 때문에 자동으로 형변환을 해주지 않고 개발자가 선택하여 형변환을 한다.