변수와 상수
- 변수
- 수학적 의미 : 변하는 수
- 프로그래밍 언어에서의 의미 : 어떤 값을 저장할 수 있는 메모리 상의 공간
- 자바에서 변수를 선언하는 방식
- 자료형( Data Type ) 변수명 [= 초기값] ;
<값의 종류에 따라 값이 저장될 공간의 크기와 형식의 정의 - 이름을 저장할 변수를 선언 - String name;
- 캐멀 케이스 사용 - ex) firstName
- 한번 사용한 변수명을 또 선언할 경우 에러 발생 - Duplicate local variable name
- 자료형( Data Type ) 변수명 [= 초기값] ;
- 자바에서 변수 초기화
- 초기화란? 변수를 사용하기 전에 처음으로 값을 저장하는 것
- name = “홍길동”
- name이라는 변수에 "홍길동"이라는 값을 저장
- “=”을 대입(할당) 연산자라고 부름
- 대입(할당) 연산자
- '='의 우측항의 값을 좌측 항의 변수에 할당(대입)함
- 우측 항을 먼저 연산 후 좌측 항의 변수에 할당함
- 지역변수(Local Variable)는 초기화 하지 않을 시 에러 발생
- 변수의 명명 규칙
- 식별자
- 프로그래밍에서 사용하는 모든 이름으로 개발자(사용자)가 선언한 이름
- 대소문자를 구분하며 길이 제한은 없다. -> age와 Age는 다른 것이다.
- 예약어를 사용할 수 없다. -> int, public 불가
- 숫자로 시작할 수 없다. -> 0name 불가
- 특수문자는 '_' , '$'만 사용할 수 있다. -> first name은 불가능하며 firstName나 first_name을 사용해야 한다.
ex) days02 패키지명, Ex06 클래스명, age 변수명 등
- 예약어(키워드)
- 미리 의미가 부여된 식별자
ex) package, public, class, static, void, String 등
- 미리 의미가 부여된 식별자
- 식별자
변수의 타입
- 자료형의 종류
- 기본형(primitive type) - 8가지
- 숫자형
- 정수계열 : byte : 1바이트(8bit) -> 2^8가지 정수 -128 ~ 127
short : 2바이트(16bit) -> 2^16 -2^15 ~ 2^15-1
int : 4바이트(32bit) -> 2^32 -2^31 ~ 2^31-1
long : 8바이트(64bit) -> 2^64 -2^63 ~ 2^63-1
문자 : char : 2바이트(16bit)
- 실수계열 : float : 4바이트(32bit)
double : 8바이트(64bit) - 불린 형(논리형) : Boolean (True, False) -> 참/거짓을 저장하는 자료형
- 계산을 위한 실제 값을 저장한다.
ex) 나이를 표현하기 위한 자료형 : byte – int를 사용할 경우 3바이트의 메모리 낭비
- 숫자형
- 참조형(reference type)
- 배열(Array), 클래스(Class), 인터페이스(Interface)
문자열 자료형 : String 클래스 - 객체의 주소를 저장한다.
- 배열(Array), 클래스(Class), 인터페이스(Interface)
- 기본형(primitive type) - 8가지
- 상수와 리터럴
- 상수
- 값을 한 번만 저장할 수 있는 공간
- 변수 앞에 ‘final’이라는 키워드를 붙여준다..
- 선언할 때는 모두 대문자로 선언하고 단어가 바뀔 때는 ‘_’를 사용한다.
- 선언과 동시에 초기화를 해야 한다.
- 필요한 이유? 여러 곳에 같은 의미를 가진 리터럴을 사용할 때 상수로 사용하면 편하게 값을 변경할 수 있다.
- 리터럴
- 그 자체로 값을 의미하는 것
ex) 3.14, ‘A’, 10 등등
- 그 자체로 값을 의미하는 것
- 상수
- 형식화된 출력
- println() : print() + 개행(줄 바꿈)
- print()
- printf("출력형식 문자열", 출력변수)
- %[argument_index$][flags][width][.precision]conversion
- conversion – d : 10진수 정수, o : 8진수, x : 16진수(소문자), X : 16진수(대문자)
– s : 문자열, c : 문자, f : 부동소수점, b : Boolean
int score =10; System.out.printf("[%10d]\n",score); // 너비 10자리 우측 정렬 System.out.printf("[%010d]\n",score); // 너비 10자리 우측 정렬 공백을 0으로 채움 System.out.printf("[%-10d]\n",score); // 너비 10자리 좌측 정렬 System.out.printf("%o\n",score); // 8진수 System.out.printf("%x\t%X\n",score,score); // 16진수 System.out.printf("%#o\n",score); // 8진수 System.out.printf("%#x\t%#X\n",score,score); // 16진수 double avg = 78.76545; System.out.printf("%f\n",avg); System.out.printf("%.2f\n",avg); // 소수점 2자리 : 78.77 System.out.printf("%10.2f\n",avg); // 너비 10자리, 소수점 2자리 우측 정렬 System.out.printf("%(d\n",-123); //(123) 음수인 경우 ()로 나타냄 System.out.printf("%(d\n",123); //123 System.out.printf("%,d\n",123456789); //123,456,789
- 제어(특수) 문자
- ‘\n’ : 줄 바꿈 -> System.out.println()도 사용, printf문에서는 %n도 사용할 수 있다.
- ‘\t’ : tab키
- ‘\b’ : backspace
- ‘\’‘ : ‘ 출력
- ‘\“’ : “ 출력
- 연산자를 사용한 출력
- 문자열(“10”) + 문자열(“10”) -> 문자열(1010)
- 문자열(“10”) + 정수(10) -> 문자열(1010)
- 정수(10) + 정수(10) -> 정수(20)
- Console에서 입력받기
- 표준 입력 -> 읽기( 스트림, Stream ) -> System.in
- 스트림:
- 바이트 스트림 : System.in -> 문자변환 스트림 : InputStreamReader -> 한 라인 읽기 : BufferedReader
- 문자 스트림
- 클래스를 사용하기 위해서는 그 클래스가 포함된 패키지를 import 해 줘야 한다.
- BufferedReader 형식
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String name = br.readLine(); -> 오류 발생(Unhandled exception type IOException) └> throws 문으로 사용하여 예외처리 readLine() ? 1) 입력한 값을 읽어오는 함수 2) 매개변수 X 3) 입력한 문자열(String) 값 반환
- Scanner 형식
Scanner sc = new Scanner(System.in); String name2 = sc.nextLine(); Int num = sc.nextInt(); char ch = sc.next(). charAt(index); // charAt() 함수를 이용하여 문자열의 index 위치의 문자 추출
진법 변환
- 정수, 문자의 진법 변환
- 10 -> 0000 0000 0000 0000 0000 0000 0000 1010
- 'A' -> ASCII(65) -> 0000 0000 0100 0001
- 음수의 진법 변환 -10 -> [S][0][0][0] [1][0][1][0]
└> 부호 비트 -> 양수 : 0, 음수 : 1
- 부호와 절대치 ㅣ-10ㅣ -> 10
- [0][0][0][0] [0][0][0][0] +0
- [1][0][0][0] [0][0][0][0] -0
- 0이 중복되어 현재는 사용 x
- 1의 보수법
- 절댓값 구하기 |-10| == 10
- 2진수로 변환 0000 1010
- 보수 0 -> 1, 1 -> 0으로 변환 1111 0101
- 2의 보수법 (현재 사용 중)
- 절댓값 구하기|-10| == 10
- 2진수로 변환 0000 1010
- 보수 0 -> 1, 1 -> 0으로 변환 1111 0101
- 1 더하기(1의 보수 +1) 1
1111 0110
- ex1) -13 -> 13(0000 1101) -> 1111 0010 -> 1111 0011
- 절댓값 구하기 |-13| == 13
- 2진수 구하기 0000 1101
- 1의 보수 구하기 1111 0010
- 2의 보수 구하기(+1) 1111 0011
- ex2) 1011 1011 -> 1011 1010 -> 0100 0101 ->1 + 4+ 64 = 69 -> -69
- 1의 보수 만들기(-1) 1011 1010
- 보수 0100 0101
- 10진수로 변환 1 + 4 + 64 = 69
- (-) 부호 붙이기 - 69
- 부호와 절대치 ㅣ-10ㅣ -> 10
- 실수의 진법 변환
- 10진 소수점수 -> 2진 소수점수
- 0.625(10) -> ?(2)
- 2 곱하기 -> 0.625 * 2 = 1.25
- -1 하기 -> 0.25 -- 1 ↓
- 0.25 * 2 -> 0.5 -- 0 ↓
- 0.5 * 2 -> 1.0 -- 1 ↓
- 1)소수점이 없을 때까지 2) ~ 4) 반복
- 2)무한인 경우?
- 위에부터 읽기 0.101(2)
- 2진 실수 -> 10진 실수
- 0.101(2) -> 2^-1 + 2^-3 -> 0.625
- 10진 소수점수 -> 2진 소수점수
- 정수형의 오버플로우
- 타입이 표현할 수 있는 값을 넘어간 것
ex) byte => -128~127
[1][1][1][1] [1][1][1][1] == -128
+ 1 -> 0000 0000
- 타입이 표현할 수 있는 값을 넘어간 것
기본형 - 실수
- 실수를 나타내는 자료형 : float(4), double(8)
3.141592 지수 부분(E : 8자리) 가수(M : 23자리)
float [S] [1][2][3][4] [5][6][7][8] [1][][] [][][][] [][][][] [][][][] [][][][] [][][][]
지수 부분(E : 11자리) 가수(M : 52자리)
double [S] [1][2][3] [4][5][6][7] [8][9][10][11] [1][][][] [][][][] [][][][] [][][][]...
정밀도 : float -> 7자리 0.1234567XXXX 단정도 정밀도 -> 둘 다 오차가 있는 자료형
double -> 15자리 0.123456789012345XXX 배정도 정밀도 - 실수형의 저장 형식
- 값을 부동소수점 형태로 저장
└> +-M * 2^E 실수를 표현한 것 - ex) 10진 소수 (9.1234567)
- 2진 소수로 변환 : 정수 부분 : 9 -> 1001
소수 부분 : 0.1234567 * 2 -> 000111111001101011011011...
=> 1001.000111111001101011011011... - 정규화 1.XXX * 2^ E (부동소수점 표현)
=> 1.001000111111001101011011011... * 2^3 (3이 나온 이유 : 1001 == 1.001*10^3)
└> M └>E(8bit에 3을 저장) - 기저법 – 특정 수(127)를 E에 더함 -> 127 + 3 = 130
E = [1][0][0][0] [0][0][1][0]
- 2진 소수로 변환 : 정수 부분 : 9 -> 1001
- 값을 부동소수점 형태로 저장
형 변환
- 정의
- 변수 또는 상수의 타입을 다른 타입으로 변환하는 것 : A 자료형 -> B 자료형 변환
- ex) int -> byte, int -> double, String -> int, int -> String, char -> String, float -> double
- 형 변환하는 이유 : 서로 다른 타입 간의 연산을 수행해야 하는 경우 자료형이 같아야 해서
- 변환방법
- 자동으로 형 변환 (2가지 경우)
- int i = 100; 4byte - [][][][]
long l = 100L; 8byte - [][][][] [][][][]
- i + l -> 200이 나오지만 8byte의 long형 200이다.
- 연산하려면 자료형이 같아야 하지만 자동으로 자료형이 변환된다.
- 작은 자료형 '연산' 큰 자료형 = 큰 자료형 - int i = 10; 4byte - [][][][]
long l = i; [][][][] [][][][] = [][][][]
- 우측의 항 값이 작은 자료형일 경우 좌측 큰 자료형에 대입(할당)될 때 큰 자료형으로 변환된다.
- 우측이 큰 자료형일 경우 자동으로 형 변환이 안 되어서 에러가 발생한다.
└> Type mismatch: cannot convert from long to int - 자료형의 크기 비교 : byte < short / char < int < long(8) < float(4) < double
- int i = 100; 4byte - [][][][]
- 강제로 형 변환
- byte + byte + byte -> int?
why? JVM의 피연산자 스택이 피연산자를 4byte 단위로 저장하기 때문에 4byte 이하의 자료형은 4byte로 변환하여 연산을 수행 - 큰 자료형을 작은 자료형으로 변환할 때 사용
( ) cast 연산자 사용 -> (바꾸려는 자료형) 값
-> Boolean형을 제외한 기본형끼리는 가능하다.
-> 문자열(String)은 클래스 형식으로 참조형이므로 형 변환을 할 수 없다. - 소수점 자리가 더 있지만 0으로 나오는 경우
why? short / int -> int형으로 나옴 -> 소수점이 0으로 나옴
-> 소수점을 정확하게 나오게 하기 위해서는 강제 형 변환을 해서 하나를 double 형이어야 한다.
- byte + byte + byte -> int?
- String에서 숫자로 형 변환
- byte => Byte.parseByte();
- int => Integer.parseInt();
- double => Double.parseDouble();
- Boolean => Boolean.parseBoolean();
- xxx 형 변환 => Xxx.parseXxx();
- 기본형 자료형을 사용하기 쉽도록 포장한 클래스가 있다.
-> 래퍼(Wrapper) 클래스
기본형 자료형 래퍼 클래스
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
- Wrapper 클래스 숫자를 8, 16진수로 변환
- 16진수 : Integer.toHexString(값)
- 8진수 : Integer.toOctalString(값)
- 2진수 : Integer.toBinaryString(값)
- 숫자를 문자로 변환
int 100 -> String "100"- Integer.toString(100)
- String.valueOf(100)
- String.format(“% d”,100)
- "" + 100 -> 문자열 + 숫자 => 문자열
- 원하는 형식의 문자열로 변환
- String.format(“원하는 형식”, 변환하려는 값) 함수 사용
- 문자열에서 원하는 문자 추출
- 문자열.charAt(Index, 추출하려는 문자의 위치)
- 자동으로 형 변환 (2가지 경우)
'프로그래밍 > 자바공부 - Chapter별' 카테고리의 다른 글
Chapter04 (0) | 2021.09.08 |
---|---|
Chapter03 (0) | 2021.09.06 |
Chapter01 (0) | 2021.08.24 |