Java/Java의 정석

Chapter 02 변수(Variable)

계란💕 2022. 2. 17. 22:28

1. 변수(Variable)

  1.1 변수란?

  Def) 변수: 단 하나의 값을 저장할 수 있는 메모리상의 공간을 의미한다. (프로그래밍 상에서) 

  - 수학에서의 변수는 변하는 수라고 정의한다. 

 

  1) 멤버 변수 (membered variables, 소속 변수, 클래스 변수, 필드, 속성 변수)

    - 클래스 내부에 소속된 변수

    - 주로 클래스 내부의 메서드들에 의해 사용된다.

    - 선언만 되어 있고 명시적으로 초기화하지 않으면 기본값이 적용된다.

      -> 기본값(boolean: false, char/ byte/ short/ int/ long/ float/ double: 0, String, Date: null ) 

 

  2) 지역 변수 (local variables)

    - 클래스 내의 메서드내부에서 선언되어서 사용되는 변수

    - 메서드내부에서 선언된 변수를 메서드내부에서만 사용가능

    - 메서드 범위를 벗어나면(메서드 블록 즉, 중괄호 밖에서는) 메모리에서 사라지는 변수이다.

    - 멤버변수와는 다르게 초기화 없이 사용하면 컴파일 오류가 발생한다. 

 

  1.2 변수의 선언과 초기화

  - 변수를 선언하려면 먼저 변수를 선언해야한다.

int age; // age라는 int형 변수를 선언

  - 변수 타입: 변수에 저장될 값이 어떤 타입(type)인지 지정한다. (정수형, 실수형, 문자형..등)

  - 변수 이름: 변수에 붙인 이름이다. 메모리 공간에 이름을 붙여 준다. 

    -> 같은 이름의 변수가 여러 개 있으면 안 된다. 

  - 변수의 초기화: 변수를 사용하기 전에 처음으로 값을 저장한다. 

    -> 변수를 선언한 이후 부터는 변수를 사용할 수 있다. 

    -> 하지만, 그 전에 반드시 변수를 초기화 해야한다.

    -> 메모리는 여러 프로그램이 공유하는 자원이므로  전에 저장된 쓰레기 값(garbage value)이 남았을 수도 있다. 

    -> 변수에 값을 저장할 때 대입연산자'='를 이용한다. (오른쪽 값을 왼쪽 변수에 저장한다. )

 

  Ex 2-1) 변수 선언하고 출력하기

<hide/>
public class VarEx1 {
	public static void main(String[] args) {
		int year = 0;
		int age  = 14;
		System.out.println(year);
		System.out.println(age);
		
		year = age + 2000;
		age = age + 1;
		System.out.println(year);
		System.out.println(age);
	}
}

  Note) 실행 결과

  - 변수의 선언부를 보면 age와 year를 각각 0, 14로 초기화 한다. 

  - println() : 화면에 글자를 출력하기위해 사용한다. 

  - year = age + 2000: 

    -> year = 14 + 2000

    -> year = 2014  (변수 year에 2014를 저장한다.)

  - age = age + 1 : 

    -> age = 14 + 1

    -> age = 15 (age에 15를 저장한다.)

 

  Ex 2-2) 두 변수의 값 교환하기 

