💖 변수 타입
📌 기본형
⭐논리형 변수 : boolean
True 1 / false 0 값만 저장한다
⁉️ boolean 타입이니까 ‘boolean a = 1’ 이라고 하고싶은데 오류가?
➡️ 1이라는 값은 자바가 이해하기에 boolean 타입이 아니라 정수형 타입
⭐ 문자형 변수 : char
‘A’, ‘1’ 과 같이 문자 하나만 저장하고 따옴표 1개로 표시한다. 문자 1개이고 문자열이 아니다.
⭐ 정수형 변수 : byte. short, int, long
- byte : -128 ~ 127 범위의 숫자만 저장 가능
- short (2byte)는 -32,768~32,767 범위의 숫자만 저장 가능
- int (4byte)는 -21억~21억 범위의 숫자만 저장 가능
- long (8byte)은 9백경 정도의 매우 큰 수를 저장 가능
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 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.
⭐ 실수형 변수 : .float, double
소수점이 있는 실수값을 저장.
실수도 각 변수 표현 범위를 넘는 숫자를 넣으면 오버플로우가 발생하고 출력해보면 입력값과 다른 값으로 표현된다. 특히 실수는 표현 범위가 매우 넒어서 정수형 변수에서 담지 못할 수 있다.
- float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼) 범위의 숫자 저장이 가능
- double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼) 범위의 숫자 저장이 가능
📌 참조형(reference) 변수 : 어느 공간에 있는 주소값을 바라보고 있는 변수
⭐ 문자열 변수 String : "Apple” 와 같은 문장을 저장함
⭐ Object, List, Array : 객체, 배열, 리스트 등 단일 저장공간에 담을 수 없는 값을 저장
⭐ 래퍼 클래스 변수
✅ 기본형 변수를 클래스로 감싸는(랩핑) 변수
✅ 기본형 변수 타입에서 첫 글자를 대문자로 변경해 정의할 수 있다
박싱 vs 언박싱
- 기본 타입에서 래퍼 클래스 변수로 감싸는 것을 박싱이라고 부름. 큰 상자에 작은 것들을 넣기
- 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것을 언박싱이라고 부름. 택배 언박싱
박싱 VS 언박싱
박싱
Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integer(number);
=> deprecated 지원 종료
Integer num = number => 이렇게만 해도 됨
언박싱
int n = num.intValue(); => 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공
✅ 실습한 int, Integer 외에도 모든 기본 타입에는 래퍼 클래스가 있다.
기본 타입 | 래퍼 클래스 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
⁉️ 왜, 굳이 래퍼 클래스를 사용하는 건지?
➡️클래스는 객체지향 언어인 Java의 핵심 기능이어서 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있게 된다
📌 숫자와 문자
저장공간에 저장하는 값은 0,1 을 통한 숫자값을 저장
⁉️ 그러면 문자는 어떻게 숫자로 저장할까?
➡️ 슷자를 문자로 매핑해서 표현하는데 자바에서는 아스키 코드라는 규칙으로 문자를 저장
👇 아스키 코드 표
• 아스키 코드 숫자를 문자로 출력
// 숫자 -> 문자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int asciiNumber = sc.nextInt();
char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.
System.out.println(ch);
}
}
// 입력
97
// 출력
a
• 아스키 코드 문자를 숫자로 출력
// 문자 -> 숫자
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 프로그래밍 세계에서는 모든 순서는 0부터 시작
char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.
System.out.println(asciiNumber);
}
}
// 입력
a
// 출력
97
📌 문자와 문자열의 차이점
✅ 문자 : 기본형
✅ 문자열 : 참조형
char : 문자 한 개만 저장하며 홑따옴표를 사용해 지정
String : 문자 여러 개를 문장 형태로 저장하며 쌍따옴표를 사용해 지정
- 저장 관점
문자 : 1 byte 만 사용해서 데이터 끝이 어딘지 알아서 \0(널문자)가 없고 데이터만 저장하면 됨
문자열 : 몇개의 byte를 사용할 지 모르기 때문에 \0(널문자) 가 함께 저장이 되며 끝을 표시해야 함
📌 비트&바이트
1 byte = 8 bit
1byte 내에서 숫자 변수는 bit 2진수를 10진수로 저장(표현) => 이게 무슨 말이지?
➡️ 컴퓨터가 숫자를 저장할 때, 내부적으로는 2진수(0과 1)로 저장하지만, 이를 인간이 이해하기 쉽게 10진수로 표현한다는 뜻이다.
- 2진수(바이너리): 컴퓨터는 숫자를 저장할 때 0과 1로 구성된 2진수를 사용. 1 Byte는 8개의 Bit로 이루어져 있으므로, 8자리의 2진수를 저장할 수 있다.
예: 11001010 (2진수) ⇒ 2 + 8 + 64 + 128 =202 - 10진수(디지털): 우리가 일반적으로 사용하는 10진수로 변환하면, 컴퓨터가 내부적으로 저장한 2진수를 우리가 이해할 수 있는 10진수로 나타낸다.
예: 11001010 (2진수) -> 202 (10진수)
⭐ 즉, 컴퓨터는 숫자 데이터를 2진수 형태로 저장하지만, 이를 표현할 때는 우리가 쉽게 이해할 수 있는 10진수로 변환하여 보여준다는 의미이다
✅ 다시 정리하면
- 1 Byte는 8개의 Bit로 구성되어 있고, 이 8개의 Bit로 0부터 255까지의 숫자를 표현할 수 있다.
- 컴퓨터 내부에서는 숫자를 2진수로 저장하지만, 이를 10진수로 변환하여 우리에게 보여준다.
1 바이트 내에서 문자 변수의 경우만 bit 2진수를 16진수로 표현 ⇒ 아스키 코드
📌 형변환 ( Type Casting )
형변환 : 변수의 타입을 변환. 문자열 → 숫자, 정수 → 실수, 실수 → 정수
public class TypeCasting {
public static void main(String[] args) {
형 변환
문자열 -> 슷자
정수 -> 실수
실수 -> 정수
double or float형 -> int
실수 -> 정수(0.xxxx ->0)
double doubleNumber=10.101010;
float floatNumber=10.1010f;
변환(int)
int intNumber;
intNumber=(int)floatNumber;
System.out.println("Float Type = "+ floatNumber); 10.101
System.out.println("Int Type = "+ intNumber); 10으로 형변환이 됬다
intNumber=(int)doubleNumber; // double -> int
System.out.println("Double Type = "+ doubleNumber); 10.10101
System.out.println("Int Type = "+ intNumber); 10으로 형변환이 됬다
}
}
📌 자바 문법 종합반 1주차 과제
import java.util.Scanner;
public class RecipeBook {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String cook=sc.nextLine();
float rate=sc.nextFloat();
sc.nextLine();
String recipe1=sc.nextLine();
String recipe2=sc.nextLine();
String recipe3=sc.nextLine();
String recipe4=sc.nextLine();
String recipe5=sc.nextLine();
String recipe6=sc.nextLine();
String recipe7=sc.nextLine();
String recipe8=sc.nextLine();
String recipe9=sc.nextLine();
String recipe10=sc.nextLine();
System.out.println("[ "+cook+" ]");
int ratenum=(int)rate;
// 퍼센트계산
double percent=((double)ratenum*100)/5;
System.out.println("별점 : "+ratenum+" ( "+percent+"%"+ " ) ");
System.out.println("1."+recipe1);
System.out.println("2."+recipe2);
System.out.println("3."+recipe3);
System.out.println("4."+recipe4);
System.out.println("5."+recipe5);
System.out.println("6."+recipe6);
System.out.println("7."+recipe7);
System.out.println("8."+recipe8);
System.out.println("9."+recipe9);
System.out.println("10."+recipe10);
}
}
오류 Exception in thread "main" java.util.InputMismatchException
실수 입력 받기 전후의 nextLine() 처리
nextFloat()를 호출한 후에 nextLine()을 한 번 더 호출하여 버퍼에 남아 있는 개행 문자를 처리해야 한다 . 그렇지 않으면, nextLine()이 기대하지 않는 빈 문자열을 읽어오게 되어 입력 흐름이 깨질 수 있다.
정수형 별점 계산 오류
별점의 퍼센트 계산식에서 소수점 계산이 필요하기 때문에 ratenum을 double로 캐스팅해야 한다.
최종 결과
'내배캠_Java 6기 > Java 문법 종합반' 카테고리의 다른 글
20240726_TIL_캠프 2주차 5일_자료구조 배열 (0) | 2024.07.26 |
---|---|
20240726_TIL_캠프 2주차 5일_조건문과 반복문 (0) | 2024.07.26 |
20240725_캠프 2주차 4일_연산자 (0) | 2024.07.25 |
20240722_TIL_ 캠프 2주차 1일_자바 첫 프로젝트 생성과 변수에 대해 알아보기 (0) | 2024.07.22 |
20240722_TIL_ 내일배움캠프 2주차 1일 _ 자바 개요와 기초 용어 (2) | 2024.07.22 |