-
[Java] 자바의 정석 CH2.변수Java 2023. 11. 4. 23:08
변수 : 단 하나의 값을 저장할 수 있는 메모리 공간
변수의 선언
int number; // int -> 변수 타입 number -> 변수 이름
변수 초기화 : 변수를 사용하기 전에 처음으로 값을 저장하는 것
int number = 10; //쓰레기 값이 남아 있을수 있으므로 변수를 사용하기전에 초기화 하는것이 좋음
변수 출력 : System.out.println()
int year = 0; int age = 14; System.out.println(year); System.out.println(age);
변수 교환
int x = 10, y = 20; System.out.println("x:"+x+" y:"+y); int tmp; //x 값을 위한 임시 변수 tmp = x; x = y; y = tmp; System.out.println("x:"+x+" y:"+y);
변수 명명 규칙
1) 대소문자가 구분되며 길이에 제한이 없다.
-> True와 true는 서로 다른것
2) 예약어를 사용해서는 안된다.
-> true는 예약어라 사용 x , True는 가능
3) 숫자로 시작해서는 안된다.
-> top10은 가능, 7up은 x
4) 특수문자는 '_' 와 '$'만 허용한다.
변수의 타입 : 문자형(char) 정수형(byte, short, int, long) 실수형(float, double) 논리형(boolean)
기본형과 참조형
1) 기본형 : 실제 값을 저장
2 )참조형 : 값이 저장되어 있는 주소를 값으로 가짐
참조형 변수를 선언할 때는 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 참조변수의 타입
Date today = new Date(); // Date 객체를 생성해 그 주소를 today에 저장
기본형
boolean은 true/false 두가지 값만 표현 -> 1byte
char은 자바에서 유니코드 사용 -> 2byte
byte는 크기가 1byte -> 1byte
int -> 4byte를 기준으로 짧아서 short -> 2byte, 길어서 long -> 8byte
float -> 4byte
double -> 8byte
상수 : 변수처럼 값을 저장할 수 있는 공간이지만 한번 값을 저장하면 다른 값으로 변경할 수 없다.
final int MAX_SPEED = 10; //상수는 선언과 동시에 초기화 해야한다.
리터럴 : 그 자체로 값을 의미하는 것
int year = 2014; // year : 변수, 2014 : 리터럴 final int MAX_SPEED = 10; // MAX_SPEED : 상수, 10 : 리터럴
리터럴의 타입과 접미사
long big = 100000L; // long타입 접미사 L or l int oct = 010; // 8진수 접두사 0 int hex = 0x10; // 16진수 접두사 0x int bin = 0b10; // 2진수 접두사 0b int dec = 10; // 10진수 float pi = 3.14f; // 접미사 f or F double rate = 1.618d; // 접미사 d or D, double형 기본이라 생략 가능
문자 리터럴과 문자열 리터럴
char ch = ''; // ''안에 반드시 하나의 문자 필요 char ch2 = ' '; // 에러 x, 공백 문자로 초기화 String str = ""; // 에러 x String name = new String("Java");
덧셈 연산자는 피연산자 중 어느 한쪽이 String이면 나머지 한쪽을 String으로 변환한 다음 String 결합
String name = "Ja" + "va"; String str = name + 8.0; System.out.println(name); // Java System.out.println(str); // Java8.0 System.out.println(7 + " "); // 7 System.out.println(" "+ 7); // (공백)7 System.out.println(""+7); //7 System.out.println(""+""); // 공백 System.out.println(7 + 7 + ""); // 14 System.out.println("" + 7 + 7); // 77
형식화된 출력 : printf()
ex) 소수점 둘째자리까지만 출력, 정수를 16진수나 8진수로 출력
byte b = 1; short s = 2; char c = 'A'; int n = 10; long big = 100_000_000_000L; // long big = 100000000000L long bigHex = 0xFFFF_FFFF_FFFF_FFFFL; int oct = 010; int hex = 0x10; int bin = 0b10; System.out.printf("b=%d%n",b); // 1 System.out.printf("s=%d%n", s); // 2 System.out.printf("c=%c, %d %n",c,(int)c); // A, 65 System.out.printf("n=[%5d]%n",n); // n=[ 10] System.out.printf("n=[%-5d]%n",n); // n=[10 ] System.out.printf("n=[%05d]%n",n); // n=[00010] System.out.printf("big=%d%n", big); // 100000000000 System.out.printf("bigHex=%#x%n", bigHex); // 0xffffffffffffffff System.out.printf("oct=%o, %d%n",oct,oct); // 10, 8 System.out.printf("hex=%x, %d%n",hex,hex); // 10, 16 System.out.printf("bin=%s, %d%n",Integer.toBinaryString(bin),bin); // 10, 2 // 10진수를 2진수로 출력해주는 지시자 없기때문에 // Integer.toBinaryString() 사용
String url = "www.codechobo.com"; float f1 = .10f; // 0.10, 1.0e-1 float f2 = 1e1f; // 10.0, 1.0e1, 1.0e+1 float f3 = 3.14e3f; // 3140.00 double d = 1.23456789; System.out.printf("f1=%f, %e, %g%n",f1, f1, f1); // %f가 주로 사용 %e는 지수 %g는 값을 간략하게 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); // 1.234568 %f는 6자리까지만 출력 7자리에서 반올림 System.out.printf("d=%14.10f%n", d); // 전체 14자리 중 소수점 10자리 System.out.printf("[%s]%n",url); System.out.printf("[%20s]%n", url); System.out.printf("[%-20s]%n", url); // 왼쪽 정렬 System.out.printf("[%.8s]%n", url); // 왼쪽에서 8글자만
논리형 : boolean
true or false 저장, 기본값은 false
boolean power = true; boolean checked = False; // 에러, 대소문자 구분
문자형 : char
char ch = 'A'; // A가 아닌 문자의 유니코드가 저장된다. 65가 저장됨 char ch = 'A'; char ch = 65; // 동일한 결과
특수문자
char tab = '\t'; // 탭 문자 저장
형변환(casting) : 변수 or 상수의 타입을 다른 타입으로 변환하는 것
double d = 85.4; int score = (int)d; // (타입)피연산자 System.out.println(score); // 85
자동 형변환 : 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환 한다.
표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우 값 손실이 없으므로 표현범위가 넓은 쪽으로 형변환
float f = 1234; // 컴파일러가 형변환 자동 추가 // float f = (float)1234; byte b = 1000; // 에러, byte의 범위를 넘음 int i = 3; double d = 1.0 + i; System.out.println(d); // 4.0 // 연산 과정에서 형변환이 자동적으로 이루어진다.(산술변환)
1) boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능
2) 기본형과 참조형은 서로 형변환 불가
3) 서로 다른 타입의 변수간의 연산은 형변환 하는 것이 원칙이지만 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략 가능