<hide/>
public class VarEx2 {
	public static void main(String[] args) {
		int x = 10, y = 20;
		int tmp = 0;
		System.out.println("x: " + x + " y: " + y);
		
		tmp = x;
		x = y;
		y = tmp;
		System.out.println("x: " + x + " y: " + y);
	}
}

  Note) 실행 결과

  - 두 변수를 바꾸기 위해 새로운 변수 tmp를 선언해야한다.   

  - 두 변수의 값을 겨환하는 것은 두 컵에 담긴 내용물을 바꾸려면 컵이 하나 더 필요한 것과 같다. 

  - 덧셈연산자'+'는 문자열과 숫자를 하나로 결합하기도 한다. 

  - 문자열은 큰따옴표("")로 묶은 연속된 문자를 말한다. 

 

  1.3 변수의 명명규칙

  (1) 대소문자가 구분되며 길이에 제한이 없다. 

  - True 와 true는 다르게 간주된다. 

  (2) 예약어를 사용해서는 안 된다. 

  - true는 예약어라서 사용할 수 없으나 True는 가능하다.

  (3) 숫자로 시작해서는 안 된다. 

  - top10은 허용하지만 7up은 허용되지 않는다.

  (4) 특수문자는 '_'와 '$'만을 허용한다. 

  - $harp는 허용되지만, S#arp는 허용되지 않는다. 

 

  Note) 클래스, 변수, 메서드 표기법

  - 파스칼 표기법: Java에서 클래스를 정의할 때, 쓰인다. (단어의 첫 글자마다 대문자로 표기) 

    -> C#에서는 변수나 클래스 선언할 때 쓰임

  - 카멜 표기법: 변수, 메서드를 정의할 때, 쓰인다. (두 번째 단어부터 단언의 첫 글자마다 대문자로 표기)

  - 언더바 표기법(스네이크 표기법): 단어와 단어 사이의 표기를 언더바(_)로 표기한다.

    -> C, PHP, Python: 소문자 / Java, SQL문법: 상수를 표기할 때 대문자로 표기한다.

  - 헝가리 표기법: 

    ex) String strUserName: 변수가 어떤 형인지를 알려준다. (local/ global, ...)

  - 케밥 표기법: HTML에서 클래스를 정의할 때, 단어 사이사이에 대시바(-)를 사용한다.

 

  Def) 예약어(keyword 또는 reserved word): 프로그래밍의 구문에 사용되는 단어를 말한다. 

  - 예악어는 클래스나 변수, 메서드의 이름으로 사용할 수 없다. 

  Ex ) abstract , assert, boolean, break, byte, case, catch, char, class, const, continue

  default, do, double, else, enum, extends, false, final, finally, float, for

  if, goto, implements, import, instanceof, int, interfere, longm native, new, null

  package, private, protected, public, return, short, static, stricfp, super, switch, synchronize

  this, throw, throws, transient, true, try, void, volatile, while

 

  Note) 자바 프로그래머 권장 규칙

  (1) 클래스 이름의 첫 글자는 항상 대문자로 한다. 

  - 변수와 메서드의 첫 글자는 항상 소문자로 한다. 

  (2) 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. 

  - lastIndexOf , StringBuffer  

  (3) 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다. 

  - PI, MAX_NUMBER

 

 

2. 변수의 타입

  - 자료형(data type)은 크게 기본형/ 참조형으로 나뉜다. 

 

  1) 기본형 변수(primitive type): 실제 값(data)을 저장한다. 

    -> 논리형(boolean), 문자형(char), 정수형(int), 실수형(float) 으로 구분되며 모두 8개의 타입이 있다.

    -> 계산을 위한 실제 값을 저장한다. 

 

  2) 참조형 변수(reference type): 어떤 값이 저장되어 있는 주소를 값으로 갖는다.

    -> 객체의 주소를 저장한다. 8개의 기본형을 제외한 나머지 타입이다.

    ex) 배열, 클래스(String, Date, Random), 인터페이스

<hide/>
Date today = new Date();

  - 위 코드는  Date클래스 타입의 참조변수 today를 선언한 것이다. 

  - 참조 변수는 null 또는 객체의 주소를 값으로 가지며 위와 같이 초기화한다.

 

  2.1 기본형 타입(primitive type)

  (1) 논리형: boolean(true 와 false 중 하나를 값으로 가진다. 1byte)

  - 다른 기본형과의 연산이 불가능하다. (boolean 빼고는 모두 가능하다.)

  (2) 문자형: char(문자를 저장하고 변수에 하나의 문자만 저장한다.)

  - 문자를 내부적으로 정수(유니코드)로 저장하기 때문에 정수형과 크게 다르지 않다.(2 byte) 

  - 정수형 또는 실수형과도 연산이 가능하다. 

  (3) 정수형: byte, short, int, long

  - 정수를 저장한다. byte는 이진데이터를 다룰 때 이용, short는 C언어와 호환을 위해 추가되었다.)

  - int는 CPU가 가장 효율적으로 처리할 수 있는 타입이다.

  - 효율성 보다 메모리를 절약하려면 byte, short를 이용한다. 

  (4) 실수형: float, double (주로, double이 이용 된다. )

  

  - 기본형의 종류와 크기  ( 1 byte = 4 bit )

    -> 1 byte: boolean, byte

    -> 2 byte: char, short

    -> 4 byte: int, float

    -> 8 byte: long, double

 

  - 자료형 별 저장 가능한 값의 범위

    -> byte: -128~127

    -> short: -32,768 ~ 32,767

    -> int: -2,147,483,648 ~ 2,147,483,647

    -> long: -2^63 ~ 2^63-1 

 

  2.2 상수와 리터럴(Constant & literal)

  Def) 상수(Constant): 변수와 마찬가지로 값을 저장할 수 있으나 한 번 값을 저장하면 바꿀 수 없다.

  - 변수의 타입 앞에 키워드 'final'를 선언한다. 

  - 상수의 이름은 모두 대문자로 하는 것이 암묵적인 관례이다.

  - 여러 단어로 이어지는 경우 '_'로 구분한다. 

 

  Def) 리터럴(literal)

