-
🎮 [JAVA 자바] #2 | 자바의 기본타입, 식별자, 리터럴, 오버플로우, 형변환, Scanner, var, finalCS/Java 2022. 4. 16. 20:00
🎮 자바 프로그램의 기본 구조
package week2_3; import java.util.Scanner; public class Circle { final static double PI = 3.14; // 원주율을 상수로 선언 (final 사용) public static void main(String[] args) { System.out.print("radius:") // 단순 안내 메세지 Scanner scanner = new Scanner(System.in); // 레퍼런스 타입, 입력, System.in은 키보드 디바이스 int radius = scanner.nextInt(); // 기본타입 변수 int, 정수로 받기 double circleArea = radius*radius*PI; // 기본타입 변수 double System.out.println("원의 면적 = " + circleArea); scanner.close(); // 자원 쓰면 닫아주기 (자원해제, 파일 디스크립트) } // 메소드 끝 } // 클래스 끝 /* 출력 radius:3 원의 면적 = 28.26 */
🎮 자바 프로그램 기본 요소
- 예약어
자바에서 의미가 이미 예약되어 있는 단어로, 클래스명이나 필드 변수명 또는 메소드 명으로 사용할 수 없다.
- 식별자
클래스, 변수, 상수, 메소드 등에 붙이는 이름 -> 클래스명, 변수명 ...
길이 제한 없음
대소문자 구문 (final은 예약어, Final은 식별자로 사용가능)
한글, 유니코드 문자, 영문자, 특수문자중 '_', '$' 사용가능
<식별자에 사용 불가능>
: 특수문자('@','#'등), 공백, 탭
: 숫자가 식별자의 제일 앞에 잇는 경우
: 자바 예약어, boolean 리터럴(true, false), NULL 리터럴(null) (리터럴은 '데이터 값 자체' 라는 뜻)
<보통 자바 명명 규칙, 꼭 지킬 필요는 X>
클래스 이름 : 첫번째 문자마다 대문자 (AutoVendingMaching)
변수, 메소드 이름 : 첫 단어 이후 첫번재 문자마다 대문자 (myAge, getAge)
상수 이름 : 모든 문자 대문자 (PI)
- JAVA 데이터 타입
기본 타입(primitive type) 8개
- 정수 : byte(1 byte), short(2), int(4), long(8)
- 실수 : float(4), double(8)
- 참과 거짓 : boolean(1)
- 문자 : char(2)
- CPU나 운영체제에 따라 변하지 않음
- 기본 타입은 값 전달, copy
레퍼런스 타입(reference type)
- 기본 타입이 아닌 모든 변수는 레퍼런스 변수, 배열/클래스/인터페이스 등
- 레퍼런스 타입은 레퍼런스 전달
- 레퍼런스 타입 변수들은 대입문에서 레퍼런스를 전달
class Student { public int id = 10; } public class HelloWorld { public static void main(String[] args) { Student a = new Student(); // 메모리 어딘가에 임의 객체 생성, 그 위치를 a에 할당 Student b = a; // b에 a를 할당함으로 a와 b가 둘 다 new Student를 가리킴 b.id = 20; // a와 b가 둘 다 가리키므로 a.id도 20 System.out.println(a.id); System.out.println(b.id); } } /* 출력 20 20 */
* 레퍼런스 : 객체의 메모리를 생성했을 때 메모리와 연결된 유일한 숫자값(메모리 주소가 드러나지 않음)
🎮 오버플로우
- 정수 오버플로우
담을 수 있는 최대 용량이 있어서 발생. 넘으면 최솟값(음의 부호 가진 최댓값+1)으로 가서 순환.
최댓값은 xxx.MAX_VALUE로 알 수 있다. (ex. Integer.MAX_VALUE))
- 부동 소수점 오버플로우
부동소수점 값의 범위와 유효자리수. 유효숫자의 한계가 있어서 정확하지 않다.
float z = 1e39f; -> 오버플로우 일어남.
- 컴퓨터에 실수가 저장되는 방법
부동 소수점으로 활용. IEEE 754표준을 따름.
부호(Sign), 지수(Exponent), 가수(Mantissa)의 세영역으로 표시한다.
single 부동소수 정수 : 4바이트, 32비트, 부호 1비트 + 지수 8비트 + 가수 23비트
double 부동소수 정수 : 8바이트, 64비트, 부호 1비트 + 지수 11비트 + 가수 52비트
(ex. float f = 10.11(2진수) = (-1)^0 * 1.011 * 2^1 -> 0 10000000 011000000...)
🎮 리터럴
- 리터럴(Literal)
프로그램 코드에서 직접 표현된 값
종류 : 논리, 정수, 시루, 문자, 문자열, null (ex.34, 42.124, ' %', "hello", true, false, null)
- 논리 리터럴
true, false 2개뿐. boolean 타입 변수나 조건식에 사용. 자바에서는 1, 0을 참, 거짓으로 사용 불가(C언어와 차이점) while(1) 사용불가
- 정수 리터럴
10진수, 8진수, 16진수, 2진수 리터럴. 정수 리터럴은 int 형으로 컴파일
long 타입 리터럴은 l / L로 표현 (Ex. long g = 24L;)
정수 리터러 중간에 언더스코어('_') 넣기 가능 -> 앞/뒤에 넣으면 오류
15 -> 10진수 리터럴 15
015 -> 0으로 시작하면 8진수. 십진수로 13
0x15 -> 0x으로 시작하면 16진수. 십진수로 21
0b0101 -> 0b로 시작하면 2진수. 십진수로 5
int age = 2___5;
long maxLong = 0x7fff_ffff_ffff_ffffL;* Integer.toBinaryString(100) : 십진수 100을 2진수로 변환하는 정수 리터럴 API
* Integer.toOctalString(100) : 십진수 100을 8진수로 변환
* Integer.toHexString(100) : 십진수 100을 16진수로 변환
- 실수 리터럴
소수점 형태나 지수 형태로 표현한 실수 (ex. 12., 12.0, .1234, 0.1234, 1234E-4)
double 타입으로 컴파일
f / F (float), d / D (double) 명시 가능 (ex. float f = 0.1234f; double w = .1234D;)
* 주의 : float x = 1.5; 컴파일 에러, float을 double로 바꾸거나, 1.5를 1.5f로 바꿔준다.
- 문자 리터럴
단일 인용부호('')로 문자표현 또는 \u유니코드 값으로 표현. 내부적으로 정수값 코드로 저장
내부적으로 유니코드(2 byte) 사용 -> 문자리터럴은 2byte (16bit)
* 유니코드 : 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준
char x = 'A'; char y = 65; char z = '\u0041'; // 모두 같다.
- escape sequence
- 기본 타입 이외의 리터럴
null 리터럴 : 레퍼런스에 대입해서 사용. 기본 타입에 사용불가
문자열 리터럴(스트링 리터럴) : 이중 인용부호로 묶어 표현. String 객체로 자동 처리
int n = null; // 오류! 기본 타입에 사용불가 String str = null; String str = "Good";
🎮 var 키워드
- var
타입 추론(type inference)이 가능한 경우, 지역 변수 선언할 때 타입 대신 사용 가능. 선언과 초기화를 동시에 해야한다.
약간 모호한데, auto 키워드랑 비슷하다. 타입 신경쓰지않고 다른 곳에 넘겨줄 때 주로 사용하기도 한다.
var price = 200; // int 타입 var name = "jumin"; // string 타입 var point = new Point(); // point 타입 var v = new Vector<Integer>(); // Vector<integer> 타입 var name; // 컴파일 오류! 변수 name 타입 추론 불가능
🎮 상수
- final 키워드
선언 시 초기값 지정, 실행 중 값 변경 불가능. c++에서의 const와 비슷
(ex. final double PI = 3.141592;)
+) C++의 상수처리
* const int : 메모리 공간 할당
* #define PI : 전처리기가 모든 값을 찾아서 바꿔준다.
🎮 형변환
- 자동 형변환
대입문에서는 왼쪽 변수의 형태에 따라 변환. 작은 타입은 큰 타입으로 자동 변환, 반대는 X
- 강제 형변환
피연산자의 형태를 명시적으로 변환시킴. (형변환할 자료형)을 대입문에서 오른쪽 변수 앞에 써준다.
long m = 25; // int -> long double d = 3.14*10; // 10->10.0 int n = (int) d; // 강제 형변환으로, n=31 (손실이 일어난다.) byte b = n; // 컴파일 오류! int -> byte 자동 변환 불가 byte b = (byte) n; // 강제 형변환 32비트 -> 8비트 System.out.println((char)0x12340041) // char은 16진수니까 뒤에 4자리만 -> 0x41은 문자 A
* 주의 : 연산의 결과값은 피연산자의 형태와 같다. 두 정수값으로 나누면 결과값이 정수가 된다. (ex. result = 10 / 4 -> result = 2)
-> 나눗셈 결과가 실수값이 되려면 피연산자 중에 하나는 실수값으로 해주면 된다. (ex. result = 10 / 4.0 -> result = 2.500000)
🎮 Scanner
- 표준 입력 스트림
System.in : 키보드로부터 직접 읽는 자바의 표준 입력 스트림, 바이트 스트림(1 byte)이므로 문자(2 byte)로 변환
키 값을 바이트 데이터로 넘겨주므로 응용프로그램이 문자 정보로 변환 해야 함(1,2,3 -> 123) -> Scanner가 함
- Scanner 클래스
java.util.Scanner
Scanner 객체의 사용을 명시해야 함
스트림에서 입력된 바이트를 문자, 정수, 실수 등의 타입으로 변환
입력되는 값에서 공백(' ', '\n', '\t')으로 토큰을 구분, 다양한 타입의 값으로 리턴 가능
Scanner scanner = new Scanner(System.in); // 사용자가 Lim 22 45.5 true 입력 String name = scanner.next(); // "Lim" int age = scanner.nextInt(); // 22 double weight = scanner.nextDouble(); // 45.5 boolean single = scanner.nextBoolean(); // true scanner.close();
* String inputString = scanner.nextLine() : 공백 포함 한 줄을 입력
* String binary = Integer.toBinaryString(100) : 십진수 100을 이진수로 변환
* xxx.equals("123") : 두 string 비교하는 메소드로, 123과 같은지 비교하는 예시코드. ==사용하면 주소가 달라서 무조건 false 나옴.
private static Scanner scanner; scanner = new Scanner(System.in); scanner = new Scanner(System.in); scanner.close();
* 주의점1 : close()를 까먹지 말고, 프로그램 내에서 Scanner는 가급적 한 개만 생성한다.
* 주의점2 : nextInt()와 nextLine()을 이어쓰면 nextInt() 후에 버퍼에 남아있던 '\n'이 nextLine()에 입력된다. -> nextLine에서 바로 입력도 안되고 리턴되어 종료된다. 해결방법은 nextInt()와 nextLine()사이에 scanner.nextLine()을 써서 '\n'을 소모해서 해결한다.
'CS > Java' 카테고리의 다른 글
🎮 [JAVA 자바] #6 | 자바 예외처리, Try-catch-finally, 다중 catch, Checked / Unchecked 예외, throw, throws (0) 2022.04.17 🎮 [JAVA 자바] #5 | 자바 배열, 다차원 배열, Arrays 클래스 (0) 2022.04.17 🎮 [JAVA 자바] #4 | 자바의 조건문과 반복문, 열거형 | enum, if-else, while, switch (0) 2022.04.16 🎮 [JAVA 자바] #3 | 자바의 연산자, 연산자 우선순위 (0) 2022.04.16 🎮 [JAVA 자바] #1 | 자바 특징, WORA, Eclipse, package, static, extern, JDK, JRE, SE, 디버그 (0) 2022.04.16