Part1 변수
1. 변수란? (variable)
- 값을 저장할 수 있는 공간
- 메모리에 값을 기록하기 위한 공간
- 변수명은, 각 저장공간의 구분을 위해 필요함
* 변수에 값을 기록하는 이유?
- 프로그램 실행 시 사용할 값(DATA)는 메모리에 기록되어야만 사용 가능함
2. 변수의 선언: 메모리에 데이터를 저장할 수 있는 공간을 할당하는 것
저장공간이 필요하다면 변수를 선언해야 함 (변수 선언 시, 저장공간 생성)
같은 데이터타입(자료형)의 변수는 동시 선언이 가능함
int coder;
// 변수타입
// (자료형) 변수명;
int java, html, css;
// 같은 타입(자료형) 변수는 동시선언 가능
3. 변수를 사용하는 이유
- 재사용성: 한번의 값 저장으로 필요시 재사용 가능
- 가독성: 값에 의미를 부여해줌
====> 유지보수 용이
4. 변수와 저장공간은 일대일 대응 / 중복저장시 마지막 저장값을 저장
변수=저장공간을 의미하므로, 하나의 변수(저장공간)에는 하나의 값만 저장 가능함
5. 변수의 초기화
- 초기화(initialization):변수 선언 후 처음으로 해당 변수에 값을 저장하는 것
* 초기값: 초기화를 통해 변수에 넣어준 값
6. 변수의 데이터타입:
- 테이터의 타입에 따라 저장공간의 크기, 형식을 정의한 것
- 변수에 어떠한 값을 저장하느냐에 따라 달라짐
(저장값/리터럴 의 타입에 따라 변수타입 결정)
- 변수 선언 시에는 저장값으 특성을 고려하여 가장 알맞는 변수 타입을 선택하여야 함
7. 상수와 리터럴
1) 상수(constant): 변수와 마찬가지, 저장공간
-> 변수와 달리 한 번 저장시 값 변경 불가
-> 변수 앞 final 선언시 사용가능
-> 한 번 선언하면, 상수의 값 변경 불가
final 데이터타입 변수명; // 상수형 변수명은 대문자로 선언!
// 여러 문자의 경우 underbar 구분
final double LAST_ONE = 1.112
2) 리터럴(literal): 변수에 저장되는 값 (수학적 개념의 상수)
- 리터럴 타입과 접미사
: 리터럴에도 타입이 있으며, 변수의 타입은 리터럴의 타입에 의해 결정
종류 | 리터럴 | 접미사 | |
논리형 | false, true | 없음 | |
정수형 | 123, 0b0101, 100L | L - long 타입 ( 생략불가, ~L) 없을시 - int (default값) byte, short - 별도 접미사 없음 |
|
실수형 | 3.14, 3.0, 1.4f | f - float 타입 (생략불가, ~f) d - double 타입 (default 값, 생략가능) |
|
문자형 | 'a', '1', '\n' | 없음 | 한 개 문자 ' - ' 로 감싸기 빈 문자 비허용 ( '-' 내부 반드시 존재) |
문자열 |
"ABC", "123", "A", " ", "TRUE" | 없음 | 두 개 이상 문자 " -- " 로 감싸기 빈 문자열 허용 (empty string) |
* 자바 defalult 컴파일 값: 정수형 -> int, 실수형 ->double
3) 문자열 결합: 문자열 + 문자열
* "S"tring이 대문자인 이유가있어~
피연산자 중 한 쪽이 String일 시, 나머지 한 쪽을 String 변환 후 결합
어떤 타입도 String을 만나면 그 결과값이 문자열이 됨
문자열 + any type -> (문자열) + (문자열로 변환) -> 문자열 (결과)
8. 변수의 기본형과 참조형
1) 기본형(8개) : 실제 값(data)를 변수에 저장 (연산에 사용되는 변수는 모두 기본형)
<정수형>
데이터 타입 | 메모리의 크기 | 표현 가능 범위 |
byte | 1 byte | -128 ~ 127 |
short | 2 byte | -32,768 ~ 32,767 |
int | 4 byte | -2,147,483,648~2,147,483,647 |
long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
* 정수형 리터럴 "," 역할 -> underbar
(예: 10000 -> 10_000)
<실수형>
float | 4byte | ±(1.40129846432481707e-45 ~ 3.40282346638528860e+38) |
double | 8byte | ±(4.94065645841246544e-324d ~ 1.79769313486231570e+308d) |
<문자>
char | 2byte | 모든 유니코드 문자 |
String *참조형 |
크기 미정 (길이에 제한 없음) |
문자열 |
<논리형>
boolean | 1byte | true / false |
2) 참조형: 값이 저장되어 있는 메모리주소(memory address)를 저장 (참조형 변수간 연산 불가)
* 메모리 주소(객체주소): 메모리에 1byte단위로 붙어있는 일련번호
9. 오버플로우 : 연산과정에서 해당 타입이 표현가능한 최대 범위를 넘어서는 것
- 오버플로우가 되어도 에러는 발생하지 않지만, 예상 값을 얻을수 없음
1) 정수형의 오버플로우
최대값 + 1(오버플로우) => 최소값
최소값 - 1 (오버플로우) = 최대값
10. 결과값 타입 간 변환방법
1) 숫자->문자로 : 숫자 + '0'
2) 문자->숫자로: 문자-'0'
3) 숫자=>문자열로: 3 + " "
4) 문자열=>숫자로: Integer.parseInt() or Double.parseDouble()
5) 문자열=>문자로: charAt(3)
6) 문자=>문자열로: +" "
Part2. 형변환
1. 형변환(casting)이란?:
- 서로 다른 타입간 연산 수행을 위해서는 연산 전 연산하고자 하는 값들의 타입을 일치시키는 것이 원칙
- 형변환: 변수나 리터럴(상수)의 타입을 다른 타입으로 변환하는 것
(타입) 피연산자
() : 캐스트연산자, 형변환 연산자
2. 형변환의 종류
1) 자동 형변환 (promotion)
- 컴파일러 자동 형변환 (
2. 강제 형변환(force casting) :자동형변환이 이루어지지 않을 경우 진행
큰타입 => 작은타입으로 변환 (프로그래머 책임 하에, (캐스팅연산자)를 통해 진행, 형변환 명시)
===> 값 손실 발생가능. 신중하게
ex) byte b = 10000; (에러)
- 좁은그릇-> 넓은그릇 : O (값 손실 없음, 자동형변환)
1 Byte 2 Byte 4 Byte 8 Byte 4 Byte 8 Byte
* 기본값을 최대한 보존할 수 있는 타입으로 자동형변환됨
3. 산술변환:
1) 이항연산자는 두 피연산자의 타입이 일치해야 연산 가능함
2) 피연산자 타입이 다를시 형변환 연산자를 통해 타입 일치시켜야함
===> 컴파일러가 자동으로 형변환하는 것을 "산술변환", "일반산술변환"이라 함
* 산술변환 규칙
(1) 더 큰 그릇 타입으로 일치
*(2) 피연산자 타입이 int보다 작을 시 int로 변환
( char, short의 경우 표현범위가 좁아서 오버플로우 발생 가능성이 높음)
*(3) 정수 + 실수 형변환시, 실수로 변환
( 8byte 정수 (long) 보다 4byte 실수(float)형이 더 범위가 큼)
long + int -> long + long -> long
float + int -> float + float -> float
double + float -> double + double -> double
byte + short -> int + int -> int
char + short -> int + int -> int
char + char -> int + int ->int // char형이 int로 변할때에는 대응되는 아스키코드 값으로 변환됨
long + float -> float + float ->float
// 자동형변환: 작->큰
public void autoCasting() {
// 1. int(4byte, 정수) -> double(8byte, 실수)
int i1 =10;
System.out.println(i1);
double d1 = /*double*/i1;
System.out.println(d1);
// 자동형변환 완료 (int -> double 타입으로)
// d1 =10->10.0
// 2. int(4byte, 정수)-> long (8byte, 실수)
int i2 = 1200000;
long l3 =i2;
System.out.println(l3); // 1200000
// 특이케이스 1. long (8byte, 정수) -> float(4byte)
// 정수 -> 실수 변환시, 큰 정수가 작은 실수에 대입 가능
// => 4byte float 형이 8byte long형보다 담을 수 있는 값의 범위가 더 크기 때문
long l4 = 1000000L;
float f5 = l4;
System.out.println("f5출력: " +f5); // f5출력: 1000000.0
// 특이케이스 2. char(2Byte) <-> int (4Byte)
// 아스키코드표
char ch = 98; // 아스키코드, 숫자 - 알파벳 대응
char ch2 = 'b';
System.out.println(ch+"는"+ch2+"?"); // b는b?
//char + string + char ==> String + String +String으로 인식
int num = ch; // int<->char 간의 형변환
System.out.println(num);
System.out.println('b'); //b
System.out.println((int) 'b'); // ->98
System.out.println('b'+2);// -> char + int => int ( 98+2 =100)
System.out.println('b'+(char)'2'); //-> 100
System.out.println((char)2); //
System.out.println((char)2+(char)'2'); // char형 '2'를 int형으로 변환시,이에 대응되는 아스키값인 50이 출력됨
// 작은 자료형, 큰 자료형 연산시 작은 자료형을 큰 자료형으로 변환하여 연산, 위의 경우 모두 int 형으로 변환,int50 + int2 이 되어 int 52가됨 (502아님)
// 특이케이스 5. byte, short간의 연산
// -128~127
byte b1 = 126;
byte b2 = 2;
System.out.println(b1+b2);
// 결과값이 int 형 => cpu가 값을 처리하는 기본크기가 int형의 크기 (4byte)
// byte b3 = (byte)128; // byte 범위를 넘는 값을 byte에 넣었음, 오버플로우 발생
System.out.println(b3);
// 강제형변환 : 큰 바이트 -> 작은바이트
}
public void forceCasting() { //여기 오류 다시보기
// 명시적 형변환이라고도 함
// (바꿀자료형) 값
// 1. double (8byte) -> float(4byte)
double d2= 8.0;
float f1 = (float)d2;
System.out.println(f1);
double d3= 10.123123;
int i4 = (int)d3;
System.out.println(i4);
// 0.123123소수점 뒷부분 절삭 -> 데이터 손실
int iNum=10;
double dNum=1.56;
double dNum2 = 0.57;
// BigDecimal
System.out.println(iNum+dNum); // 11.56
System.out.println(dNum+dNum2);//2.13
System.out.println((int)(dNum+dNum2));//2
char ch = 98; // 아스키코드, 숫자 - 알파벳 대응
char ch2 = 'b';
System.out.println(ch+"는"+ch2+"?");
int num = ch; // int<->char 간의 형변환
System.out.println(num);
System.out.println('b');
System.out.println((int) 'b'); // ->98
System.out.println('b'+2);// -> 100
System.out.println('b'+(char)2); //-> 문자+문자는 자바가 컴파일 할 수 없는 코드임
//-> 자바가 강제로 int+int로 변환함
System.out.println((char)2); // 숫자를 문자형에 넣으면 인식이 불가!
System.out.println((char)2+(char)'2');
// char형 + char형 = int형
// char형 '2'를 int형으로 변환시,이에 대응되는 아스키값인 50이 출력됨
// 작은 자료형, 큰 자료형 연산시 작은 자료형을 큰 자료형으로 변환하여 연산, 위의 경우 모두 int 형으로 변환,int50 + int2 이 되어 int 52가됨 (502아님)
}
4. 식별자(identifier)
- 클래스명, 메소드명, 변수명 등 사용자가 만들어서 이용하는 고유의 이름
1) 식별자 생성 규칙
- 대소문자 구분, 길이제한 없음
- 포함가능: 문자, 숫자, underbar, $ 포함가능
- 사용가능: 문자, underbar, $ (숫자로 시작불가)
- 공백 포함불가
- 예약어(키워드, 보라색으로 표기되는 void, public등)은 식별자로 사용할 수 없음
2) 식별자 명명 규칙(암묵적 약속)
(1) 클래스/인터페이스:
- 명사, 형용사를 서술적으로 연결하여 사용
- 첫글자는 대문자
- 연결된 단어들의 첫글자도 대문자
(ex_HelloWorld)
(2) 변수:
- 명사적 의미
- 첫글자는 소문자
- 연결된 단어들의 첫글자는 대문자 표기
(ex_lunchMenu)
(3) 메소드:
- 동사적 의미
- 첫글자는 소문자
- 연결된 단어들의 첫글자는 대문자 표기
- 메서드명명부분 바로 뒤엔 항상 ()가 붙음
- 메소드명은 일반적으로 underbar를 사용하지 않음
(ex_goHome() )
(4) 상수:
- 모든 문자를 대문자 표기
- 연결된 단어 사이 underbar 삽입
5. 출력문
print: 출력 후 줄바꿈 x
println: 출력후 줄바꿈o
printf: 출력 후 줄바꿈 x, 원하는 format을 지정하여 출력가능
%b | boolean |
%d | 정수 |
%o | 8진수 정수 |
%x ,%X | 16진수 |
%f | 소수점 (.Af -> A+1자리에서 반올림하여 소수점A자리의 실수반환) |
%c | 문자형 (C: 대문자반환) |
%s | 문자열 (S: 전체문자열 대문자반환) |
%n | 줄바꿈 |
%e %E | 지수 |
-> 결과
6. 화면에서 입력받기 (Scanner)
화면에서 입력받기 순서:
1) Scanner 객체생성 (임의 변수선언, 초기값 System.in)
2) java.util.* 임포트 ( ctrl + shift + o)
3) 콘솔창 직접입력 이전 화면에 뜰 출력문 입력
4) 변수선언 = Scanner 변수. Scanner메소드호출
5) 출력
Scanner 클래스 메서드
- next(): String타입, 입력값 문자열 반환
- nextLine(): String타입, 개행문자(\n)를 포함하는 문자열 line 반환, \n은 반환하지 않음
- nextByte() : byte 타입, byte 타입 입력 및 반환
- nextInt() : int 타입, int타입 입력 및 반환
- nextShort() : short 타입, short타입 입력 및 반환
- nextLong() : long 타입, long타입 입력 및 반환
- nextDouble()
- Scanner매개변수.close() : Scanner 메서드 사용 종료
*next.charAt(index넘버): char 타입,
String타입 입력값 중 (index넘버+1)에 해당하는 자리의 문자를 char 타입으로 반환
'코딩공부일지 > 수업 review' 카테고리의 다른 글
자바 - 객체지향프로그래밍2( 오버로딩, 객체배열) (0) | 2022.09.14 |
---|---|
자바 - 객체지향 프로그래밍1(클래스, 캡슐화, 변수, 생성자, 메서드) (0) | 2022.09.13 |
[Java] 조건문과 반복문 (0) | 2022.09.07 |
[Java] 연산자 (0) | 2022.09.05 |
자바 - JDK, IDE 설치 / 자바프로그래밍 기본(클래스, 메서드, 실행메서드, 주석, 출력메서드) (0) | 2022.09.01 |