<hide/>
int year = 2014; //  year: 변수 , 2014: 리터럴
final int MAX_VALUE = 100;  // MAX_VALUE: 상수, 100: 리터럴

  - 상수를 '값을 한 번 저장하면 변경할 수 없는 저장공간'으로 정의했기 때문에 상수를 다른 이름으로 불러야 한다.

  - 기존에 알고 있는 상수의 다른 이름이다.

  - 정수형의 경우, long 타입의 리터럴에 접미사'l' 또는 'L' 을 붙인다. (접미사 없으면 int 타입 리터럴)

  - 10진수 외에도 2, 8, 16진수로 표현된 리터럴을 변수에 저장할 수 있다.

  - 16진수: '0x', '0X' , 8진수: '0'을 붙인다.(접두사)  

<hide/>
int octNum = 010;  // 8진수 10, 10진수로 8
int hexNum = 0x10; // 16진수 10, 10진수로 16
int binNum = 0b10;  // 2진수 10, 10진수로 2

 

  - 실수형: float타입의 리터럴에 접미사 'f' 또는 'F' 를 붙이고 double 타입의 리터럴에는 접미사 'd' 또는 'D'를 붙인다.

  - f는 생략 불가능, d는 생략 가능하다.

<hide/>
float PI = 3.14f; // 접미사 f 또는 F 이용
double rate = 1.618d; // 접미사 d 또는 D 이용한다.

 

  - 리터럴에 소수점이나 10의 제곱을 나타내는 기호 e 또는 E, f, d를 포함하면 실수형 리터럴로 간주한다.

<hide/>
E 또는 e : 10의 제곱을 나타내는 기호
(실수형 리터럴) 1e1  = 10.0
(실수형 리터럴) 1e-3 = 0.001

 

  - 리터럴의 값이 변수의 타입의 범위를 넘어서거나, 리터럴의 타입이 변수의 타입보다 저장 범위가 넓으면 컴파일 에러가 난다.

<hide/>
int i = 0x123456789; // 에러 int 타입의 범위를 넘는 값을 저장
float f = 3.14;  // 에러 float타입보다 double 타입의 범위가 넓다.

  - 3.14는 3.14d에서 접미사가 생략된 것으로 double타입이다. 이 값을 float로 표현할 수 있다.

  - double타입의 리터럴리므로 float타입의 변수에 저장할 수는 없다.

 

  - byte와 short 타입의 리터럴은 따로 존재하지 않으므로 int타입의 리터럴을 사용한다. 

  - short타입의 변수가 저장할 수 있는 범위에 속한 것이어야 한다.

<hide/>
byte  b = 65;  // 정상, byte타입에 저장 가능한 int타입의 리터럴
short s = 0x1234;  // 정상, short타입에 저장 가능한 범위의 int타입 리터럴

  

  - 문자 리터럴: 작은 따옴표로 '문자 하나'를 감싼 것, ex ) 'A'

  - 두 문자 이상은 큰 따옴표로 감싸야 한다. 

<hide/>
char ch = 'A'
String name = "Java"
<hide/>
String str = "";  // OK. 내옹이 없는 빈 문자열
char ch = '';  // 에러. ''안에 반드시 하나의 문자가 필요하다.
char ch = ' ';  // OK. 공백 문자(blank)로 변수 ch를 초기화

 

  - 덧셈 연산자를 이용해서 문자열을 결합할 수 있다.

  - 피연산자 중 어느 한 쪽이 String이면 나머지 한 쪽을 먼저 String으로 변환한 후, 두 String을 결합.

  - 문자열 + any type -> 문자열 + 문자열 -> 문자열

  - any type + 문자열 -> 문자열 + 문자열 -> 문자열

  -  7 + "7" :  7은 String이 아니므로 먼저 7을 String으로 변환한 다음 "7" + "7"을 수행하여 "77"로 결과를 얻는다. 

  Ex 2-3) 문자열 결합 예시

