기본형 : boolean, 문자형, 정수형, 실수형
참조형 : 기본형을 제외한 나머지 타입, 객체의 주소를 저장함, 변수의 타입으로 클래스 이름을 사용
- 상수와 리터럴
상수
1. 값을 변경할 수 없음
2. 선언과 동시에 초기화
3.final 변수타입 변수명 = 값;
리터럴은 우리가 원래 아는 상수, 값 그 자체를 의미하지만
프로그래밍에서 '값을 변경할 수 없는 저장공간'의 상수와 구별하기 위해 대신 사용
리터럴의 타입, 접미사
●정수형
디폴트 int / long 타입 => l, L
● 실수형
디폴트 double / float 타입 => f
즉 float, double타입 변수를 선언할 때만 주의해주기
● 문자열
변수타입 String 으로 선언
, 원래 String class이므로 new를 사용해야 하지만 생략한 표현도 가능
문자열 덧셈
피연산자 중 어느 한 쪽이 String이면 다른쪽도 String으로 변환 한 후 두 String을 결합
=> 기본형 타입의 값 + ""(빈문자열) => 문자열로 변환 가능
● 지시자, prinf
%b => bool
%d => 10진수 정수
%o => 8진 정수
%x => 16진 정수
%c => char (char타입 값을 %d로 출력하는 것은 불가능)
%s => String
%f => float
- 지시자 앞에 숫자 : %nd => 출력될 값이 n자리 공간을 차지함
- -숫자 : %-nd => 출력될 값이 앞에서부터 n자리 공간을 차지함
- 0숫자 : %0nd => 출력될 값이 n자리 공간을 차지하며, 공백을 0으로 채움
- 소수점 아래자리 지정 : %n.mf => 전체 n자리 중 소수점 아래 m자리, 소수점 아래 빈 자리는 0으로 채움
● 타입캐스팅
bool 타입을 제외한 기본형끼리 형변환이 가능
(타입)피연산자
=> 피연산자가 해당 타입으로 변환됨
- 정수형 간 형변환
작은 타입 -> 큰 타입 : 크기 차이만큼 값 손실
큰 타입 -> 작은 타입 : 양수는 0, 음수는 1로 채움- 실수형 간 형변환
- 정수형 - 실수형 간 형변환
정수 -> 실수 : 그냥 실수의 저장형식에 맞게 저장
실수 -> 정수 : 반올림 없이 소수점 아래 값 버림
● 자동 형변환
저장 할 수 있는 범위 내의 값인 경우 컴파일러가 자동으로 형 변환
더 큰 범위의 값으로의 변환도 명시적으로 표시했을 경우에는 에러 발생x
자동 형변환은
" 기존 값을 최대한 보존할 수 있는 타입으로 변환 "
= 더 저장 범위가 넓은 쪽으로 맞춰서 변환
Java의 정석 Chapter.3 연산자
연산자의 종류
산술연산자 : 사칙연산, 나머지연산, 시프트
비교연산자 : 대소, 등가 비교
논리연산자 : AND, OR 연산
대입연산자 : =
기타연산 : (type), 삼항연산, instanceof
기억해야 할 연산자 우선순위
- 산술 > 비교 > 논리 > 대입
: 산술을 가장 먼저, 대입을 가장 나중에, 비교 > 논리
: 산술 연산자 중에는 사칙연산 > 시프트- 단항연산 > 이항연산 > 삼항연산
- 연산의 진행방향은 왼->오 (단항연산, 대입연산은 예외 : 오->왼)
- AND 연산 > OR 연산
헷갈리는 표현은 그냥 괄호를 사용하자
● 연산에서의 타입변환 - 1
- 시프트, 증감연산은 타입변환 x
- 피연산자 간의 타입을 일치 : 범위가 큰 쪽으로
- 피연산자가 int보다 작은 타입이면 int로 변환 : char, short, ..
- 연산결과의 타입은 피연산자와 같은 타입으로 나옴
(결과가 실수값이라도 결과의 타입이 int인 경우 소수점 버림)
● 연산에서의 타입변환 - 2 : 사칙연산 시
- 큰 수 -> 작은 데이터타입으로 변환하는 경우 : 데이터 손실이 발생해 값이 바뀔 가능성 O
, 따라서 처음부터 큰 자료형을 사용하거나 결과값의 자료형을 변환하는 것이 아닌 피연산자의 자료형을 변환해야 함
long c = (long)(a * b) : X
long c = (long)a * b : O
- 접미사를 붙이지 않은 숫자 리터럴은 int 타입 -> 리터럴 자체의 연산에서도 오버플로우 발생 할 수 있음을 주의
:1000000 * 1000000
은 int간의 연산이므로 오버플로우 발생
,1000000 * 1000000L
으로 형변환 해서 연산해야 함- 변수가 포함되지 않은 상수나 리터럴 간의 연산은 컴파일러가 미리 수행해둔다
-> 다른 타입의 변수로 리터럴 연산 결과를 대입하는 경우, 형변환을 하지 않아도 에러발생xchar c1 = 'a' char c2 = c1 +1 /// 컴파일에러발생 char c2 = 'a' +1 ///에러 발생 x
● 비교연산에서의 주의할 점
1. 비교연산 시에도 두 피연산자 중 더 큰 타입으로 자동 형변환을 한다
, 실수형 간 자동 형변환시 근사값때문에 오차가 발생할 수 있다 ( d<->f )
2. 문자열의 비교는 비교연산자 == 가 아닌 equals() 메소드를 사용한다
: 문자열 간 == 연산은 내용의 비교가 아닌 같은 객체인지 여부의 판단을 수행하기 때문
● 대입연산자 : lvalue, rvalue
lvalue : =의 왼쪽에 있는 피연산자 : 값을 변경(=저장)할 수 있어야 함 (상수, 리터럴, 연산식 X )
rvalue : 변수, 식, 상수 전부 O
Java의 정석 챕터4 조건문, 반복문
- if 문
if ( 조건식 : true or fasle ) {
// 조건식이 true 일 때 실행 }
else {
// 조건식이 false일 때 실행 }
if 안에 if를 중첩으로 사용해 중첩 if문으로도 사용가능
if문보다 많은 경우의 수 처리 가능
switch (조건식) { case 값1 : //조건식==값1인경우 //수행될 문장 break; // 빠져나감 case 값2 : //.. //.. //.. default : //조건식과 일치하는 값이 없는 경우 //수행될 문장 }
break가 없을 경우 switch문을 끝내는 괄호가 나올 때까지 문장을 전부 실행하므로 break 붙이는 거 잊지 말 것
제약조건
1. 조건식의 결과는 정수 or 문자열
2. case문의 값은 정수 상수만 가능, 중복 불가능
for(초기화 ; 조건식 ; 증감식 ) { //실행할 문장 }
초기화 : 사용할 변수를 초기화, 단 한번만 수행
조건식 : 해당 조건식을 만족한 경우에 밑의 문장을 실행
증감 : 반복문을 제어하는 변수의 값을 변화시킴
for( 타입 변수명 : 배열 또는 컬렉션 ) {
//반복할 문장
{
배열에 저장된 값이 순서대로 읽혀서 변수에 저장 -> 괄호 안의 실행할 문장에서 해당 변수를 이용해 수행
while ( 조건식 ) { //실행문 }
조건식 참 -> 문장 수행
조건식 거짓 -> 해당 루프 벗어남