1. 변수
변수 : 단 하나의 값을 저장할 수 있는 메모리 상의 공간
변수의 선언
int(변수의 타입) age(변수의 이름)
변수타입 : 변수에 저장될 값의 자료형
변수이름 : 저장된 메모리공간의 이름
=> 변수가 선언되면 변수타입에 알맞은 저장공간이 확보됨
=> 앞으로 이 저장공간은 변수이름을 통해 사용
변수의 초기화
'int age=25;
-지역변수의 경우 무조건 초기화를 해주어야 한다.
ex)
public class Main {
public static void main(String[] args)
{
int year=0;
int age=14;
System.out.println(year);
System.out.println(age);
year=age+2000;
age+=1;
System.out.println(year);
System.out.println(age);
}
}
=>결과
0
14
2014
15
>>변수의 명명규칙
1. 대소문자 구분
2. 길이제한x
3. 예약어 사용x
4. 숫자로 시작 x
5. 특수문자는 _ / $만 허용
>프로그래머들에게 권장되는 규칙
1) 첫글자 : 클래스(대문자) vs 변수와 메소드(소문자)
2) 여러 단어로 이루어진 이름은 단어의 첫글자를 대문자로 함
- curPos/ lastPos
3) 상수 이름은 모두 대문자로, 여러 단어로 이루어지면 _로 구분
- PI / MAX_NUMBER
2. 데이터 타입
>>변수의 타입
>> 기본형과 참조형
기본형 : data를 저장하는 변수 -논리 문자 정수 실수형
참조형 : memory address를 저장하는 변수
ex)참조형 예시
Date today = new Date();
>>기본 자료형의 크기
>>상수와 리터럴
final int MAX_SPEED =10;
- 변수 타입 앞에 final을 붙임
- 반드시 선언과 동시에 초기화
- 한번 선언하면 값을 바꿀 수 없음
- 리터럴에 의미를 부여하여 이해+수정을 쉽게 만듦
>>리터럴의 타입과 접미사
: 디폴트 타입과 다른 타입을 선언해야할 때 주로 사용
ex) Long, Float
float pi =3.14 //에러 : default인 8byte double을 4byte float에 저장하려 했기에
=>수정
float pi = 3.14f
>>타입의 불일치
-상황1) 타입의 값이 변수의 타입범위를 넘어설 때
ex) int i= 0x123456789;
상황2) 리터럴의 타입이 변수의 타입보다 넓을 때
ex) float f=3.14(double)
>>문자와 문자열 리터럴
문자 : char ch ='J' (단 하나만 저장 가능)
문자열: String name ="Java"
#문자는 안에 반드시 하나의 문자가 있어야 하나, 문자열은 빈문자열 가능
String str ="" // OK
char ch ='' // 에러! 반드시 하나의 문자 포함
char ch=' ' // 공백문자로 처리
- 문자열과의 결합은 문자열이 되며 연산순서에 영향을 받음
>>형식화된 출력 - printf()
:지시자를 이용해 변수의 값을 여러가지 형식으로 변환 가능
: printf 줄바꿈 문자가 없기에 마지막에 %n을 넣음
ex)정수형 출력
public class PrintfEx1 {
public static void main(String [] args)
{
byte b=1;
short s=2;
char c='A';
int finger=10;
long big=100_000_000_000L;
long hex=0xFFFF_FFFF_FFFF_FFFFL;
int octNum= 010;
int hexNum =0x10;
int binNum=0b10;
System.out.printf("b=%d%n", b);
System.out.printf("S=%d%n", s);
System.out.printf("c=%c, %d %n", c, (int)c);
System.out.printf("finger = [%5d]%n" ,finger);
System.out.printf("finger = [%-5d]%n" ,finger);
System.out.printf("finger = [%05d]%n" ,finger);
System.out.printf("big =%d%n" ,big);
System.out.printf("hex = %#x%n%n" ,hex);
System.out.printf("octNum = %o, %d%n" ,octNum, octNum);
System.out.printf("hexNum = %x, %d%n" ,hexNum, hexNum);
System.out.printf("binNum = %s, %d%n" ,Integer.toBinaryString(binNum), binNum);
}
}
실행결과
b=1
S=2
c=A, 65
finger = [ 10]
finger = [10 ]
finger = [00010]
big =100000000000
hex = 0xffffffffffffffff
octNum = 10, 8
hexNum = 10, 16
binNum = 10, 2
=>C언어에서는 char 타입의 값을 지시자 %d로 출력가능했지만, 자바에서는 허용x
=> 꼭 형변환을 해주어야 함
System.out.printf("c=%c, %d%n", c, (int)c)
>>실수형 출력예제
public class PrintfEx2 {
public static void main(String [] args)
{
String url="www.codechobo.com";
float f1= .10f;
float f2=1e1f;
float f3= 3.14e3f;
double d= 1.23456789;
System.out.printf("f1= %f, %e, %g%n", f1, f1, f1);
System.out.printf("f2= %f, %e, %g%n", f2, f2, f2);
System.out.printf("f3= %f, %e, %g%n", f3, f3, f3);
System.out.printf("d= %f%n", d);
System.out.printf("d=%14.10f%n", d); //전체 14자리 중 소수점 10자리
System.out.printf("[12345678901234567890]%n");
System.out.printf("[%s]%n", url);
System.out.printf("[%20s]%n", url);
System.out.printf("[%-20s]%n", url);
System.out.printf("[%.8s]%n", url);
}
}
>>실행결과
f1= 0.100000, 1.000000e-01, 0.100000
f2= 10.000000, 1.000000e+01, 10.0000
f3= 3140.000000, 3.140000e+03, 3140.00
d= 1.234568
d= 1.2345678900
[12345678901234567890]
[www.codechobo.com]
[ www.codechobo.com]
[www.codechobo.com ]
[www.code]
>>화면에서 입력받기 : Scanner
- 라이브러리 호출 import java.util.*
- 객체 생성 : new Scanner(System.in)
- .nextLine() :입력 대기 상태에 있다가 엔터키를 누르면 반환됨
import java.util.*; //라이브러리 호출
public class Scannerex1 {
public static void main(String [] args)
{
Scanner scanner = new Scanner(System.in); //scanner객체 생성
System.out.print("두자리 정수를 하나 입력해주세요.>");
String input = scanner.nextLine(); //nextLine() 메소드 활용
int num= Integer.parseInt(input); //Integer.parseInt를 통해 정수로 변환
System.out.println("입력 내용: "+input);
System.out.printf("num=%d%n", num);
}
}
3. 진법
>>비트와 바이트
비트 : 컴퓨터가 값을 저장하는 최소단위 (0 or 1)
바이트 : 비트 8개를 묶은 것
워드 : CPU가 한번에 처리할 수 있는 데이터의 크기
=> CPU성능에 따라 다름
=> 32bit CPU에서 1word=32bit
=> 64bit CPU에서 1word=64bit
>>실수의 진법변환
https://woo-dev.tistory.com/93
>>2의 보수법
https://jamanbbo.tistory.com/52
[음수의 2진 표현을 구하는 방법]
1) 음수의 절대값을 2진수로 변환한다 ex)-5를 5로 변환
2) 1의 보수를 구한다 ex) 0101 -> 1010
3) 1을 더한다. ex) 1011 ==-5
4. 기본형
4-1.논리형
: true / false(디폴트)
: 대소문자 구분 -> true <> TRUE
4-2.문자형-char
: 유니코드를 사용하기 때문에 2byte
: 문자 자체가 아닌 문자의 유니코드가 저장
: 음수를 표현할 필요가 없으므로 저장범위가 다름
#문자의 유니코드를 알아내는 법
int code= (int )ch
>특수문자 다루기
특수문자 | 문자 리터럴 |
\t | tab |
\b | back space |
\f | form feed |
\n | new line |
\r | carrige return |
\\ | 역슬래쉬 |
\' | 작은 따음표 |
\" | 큰따음표 |
\u유니코드 | 유니코드 |
>>인코딩과 디코딩
- 인코딩 : 문자-> 코드
- 디코딩 : 코드->문자
>> 문자 인코딩 방식
1) 아스키
: 128개의 문자집합
: 7bit
: 0-9 / a-z가 연속적으로 배치되어 있음
2) 확장 아스키
: 남은 1bit를 활용하여 문자를 추가정의
: 한글을 표현하기엔 어려움 -> 조합형 / 완성형
: 조합형 - 초성, 중성, 종성을 조합하여 표현
: 완성형 - 하나의 완성된 글자를 표현
=> 완성형인(CP949)를 사용
-- 코드 페이지
: 확장 아스키를 도입할 때, 국가에 따라 여러 버전의 확장 아스키가 필요
: 이를 코드페이지라 하고 CP XXX라 명명함
: 한글 윈도우는 CP949 / 영문 윈도우는 CP439
4) 유니코드
-국가간 문서교환 활발
- 어려움 해소를 위해 문자를 하나의 통일된 집합으로 표현
- 자바가 사용하는 유니코드 : UTF-16
--UTF-16 vs UTF-8
: UTF-16 : 문자를 2byte의 고정길이로 표현 -> 편하지만 문서의 크기가 커짐
: UTF-8 : 문자를 1-3byte의 가변길이로 표현 => 어렵지만 문서의 길이를 줄임
=> 웹은 전송속도가 중요하므로 문서크기를 줄일 수 있는 UTF-8을 주로 사용
4.3) 정수형
정수형의 오버플로우
=> 부호가 있는 경우 : 부호비트가 0->1이 될 때 오버플로우 발생
public class overflowex {
public static void main(String []args)
{
short SMin =-32768;
short SMax =32767;
char cMin=0, cMax=65535;
System.out.println("sMin = "+SMin);
System.out.println("sMin -1= "+(short)(SMin-1));
System.out.println("sMax = "+SMax);
System.out.println("sMax+1 = "+ (short)(SMax+1));
System.out.println("cMin = "+(int)cMin);
System.out.println("cMin-1 = "+ (int)(--cMin));
System.out.println("cMax = "+(int)cMax);
System.out.println("cMax+1 = "+(int)(++cMax));
}
}
=>실행결과
sMin = -32768
sMin -1= 32767
sMax = 32767
sMax+1 = -32768
cMin = 0
cMin-1 = 65535
cMax = 65535
cMax+1 = 0
4.4 실수형
>>저장방식 :기저법 기억하기
=> 필연적으로 오차가 발생(정밀도)
=> float의 정밀도 : 7 / double의 정밀도 : 15
5. 형변환
형변환 : 변수/상수의 타입을 다른 타입으로 변환하는 것
>>형변환의 방법
(타입) 피연산자
-기본형 <=>참조형은 불가능
>>실수형 간의 형변환
- float => double
가수부분의 빈자리가 0으로 채워짐 == 정밀도에는 차이가 없음
- double=> float
24자리 가수부터 버려지는데 반올림하여 자름
== 24번째 자리에서 반올림이 발생 가능
public class CastingEx3 {
public static void main(String []args)
{
float f= 9.123456789f;
double d= 9.1234567;
double d2= (double)f; //float->double로 형변환
System.out.printf("f= %20.18f\n", f);
System.out.printf("d= %20.18f\n", d);
System.out.printf("d2= %20.18f\n", d2);
}
}
=>실행결과
f= 9.123456954956055000
d= 9.123456700000000000
d2= 9.123456954956055000
=> double로 형변환해도 가수부분이 0으로 채워졌기에 정밀도 차이x
>>정수형과 실수형 간의 형변환
주의1) 정수 ->실수
- 정밀도 차이로 만약 8자리 이상의 값을 실수형으로 변환할시 double활용
주의2) 실수->정수
- 실수의 저장범위가 더 크므로, 만약 범위가 넘었다면 오버플로우 발생
>>자동 형변환 : 기존의 값을 최대한 유지할 수 있는 방향으로
1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능함
2. 기본형과 참조형은 서로 형변환이 불가능
3. 값의 범위가 작은 타입 -> 큰 타입은 생략이 가능
'기술 서적 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] ch8. 예외처리 (0) | 2024.01.06 |
---|---|
[자바의 정석] ch7. 객체지향 프로그래밍 II (0) | 2024.01.05 |
[자바의 정석] ch5. 배열 (0) | 2023.12.02 |
[자바의 정석] ch4. 조건문/반복문 (0) | 2023.10.09 |
[자바의 정석] ch3. 연산자 (0) | 2023.10.08 |