<hide/>
public class StringEx {
	public static void main(String[] args) {
		String name = "Ja" + "va";
		String str = name + 8.0;
		System.out.println(name);
		System.out.println(str);
		System.out.println(7 + " ");
		System.out.println(" " + 7);
		System.out.println(7 + "");
		System.out.println("" + 7);
		System.out.println("" + "");
		System.out.println(7 + 7 +"");
		System.out.println(""+ 7 + 7);	
	}
}

  Note) 실행 결과

 

  - 덧셈 연산자는 왼쪽에서 오른쪽으로 연산을 수행하기 떄문에 순서에 따라 결과가 달라진다.

  - 7과 같은 기본형 타입의 값은 문자열로 변환할 때는 아무런 내용도 없는 빈 문자열("")을 더해주면 된다.

 

  2.3 형식화된 출력 - printf()

  - 출력을 위해 지금까지 println()을 써왔는데 변수의 값을 그대로 출력한다.

  - 그러므로 값을 변환하지 않고는 다른 형식으로 출력할 수 없다. 

  - 같은 값이라도 다른 형식으로 출력하고 싶을 때는 printf()를 사용한다.

  - printf()는 지시자(specifier)를 통해 변수 값을 여러 형식으로 변환하여 출력할 수 있다. 

  - 지시자

    -> %b: boolean형식으로 출력

    -> %d: 10진 정수의 형식으로 출력

    -> %o: 8진(octal) 정수의 형식으로 출력

    -> %x, %X: 16진(hexa-decimal) 정수의 형식으로 출력

    -> %f: 부동 소수점(floating-point)의 형식으로 출력

    -> %e, %E: 지수(exponent) 표현식의 형식으로 출력

    -> %c: 문자(character)로 출력

    -> %s: 문자열(String)로 출력

    -> %n: 출력 후 줄바꿈을 할 수 있다.

 

  Ex 2-4)

<hide/>
package javaStudy;
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 big = 100000000000L;
		long hex = 0xFFFF_FFFF_FFFF_FFFFL;
		
		int octNum = 010;   // 8진수 10, 10진수로는 8
		int hexNum = 0x10;  // 16진수 10, 10진수로는 16
		int binNum = 0b10;  // 2진수 10, 10진수로는 2
		
		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", 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);	
	}
}

  Note) 실행 결과

  - %5d 다섯 칸을 만들고 오른쪽 정렬

    ->%-5d: 다섯 칸 만들고 왼쪽 정렬

    -> %05d: 다섯 칸 만들고 오른쪽 정렬 (데이터 앞의 빈 부분은 0으로 채운다.)

  - '%x', '%o'에 '#'을 사용하면 접두사 '0x', '0'이 각각 붙는다. 

  - '%X'는 16진수에 사용되는 접두사와 영문자를 대문자로 출력한다. 

  - Integer.toBinaryString(binNum) : 정수를 2진 문자열로 반환한다. 

  - "c = %c, %d %n",c, (int)c : C언어에서는 char타입을 %d로 출력 가능하지만 자바는 허용하지 않는다.

    -> 위 처럼 꼭 int 타입으로 형변환해야만 "%d"로 출력할 수 있다. 

 

  Ex 2-5) 

<hide/>
package javaStudy;
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("[1234567890]%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); // 왼쪽에서 8글자만 출력
	}
}

  Note) 실행 결과

  - 실수형 출력(%f, %e(지수형태 출력), %g(값을 간략히 표현할 때))에 주로 %f가 쓰인다. 

  - %f는 소수점 아래 6자리까지만 반올림하여 출력한다.

  - %14.10f : 소수점 포함하여 14자리 중에서 소수점 아래 10자리, 정수 부분은 3자리이다.

    -> 정수의 빈자리는 공백으로 두고 소수점 아래의 공백은 0으로 채운다 

    -> %014.10f : 양쪽 빈자리를 모두 0으로 채운다. 

 

  2.4 화면에서 입력 받기 - Scanner

  - Scanner 클래스를 이용하기 위해 import java.util.*; 추가한다.

  Ex) Scanner

<hide/>
package javaStudy;
import java.util.*;  // Scanner를 사용하기 위해 추가

