-
728x90
변수
변수를 작성하는 이유는 값이 의미하는것이 무엇인지 알수있기에 필요하다
변수는 코드의 재활용성을 당연히 많이 높여준다 ( 중복 제거 )
변수의 초기화
- 변수는 선언 후, 사용 이전에 쓰레기 값이 남아 있을 수 있기 떄문에 반드시 초기화가 필요하다.
- 멤버 변수( 클래스 변수, 인스턴스 변수, +배열)는 초기화를 하지 않아도 자동적으로 변수의 자료형에 맞는 기본값으로 초기화가 되지만, 지역변수는 반드시 초기화를 해야한다
class initTest { int x; // 인스턴스 변수 int y = x; // 인스턴스 변수 void method1() { int i; // 지역변수 int j = i; // 에러, 지역변수를 초기화 하지 않음 } }
멤버 변수 초기화 방법
멤버 변수의 초기화는 선택적이지만 방법을 알려주겠다
1. 명시적 초기화 - 선언과 동시에 초기화하는 것을 명시적 초기화라고 한다
명시적 초기화가 가장 기본적이면서 간단하지만, 보다 복잡한 초기화 작업이 필요하면 '초기화 블럭' 혹은 '생성자' 를 사용해야 한다
class Car { int door = 4; // 기본형 변수의 초기화 Engine e = new Engine(); // 참조형 변수의 초기화 }
2. 생성자 - 인스턴스 생성시 호출되는 '인스턴스 초기화 메소드' 이다
자세한건, 객체 지향 프로그래밍 편 보기
3. 초기화 블럭
1. 클래스 초기화 블록 : 클래스 변수의 복잡한 초기화에 사용된다.
-> 만드는 방법은 인스턴스 초기하 블록 앞에 단순히 static을 작성하면 된다.
-> 처음 로딩될때 한번만 수행된다.
-> 초기화 순서 : 기본값 -> 명시적 초기화 -> 클래스 초기화 블록
2. 인스턴스 초기화 블록 : 인스턴스 변수의 복잡한 초기화에 사용된다.
-> 만드는 방법은 단순히 클래스 내에 블록 { } 을 만들고 그 안에 코드를 작성하면 된다.
-> 생성자와 같이 인스턴스를 생성할 때 마다 수행된다.
-> 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자
class init { static { /* 클래스 초기화 블록 */ } { /* 인스턴스 초기화 블록 */ } }
기억할 것!!
1. 생성자 보다 인스턴스 초기화 블록이 먼저 수행된다.
2. 인스턴스 변수의 초기화는 주로 생성자를 사용하고, 인스턴스 초기화 블럭은 모든 생성자에서 공통으로 수행되야 하는 코드를 넣는다.{ // 인스턴스 초기화 블록 count++; serialNo = count; } Car() { color = "white"; gearType = "Auto"; } Car(String color, String gearType) { this.color = color; this.gearType = gearType; } // 명시적, 클래스 인스턴스 초기화 블록, 생성자 예시 class init { static int cv = 1; // 명시적 클래스 초기화 int iv = 1; // 명시적 초기화 static { cv = 2; } // 클래스 초기화 블록 { iv = 2; } // 인스턴스 초기화 블록 init() { // 생성자 iv = 3; } } // 초기화 과정 // cv = 0 ( 기본값 ) // cv = 1 ( 명시적 초기화 ) // cv = 2 ( 클래스 초기화 블록 ) -> iv = 0 ( 기본값 ) // cv = 2 ( 클래스 초기화 블록 ) -> iv = 1 ( 명시적 초기화 ) // cv = 2 ( 클래스 초기화 블록 ) -> iv = 2 ( 인스턴스 초기화 블록 ) // cv = 2 ( 클래스 초기화 블록 ) -> iv = 3 ( 생성자 )
두 변수의 값 교환
- 자바는 파이썬 과 다른 방식으로 값이 교환된다
1 ) 자바의 경우에는 임시 공간을 만들어서 두 변수의 값을 교환한다
int x = 10; int y = 20; int tmp; tmp = x; x = y; y = tmp;
2) 파이썬의 경우는 연산자를 중심으로 변수의 순서를 변경하여 변경한다
x = 10 y = 20 x, y = y, x
자바에서 권장하는 규칙
변수의 이름은 짧으면 좋지만, 약간 길더라도 '의이있는 이름'이 중요하다
1. 클래스 이름의 첫 글자는 항상 대문자
- 변수, 메서드 이름의 첫 글자는 항상 소문자
2. 여러 단어로 이뤄진 이름은 단어의 첫 글자를 대문자로한다
3. 상수의 이름은 모두 대문자로 하며, 여러 단어로 이뤄진 경우 '_'로 구분변수 타입
1. 기본형
기본형 변수 - 실제 값을 저장
기본 자료형의 종류와 크기
- boolean : true or false , 1byte
- char : 자바에서 유니코드를 사용 , 2byte
- byte : 1byte
- int : 4byte, short : 2byte, long : 8byte
정수형 범위 : -2^(n-1) ~ 2^(n-1) - 1
n = bit 수
- float : 4byte ( 실수값을 부동소수점 방식으로 저장 )
- double : 8byte
실수형은 정밀도가 중요함 ( double의 정밀도가 float보다 높음 )
float 보다는 double 사용하기 ( float 사용시에는 f 를 사용해야 한다 . )int a = 100; byte a = 100; short a = 100; // short랑 byte는 int형처럼 적어줘도 괜찮다 long a = 100L; float f = 100.1f; double d = 100.1;
간단한 설명
boolean - rue랑 True가 구별되며, true, false만 가능하다 ( default value = false )
char - 문자가 아닌 문자의 유니코드(정수)가 저장된다.
char ch = 'A'; char ch = 65; // 위는 같은 의미 int code = (int)ch; // 65값으로 저장이 된다 char hch = '가'; char hch = 0xAc00; char hch = '\uAc00'; // 다 같은 의미이다.
특수 문자 다루기
특수 문자 문자 리터럴 new line \n 역슬래쉬 \\ 작음따옴표 \' 큰따옴표 \" 유니코드(16진수)문자 \u문자코드 ( 예: char ch = '\u0041') 상수
- 한번 값을 저장하면 다른 값으로 변경할 수 없다
- 선언과 동시에 초기화를 해야한다
- 상수의 이름음 모두 대문자로 하기
final int MAX_VALUE = 10; // 키워드 final 붙여주기
상수가 필요한 이유는 코드의 의미가 명확해지기 때문이다
리터럴
- 그 자체로 값을 의미
int year = 2014;
year은 변수, 2014는 리터럴- 리터럴 타입과 접미사
종류 리터럴 접미사 논리형 false, true 없음 정수형 123, 0b0101, 0xFF,100L L 실수형 3.14, 3.0e8, 1.4f f,d ( == F,D ) 문자형 'A', '1', '\n' 없음 문자열 "abc", 'true" 없음 - 16진수는 접두사로 '0x', 8진수는 '0'을 붙인다
- JDK 1.7 이후는 구분자 '_'를 써서 큰 숫자 읽기 편하게 할 수 있다 EX) long big = 100_000_000_000L;
- 접미사 d는 default 값이므로, 생략할 수 있다.
- p는 2의 제곱이며, p의 왼쪽에는 16진수를 적고, 오른쪽에는 10진수를 적는다
문자 리터럴과 문자열 리터럴
String str = ""; // 가능
Char ch = ""; // 불가능
Char ch = " "; // 가능. 공백문자로 변수
피연산자중 어느 한개가 String이면, 나머지 한쪽을 먼저 String으로 변환후 결합
true + "" -> "true" + "" -> "true"
false + "" -> "false" + "" -> "false"Printf( )
- 지시자를 써서 변수의 값을 여러 가지 형식으로 변환하여 출력이 가능하다
- 줄바꿈을 하지 않는다
지시자 설명 %b boolean 형식 %d 10진 정수형식 %o 8진 정수 형식 %x, %X 16진 정수 형식 %f 부동 소수점 형식 %e, %E 지수 표현식 형식 %c 문자로 출력 %s 문자열 출력 %d
int finger = 10
System.out.printf("finger = [%5d]%n", finger ); // finger = [ 10]
System.out.printf("finger = [%-5d]%n", finger ); // finger = [10 ]
System.out.printf("finger = [%05d]%n", finger ); // finger = [00010]
String url = "www.codecode.com"
System.out.printf("[%.8s]%n", url ) // [www.code] 왼쪽에서 8글자만 나온다.%d 앞에 숫자 ( 음수, 양수 )에 따라서 출력 값을 다르게 바꿔준다.
%s 도 %d와 같이 출력공간을 확보할 수 있다
10진수를 2진수로 출력 ( 10 -> 2 )
System.out.printf("binNum = %s %n", Integer.toBinaryString(bunNum));
%f, %e, %g
%f : 소수점 아래 6자리까지만 출력하고, 7자리에서 반올림한다.
-> 소수점 아래 자리수 지정 가능 : %전체자리.소수점아래자리f
%e : 지수형태로 출력
%g : 간략하게 출력
Scanner
방법 1 ( 더 나은 방법 )
import java.util.*;
Scanner scanner = new Scanner ( System.in );
String input = scanner.nextLine(); // 입력받을 내용을 input에 저장
int num = Integer.parseInt(input)
// float n = Float.parseFloat()방법 2
import java.util.*;
Scanner scanner = new Scanner ( System.in );
int num = scanner.nextInt(); // 입력받을 내용을 input에 저장
// float num = scanner.nextFloat();정수형
n비트로 표현할 수 있는 부호있는 정수의 범위: -2^n ~ 2^(n-1) -1
여러 타입에 따른 범위 및 크기
타입 저장 가능한 값의 범위 bit byte byte -2^7 ~ 2^7 - 1 8 1 short -2^15 ~ 2^15 - 1 16 2 int ** -2^31 ~ 2^31 - 1 32 4 long -2^63 ~ 2^63 - 1 64 8 정수형 변수를 선언할 떄는 int 타입으로 하고, int의 범위( 플마 20억)를 넘어서는 수를 다뤄야 할때는 long사용하면 된다.
Overflow
오버플로우 - 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 의미합니다.
* 하지만 오버플로우의 발생이 에러를 의미함이 아니라 원하는 결과를 얻지 못함을 의미합니다.
* 부호있는 정수의 오버플로우는 부호비트가 0에서 1이 될때, 1에서 0이 될때 발생한다
최소값 - 1 => 최대값
최대값 + 1 => 최소값
정수형 overflow -> 값이 무한히 반복
실수형
float 사용 -> 연산속도 향상 , 메모리 절약
double 사용 -> 더 큰 범위, 높은 정밀도
Overflow
실수형 overflow -> 무한대
실수형 underflow -> 0
2.참조형
참조형 변수 - 어떤 값이 저장되어 있는 주소를 값으로 갖는다.
클래스이름 변수이름;
// 변수의 타입이 기본형이 아닌것들은 모두 참조변수이다.참조형 변수간의 연산은 불가능하다.
참조 변수는 null 또는 객체의 주소를 값으로 갖는다. ( null은 어떤 객체의 주소도 저장되어 있지 않음을 뜻함 )
참조형 변수(참조변수) 를 선언시, 클래스의 이름이 참조변수의 타입이 된다. ( 변수 타입으로 클래스의 이름을 사용하므로 )
진법
n 비트로 표현할 수 있는 10진수
값의 개수 : 2^n
값의 범위 : 0 ~ 2^n - 1- 10진수를 n진수로 변환하려면, n으로 반복해서 나누면 된다.
- 10진 소수점수를 2진 소수점수로 변환하려면, 10진 소수점수에 2를 계속 곱하면 된다.
2의보수법
2의 보수 = 1의 보수 + 1
- 1의보수는 2진법에서 0을 1로 1을 0으로 바꾼것이다.
- 음수를 2진수로 표현하는 방법 ( 절댓값 -> 2진수 -> 2의보수 )
형변환 ( 캐스팅, casting )
형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것
형변환은 값의 손실을 주의 해야 한다.명시적 형 변환 방법
(타입) 피연산자
명시적 형변화로 값 손실 가능하다기본형에서 boolean을 제외한 나머지 타입들은 서료 형변환이 가능하지만, 기본형과 참조형간의 형변환은 불가능하다.
연산을 할때, (byte) 와 같은 형 변환을 해야한다.
자동 형변환 ( 암시적 형변환 )
double a = 3.0F // 3.0이라는 수가 double에 저장되는 순간에 F이 있더라도 자동으로 형변환이 된다 // double이 크기가 더 커서 값 손실이 없기 때문이다 // 자동 형변환 == 암시적 형변환
데이터 타입 크기 ( 자동 형변화 ->방향으로 값 손실 없다 ) 정수간의 형변환
큰 타입 -> 작은 타입 : 값손실 발생
작은 타입 -> 큰 타입 : 값손실 없이 부호를 유지하기 위해 0 or 1로 빈공간이 채워진다
실수간의 형변환
지수의 변화보다는 가수의 변화를 주의해야함한다
float 타입의 범위를 넘는 값을 float로 형변환하는 경우는 무한대나 0으로 나온다
정수형을 실수형으로 변환
정수를 2진수로 변환한 다음 정규형를 거쳐 실수의 저장형식으로 저장
실수형을 정수형으로 변환
실수형의 소수점이하 값은 버려진다
class ex { public static void main(String[] args) { int i = 91234567; //8자리 10진수 float f = (float)i; int i2 = (int)f double d = (double)i; int i3 = (int)d; float f2 = 1.666f; int i4 = (int)f2; System.out.printf("i = %d\n", i ); // i = 91234567 System.out.printf("f = %f i2 = %d \n", f, i2 ); // f = 91234568.000000 i2 = 91234568 System.out.printf("d = %f i3 = %d \n", d, i3 ); // d = 91234567.000000 i2 = 91234567 System.out.printf("(int)%f = %d\n", f2, i4 ); // (int)1.666000 = 1 } }
실수형은 7자리에서 올림현상이 있기때문에 소수점부분에 0이 6개가 나오며 실수형으로 변환시에 마지막 부분에서 반올림이 되면서 7이 8로 바뀐다
정수 1을 문자열(string) 으로 바꾸는 형변환
String f = Integer.toString(1); System.out.println(f); // 1로 나오는데 1은 정수가아닌 '1'을 의미 System.out.println(f.getClass()); // getClass() 변수의 데이터 타입을 알 수 있음
'자바' 카테고리의 다른 글
[자바] 배열 (0) 2022.06.28 [자바] JDK1.5 이후 향상된 for문 (0) 2022.06.27 [자바] 사용시 자주 발생하는 에러와 해결방법 (0) 2022.06.24 [자바] 기본적인 개념 정리 (0) 2022.06.24 [자바] Homebrew로 자바설치하기 (0) 2022.06.23