Don't give up!

[Java] 자바의 정석 정리(1장~5장) 본문

개발서적/JAVA의 정석

[Java] 자바의 정석 정리(1장~5장)

Heang Lee 2021. 5. 10. 20:28
자바의 정석을 읽고 정리한 내용입니다.

Java의 정석 - YES24

 

Java의 정석

최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아

www.yes24.com


1. 자바의 특징

(1) 운영체제에 독립적이다. JVM(Java Virtual Machine)이 명령을 운영체제가 이해할 수 있도록 변환하여 전달한다.

(2) 객체지향언어이다. 상속, 캡슐화, 다형성이 잘 적용되어 있다.

(3) 가비지컬렉터(Garbage Collector)가 자동적으로 메모리를 관리해주어 사용하지 않는 메모리를 체크하고 반환한다.

(4) Java API를 통해 네트워크와 멀티쓰레드를 지원한다. 자바 인터프리터가 쓰레드에 대한 스케쥴링을 담당한다.

(5) 동적 로딩(Dynamic Loading)을 지원한다. 실행 시에 모든 클래스가 로딩되는 것이 아닌 필요한 시점에 클래스를 로딩하여 사용한다.


2. 자주 발생하는 에러와 해결방법

(1) cannot find symbol 또는 cannot resolve symbol
지정된 변수나 메서드를 찾을 수 없다는 뜻, 대소문자의 일치여부까지 확인해보도록 하자.
(2) ';' expected
세미콜론이 필요한 곳에 없다는 뜻, ';'이 문장의 끝에 잘 붙어있는지 확인하자.
(3) Exception in thread "main" java.lang.NoSuchMethodError: main
main메서드를 찾을수 없다는 뜻, 클래스 내에 main메서드가 정의되어 있는지 확인하고, 메서드의 선언부에 오타가 없는지 확인하자.
(4) Exception in thread "main" java.lang.NoClassDefFoundError: (클래스명)
클래스를 찾을 수 없다는 뜻, 클래스파일(*.class)가 컴파일 이후 생성되었는지 확인하고 클래스패스(classpath)의 설정이 올바른지 확인하자.

(5) illegal start of expression

문장에 문법적 오류가 있다는 뜻, 괄호를 열고서 닫지 않았거나 수식에 문법적 오류가 있거나 public, static과 같은 키워드를 잘못 사용하였는지 확인하자.

(6) class, interface or enum expected

class, interface 또는 enum이 없다는 뜻, 보통 열린괄호와 닫힌괄호의 개수가 일치 하지 않는 경우 발생하므로 이를 확인하자


3. 변수

(1) 변수의 명명규칙