public class ScannerEx {
	public static void main(String[] args) {
		Scanner scanner = new Scanner (System.in); // Scanner 클래스의 객체를 생성한다. 
		
		System.out.print("두 자리 정수를 하나 입력하시오.>");
		String input = scanner.nextLine();	// 입력받은 내용을 input에 저장
		int num = Integer.parseInt(input);  // 입력받은 내용을 int타입의 값으로 변환
		
		System.out.println("입력 내용 :" + input);
		System.out.printf("num = %d%n", num);	
	}
}

  Note) 실행 결과

 

  - 정수를  하나 입력하면 아래의 두 줄이 출력된다. 

  - String input = scanner.nextLine() : 입력받은 내용을 input에 저장

  - int num = Integer.parseInt(input) : 입력받은 내용을 int타입의 값으로 변환

  - int num  = scanner.nextInt() : 정수를 입력 받아서 변수 num에 저장한다.

  - 만약, 숫자가 아닌 문자 또는 기호(공백 포함)를 입력하면 Integer.parseInt(문자열을 숫자로 변환)에서 에러가 발생한다.

 

  2.5 String

  - 문자열의 데이터가 변경이나 추가가 자주 일어날 때는 String이 아닌 "StrgingBuffer"를 이용한다.

    -> 데이터가 변경되도 객체가 새로 만들어지지 않기 때문이다.

    -> 메서드 append()를 이용해서 문자열을 이어 붙일 수 있다.

 

 

3. 진법

  3.1 10진법과 2진법

  Ex)

<hide/>
        int i1 = 10;    //10진수
        int i2 = 0b10;  // 2진수
        int i3 = 0x10;  // 16진수
        int i4 = 010;   // 8진수
        
        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);
        
[출력]
10
2
16
8

 

  3.2 비트(bit)와 바이트(byte)

  - 1 byte = 8 bit

  - 비트(bit, binary digit)는 하나의 비트

  - 바이트(byte)는 컴퓨터의 기억 장치의 크기를 나타내는 단위이며, 바이트의 실질적 의미는 ASCII 문자 하나를 나타낼 수 있다는 것이다. 

   - 워드(word)는 CPU가 한 번에 처리할 수 있는 데이터의 크기

 

 

  3.3 8진법과 16진법

  - 16진법: 0 1 2 3 4 5 6 7 8 9 A(10) B(11) C(12) D(13) E(14) F(15)

 

  3.4 정수의 진법 변환

  3.5 실수의 진법 변환

  - 10진 소수점수를 2진 소수점수로 변환하는 방법 

  (1) 10진 소수에 2를 곱한다. 

  (2) 결과에서 소수부만 가져다가 다시 2를 곱한다.

  (3) 소수부가 0이 될 때 까지 반복한다. 

  - 위의 결과에서 정수부만을 위에서 아래로 순서대로 적고 '0.'을 붙인다.

 

  3.6 음수의 2진 표현 - 2의 보수법

  Def) 어떤 수의 n의 보수: 더했을 때 n이 되는 수를 말한다.

  Ex) 0101(2) + 1011(2) => 0(2) (자리 올림이 있으나 4bit라서 버림)

  - 2진수 0101, 1011은 서로 2의 보수 관계에 있다. 둘을 더하면 0이 된다. 

  - 2의 보수법: 5, -5 처럼 절대값이 같고 부호가 다른 두 수를 표현 하는 방법 

  - 2의 보수 = 1의 보수 + 1

     -> 1의 보수는 0과 1을 서로 바꾸기만 하면 된다. 

 Ex)

<hide/>
public class Sam01{
    public static void main(String[] args){

        int i1   = 0b0000_0000_0000_0000_0000_0000_0000_1100; 
        int i1_1 = 0b1111_1111_1111_1111_1111_1111_1111_0011;   // i1에 대한 1의 보수 (0과 1을 반대로 뒤집는다.)
        int i1_2 = i1_1 + 1;    // i1에 대한 2의 보수 => i1에 대한 1의 보수 + 1
        int i2 = 0b1111_1111_1111_1111_1111_1111_1111_0100;     // i1에 대한 2의 보수 (모든 부호를 반전시킨다음 1을 더한다.)

        System.out.println(i1);
        System.out.println(i1_2);
        System.out.println(i2);
        System.out.println(i1 + i2);

    }
}

 

 