1. 대소문자가 구분되며 길이에 제한이 없다. True와 true는 서로 다른 것으로 간주된다.
2. 예약어를 사용해서는 안된다. (true - x, True - o)
3. 숫자로 시작해서는 안된다. (a1 - o, 1a - x)
4. 특수문자는 '_'와 '$'만을 허용한다. ($harp - o, S#arp - x)
5. 클래스 이름의 첫 글자는 항상 대문자, 변수와 메서드의 이름의 첫 글자는 소문자로 한다.
6. 여러 단어로 이루어진 이름은 단어의 첫 글자를 대문자로 한다. (lastIndexOf, StringBuffer)
7. 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 '_'로 구분한다.

4. 변수의 타입

(1) 기본형(primitive type)

분류 타입 크기
논리형 boolean 1byte
문자형 char 2byte
정수형 byte 1byte
short 2byte
int 4byte
long 8byte
실수형 float 4byte
double 8byte

(2) 'final'을 붙인 상수는 반드시 선언과 동시에 초기화해야 하며 이름은 모두 대문자로 하여야 한다.

여러 단어로 이루어져 있는 경우 '_'로 구분한다.

final int MAX_VALUE = 100;

(3) 리터럴의 타입

정수형과 실수형에 다양한 타입이 존재하므로 리터럴에 접미사를 붙여서 타입을 구분한다.

접미사 'l','L'은 long 타입의 리터럴, 'f','F'는 float 타입의 리터럴, 'd','D'는 double 타입의 리터럴을 의미한다.

접두사 '0x','0X'(16진수),'0b','0B'(2진수),'0'(8진수)로 2,8,10,16진수를 표현할 수 있다.

정수형에서는 int, 실수형에서는 double이 기본 자료형이다.

int octNum = 010;			//8진수 10, 10진수로 8을 의미.
int hexNum = 0x10;			//16진수 10, 10진수로 16을 의미.
int binNum = 0b10; 			// 2진수 10, 10진수로 2를 의미.
long big = 100_000_000_000L;		//100000000000L과 동일.
long hex = 0xFFFF_FFFF_FFFF_FFFFL;	//0xFFFFFFFFFFFFFFFFL과 동일.
double rate = 1.618; 			//OK.
double rate2 = 10.; 			//OK. 10.0과 동일
double rate3 = .10; 			//OK. 0.10과 동일
float hundred = 100f; 			//100.0f와 동일
float hundred2 = 0.1e3f; 		//0.1 x 10^3 = 100.0f
double hundred3 = 1e2; 		//1 x 10^2 = 100.0d
double reverse = 1e-2; 		//1 x 10^-2 = 0.01d

(4) 타입의 불일치

변수와 리터럴의 타입이 불일치하여도 저장 범위가 넓은 타입에 좁은 타입의 리터럴 값을 저장하는 것은 허용된다.

int i='A';		//OK. 문자'A'의 유니코드 65가 i에 저장된다.
long l = 123;		//OK.
double d = 3.14f; 	//OK.
byte b = 55;		//OK.
short s = 0x1234;	//OK.
float f = 3.14;		//ERROR. float 타입 변수에 double 타입 리터럴 저장불가.
int i2 = 0x123456789	//ERROR. int 타입의 범위를 넘는 값 저장불가.

(5) 정수형 타입의 오버플로우

정수형 자료형은 1bit를 부호 비트로 사용하고 나머지 비트를 값을 표현하는 비트로 사용한다.

만약 변수의 비트로 값을 표현할 수 없을 정도로 크거나 작은 리터럴 값이 저장되려 한다면 부호 비트까지 비트가 저장되고, 그 위의 상위 비트는 버려진다. (오버플로우 발생)

JVM의 피연산자 스택(operand stack)이 피연산자를 4byte 단위로 저장하기 때문에 4byte보다 작은 자료형(byte, short)는 4byte로 변환하여 연산이 수행된다. 따라서 int를 사용하고 int의 범위(+-21억)를 넘어서는 수를 다뤄야 할 경우에는 long을 사용하는것이 좋다. (byte나 short는 저장공간을 절약하는 것이 중요할때 사용.)

 

(6) 실수형 타입의 정밀도와 언더플로우

실수형 자료형은 1bit를 부호로 사용하고 나머지 비트를 지수, 가수로 나누어 사용한다.

지수 비트에도 1bit는 부호 비트이며 나머지 비트로 지수를 표현하는데 이에 따라 소수 n번째 자리까지 표현할 수 있다.

소수 n+1번째 자리의 값은 비트로 저장되지 않아 오차가 발생.(정밀도)

실수형 타입은 표현범위의 최대 값을 벗어나면 오버플로우가 발생하지만 변수의 값은 무한대(infinity)가 된다.

실수형 타입의 비트로 표현할 수 없는 0에 가까운 실수는 정밀도에 의하여 0으로 표기된다.(언더플로우)


5. 형변환

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

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

(3) 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.


6. 연산자

(1) 산술 연산자 -> 비교 연산자 -> 논리 연산자 -> 대입 연산자의 순서로 실행.

(2) 단항 연산자 -> 이항 연산자 -> 삼항 연산자의 순서로 실행.

(3) 연산 수행 직전에 피연산자는 자동으로 형변환된다.(산술 변환)

(4) 논리 연산자 ||(OR)은 앞의 피연산자가 true이면 뒤의 피연산자 값을 평가하지 않고 &&(AND)는 좌측 피연산자가 거짓이면 우측 피연산자를 평가하지 않음.


7. 배열

(1) System.arraycopy()를 이용하여 배열을 복사할 수 있다. for문을 이용한 복사보다 System.arraycopy()를 사용하는 것이 효율적이다.

(2) 복사하려는 내용보다 배열의 여유 공간이 적으면 ArrayIndexOutOfBoundsException이 발생한다.

int[] num = new int[8];
int[] newNum = new int[8];
System.arraycopy(num,0,newNum,0,num.length);

(3) String 타입은 char배열에 메서드를 추가한 것이다.

(4) 2차원 이상의 배열은 마지막 차수의 길이를 지정하지 않고 추후에 다른 길이의 배열을 생성할 수 있다.

int[][]score = new int[5][];	//두번째 차원의 길이를 저장하지 않을 수 있음.
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

(5) 배열의 출력은 반복문을 사용하여 원소들을 출력하거나 Arrays.toString()함수를 사용하여 출력한다.

다만 char배열은 println메서드가 문자열로서 출력하도록 작성되어 있어 직접 출력할 수 있다.

int[] score = {10,20,30,10};
for(int i=0;i<score.length;i++){
	System.out.println(score);
}
System.out.println(Arrays.toString(score));
char[] test = {'t','e','s','t'};
System.out.println(test);

'개발서적 > JAVA의 정석' 카테고리의 다른 글

[JAVA] 자바의 정석 정리(8장)  (0) 2021.05.16
[Java] 자바의 정석 정리(7장)  (0) 2021.05.15
[JAVA] 자바의 정석 정리(6장)  (0) 2021.05.12