4. 기본형(Primitive type)

  4.1 논리형

  4.2 문자형 

  - 인코딩과 디코딩

    -> 'A' -> 65 (인코딩) , 'A' <- 65(디코딩) (문자 A의 유니코드: 65)

 

 4.3 정수형 

  - 정수형의 오버플로우 

  Ex) 4bit 2진수의 최댓값인 1111에 1을 더하면 ? 

    -> 네 자리만 저장되므로 결과는 0000이다. 

    -> 연산과정에서 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우라고 한다.

    -> 최댓값 + 1 = 최솟값, 최솟값 - 1 = 최댓값

 

  Ex) 언더플로우

<hide/>
public class Sam01{
    public static void main(String[] args){
        int i1 =  0b0111_1111_1111_1111_1111_1111_1111_1111; 
        int i2 =  0b1000_0000_0000_0000_0000_0000_0000_0000; 
        int i3 = i2 - 1;

        System.out.println(i1);
        System.out.println(i2);
        System.out.println(i3); // 언더플로우
    }
}

  Note) 실행 결과

 

  4.4 실수형 - float, double

  - 실수형에서는 오버플로우가 발생하면 변수 값은 무한대가 된다. 

  - 언더플로우는 실수형으로 표현할 수 없는 아주 작은 값. 즉 양의 최솟값보다 작은 값이 되는 경우를 말한다. 

 

  Def) 가수(Mantissa, M): 'M'은 실제 값인 가수를 저장하는 부분이다. 

  - 10진수로 7자리(float) 15자리(double)의 정밀도로 가능하다.

  - Float클래스의 floatToIntBits() : float타입의 값을 int타입의 값으로 해석하여 반환한다. 

 

  Def) 부호(Sign bit, S): 0이면 양수, 1이면 음수

  Def) 지수(Exponent, E): 부호이며 정수, 지수의 범위는 -128 ~ 128(float), -1023 ~ 1024(double)

 

 

5. 형변환(캐스팅, casting)

  5.1 형변환이란?

  Def) 형변환: 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

  1) 업 캐스팅(묵시적 형변환): 하위클래스형을 상위클래스형으로 변환한다.

  2) 다운 캐스팅(명시적 형변환): 반드시 명시적인 형변환 연산자가 필요하다. (상위 클래스형을 하위 클래스형으로 변환)

 

  5.2 형변환 방법                                                                                        

  5.3 정수형 간의 형변환

  5.4 실수형 간의 형변환

  - 실수형에서도 정수형처럼 작은타입에서 큰 타입으로 바꾸는 경우 빈공간을 0으로 채운다. 

 

  5.5 정수형과 실수형 간의 형변환

  - 정수형->실수형

    -> 91234567 -(double)-> 91234567.0 -(int)-> 91234567

    -> 91234567  -(float)-> 91234568.0 -(int)-> 91234568

    -> float는 10진수로 약 7자리의 정밀도 제공한다.

    -> float에 8자리의 정수를 저장할 때 오차가 발생한다. 

    - 실수형 -> 정수형 

    -> 소수점 이하는 버린다. (반올림이 발생하지 않는다.)

 

  5.6 자동 형변환

  - 자동 형변환하는 이유: 서로 다른 두 타입을 일치시키기 위해서 한다. 

  - 산술 변환: 연산 과정에서 자동적으로 발생하는 형변환

   (1) boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.

   (2) 기본형과 참조형은 서로 형변환할 수 없다.

   (3) 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이다. 

 

 

6. 자료형

  ex) ArrayList list = new ArrayList<>();

  - list.remove(2): 2번 인덱스에 있는 요소를 지운다.

  - list.remove(Integer.valueOf(2)): list에 있는 값인 2를 지운다.

  - list.clear(): list의 모든 값을 지운다. 

  - list.sort(Comparator.naturalOrder()): 오름차순 

  - list.sort(Comparator.reverseOrder()): 내림차순

 

'Java > Java의 정석' 카테고리의 다른 글

Chapter 06 객체지향 프로그래밍 I  (0) 2022.02.22
Chapter 05 배열(Array)  (0) 2022.02.20
Chapter 04 조건문과 반복문  (0) 2022.02.19
Chapter 03 연산자(Operator)  (0) 2022.02.19
Chapter 01 자바를 시작하기 전에  (0) 2022.02.15