<1> 자바의 특징
1. WORA (Wirte Once and Read Anywhere)
자바는 운영 체제에 독립적인 특징을 지닌다 → 어느 운영체제에서도 사용 가능함 (windows, Linux, Mac ...)
2. Garbage Collections
더이상 사용하지 않는 메모리를 자동으로 정리하는 기능
가비지 컬렉션은 언제 발생하는가? 며느리도 모른다. 자기가 한가할 때 해줌
3. 객체 지향언어
자바는 객체지향 언어로 맴버 변수와 메서드를 갖는다
. : ~ has
4. 클래스는 자바의 최소 구성 단위이다
<2> Variables
💡 Variable (변수) : 메모리 공간을 의미한다
메모리 공간에 값 (value) 를 할당(assign) 한 후에 사용한다
- 타입
변수에 저장되는 데이터 종류
타입 | 형 | 데이터 타입 | 정의 | bit |
Primitive Types(기본형) | 논리형 | boolean | true/false | - |
정수형 | byte | 부호 O | 8 | |
short | 부호 X | 16 | ||
int | 정수 default | 32 | ||
실수형 | long | 부호 O | 64 | |
float | 부동소수점 실수 | 32 | ||
double | 실수 default | 64 | ||
문자형 | char | unicode | 16 | |
Reference Types(참조형) | - | - | - | - |
(1) 기본형 변수 (Primitive Type)
미리 정해진 크기의 memory size 가 있고 변수 자체에 값을 저장한다
(2) 참조형 변수 (Reference Type)
미리 정해질 수 없는 데이터를 참조하는 변수로 실제값을 참조할 수 있는 주소값만을 저장한다 → "HEAP" 영역에 공간의 주소를 저장한다
<3> Byte
Byte 표기법: 첫번째 비트는 sign을 나타낸다 (0-positive, 1 - negative)
00001001 : 1+ 2^3 = 9
10001001 : 1 + 2^3 + (-1)*2^8 = -119
<4> Type Casting
💡 형변환은 변수의 타입을 다른 타입으로 변환하는 행위이다
형변환에는 크게 두가지 종류가 있다
- 명시적 형변환 (Demotion)
(1) Big → Small
(2) 값 손실이 발생하기 때문에 JVM이 자동으로 처리해주지 않는다
(3) 괄호를 사용하여 형변환을 한다
int i =30000; //32 bit
byte b = (byte) i ;// 32 bit -> 8 bit. 작은 상자안에 아파트 한채 구겨넣는중
- 묵시적 형변환 (Promottion)
(1) Small → Big
(2) 작은 타입을 큰 타입에 담는 것이기 때문에 값 손실이 따로 발생하지 않는다. 따라서, 별도로 타입 캐스팅문을 쓰지 않아도 JVM 이 자동으로 처리해준다
byte b =10;
int i = b; //큰 컨테이너 안에 작은 상자를 넣는중 -> 가능
int i2 =(int) b; //(int) 를 생략해도 JVM 이 자동으로 처리해준다
<5> 연산자
연산자는 보통 우측 방향으로 실행한다. 연산자의 순서를 외워놓으면 좋지만 구지 외우지 않아도 괜찮으며, 본인이 외우고 있다고 하여도 가독성이 좋은 코드를 짜기 위해서는 괄호를 이용하는 것이 더 나은 방법이다.
연산자는 보통 우측 방향으로 실행하는데, 단항 연산자만이 왼쪽 방향으로 연산을 진행한다.
- 대입 연산자: = , += , -=, %= 등등
- 단항 연산자: ++, —, !, ~ ,+/-(부정, bit 변환> 부호 )
비트 연산자는 *2 나 /2 에 비해 속도가 빠르다
int a =10; //a : 1 0 1 0 -> a<<1: 1 0 1 0 '0'|| a: 1 0 1 0- > a>>1: '0' 0 1 0 1
int b = a<< 1; // *2 와 동일
int d = a>>1; // ./2 와 동일
논리 연산자
연산자 | 기능 | 연산 방향 |
& | 두개의 연산자가 모두 true 인 경우 : true | -> |
| | 두개의 연산자 중 하나 이상이 true 인 경우 : true | -> |
! | NOT | -> |
^ | 두개의 연산자가 서로 다를 경우에만 true | -> |
Short Circuit 연산자
연산자 | 기능 | 연산 방향 |
&& | & 와 동일하나 앞의 피연산자가 false이면 뒤 연산자를 검사하지 않는다 | -> |
|| | |와 동일하나 앞의 피연산자가 true이면 뒤 연산자를 검사하지 않는다. | -> |
위의 두 연산자를 자주 혼동했었는데,
&& 을 쓰면 앞의 피연산자가 false 일때 뒤의 조건을 보지 않고 false 를 산출해버리기 때문에 원치 않은 결과를 내면서 어디가 틀렸는지 헤맬 수 있기 때문에 (자기소개) 주의해서 사용해야 한다.
Example:
int num1 =9, num2 =2 , num3 = 0;
/* num1 == num2 는 false 이기 때문에,
num1 / num3 은 <int/0>의 형태를 띄어서 exception 이 발생해야하지만 "False" 를 출력한다*/
System.out.print((num1==num2) && (num1/num3) >0);
System.out.print((num1==num2) & (num1/num3) >0); //error -> 양쪽 다 돌린다
<6>제어문
- If 문
(1) 구조
if - if , if -else, if- else if- else
int age = 29 ;
if (age >= 31) {System.out.println("선바..?");
else if (age >= 26) {System.out.println("화석");}
else if (age >=24 ) {System.out.println("선배님...");}
else if (age >= 20) {System.out.println("삐약");}
else {System.out.println("응애 나 애기");}
(2) 삼항 연산자
Format : datatype variableName condition ? value1 : value2 ;
String collegeYear = age > = 26 ? "화석" : "응애 나 애기" ;
//age 가 26이상이면 화석이고 아닐경우엔 응애 나 애기가 collegeYear 에 할당된다
System.out.println(" I am... " + collegeYear);
- Switch 문
(1) 구조
switch (age) {
case 26 :
collegeYear = "화석" ;//break 문이 없으면
case 30 :
collegeYear = "공룡" ;
break;
case 24 :
collegeYear = "선배";
break;
default :
collegeYear = "응애 나 애기";
break;
}
위 스위치 문에서, case 26 일때, break 문을 사용하지 않았다.
26 을 입력하면 break 가 없어서 "화석"이 아닌 그 다음 케이스의 "공룡"을 저장함
🤦🏻♀️ 자바에서는 case 1: case 2: case 3: 과 같이 결과가 같을 때 한번에 선언할 수 있다 !
ex: case 1: case 2: case 12 : season = "겨울"; break;
case 3: case 4: case 5: season = "봄" break;
case 6: case 7: case 8: season = "여름" break;
case 9: case 10: case 11: season = "가을" break;
default : season = "살고계신 세계관이 다르신가..?"; break;
<7> 반복문
1. For Loop
(1) 문법
(2) for each vs for :
for each loop 는 index 를 가져올 수 없지만 짧아서 편리함. 상황에 따라서 효율적으로 써야함
int[] arr = {1,2,3,4,5};
//방법 1: for( 변수 초기화; 반복 조건 ; 증감식)
for(int i =0 ; i<arr.length; i++) {System.out.print(arr[i] +" "); }
//방법 2: for each loop
for(int x: arr) {System.out.print(x+" ");}
2. While Loop
(1) 문법
(2) while vs do... while:
while loop 는 condition이 true 일때만 block 안에 있는 조건을 실행하지만, do...while loop 는 condition을 만족하지 못하더라도 loop의 끝까지 돌아간다.
//방법 1: while loop
int i =0; //declare variables outside of the loop and write inc/dec inside body
while(i<arr.length){System.out.print(arr[i]); i++;}
//방법 2: Do- While Loop
do { System.out.print(arr[i]+" "); i++; }while(i<arr.length);
3. For Loop vs While Loop
Loop | Use When... |
for | 1. 초기값, 조건식, 증감식의 위치가 명확 2. 예측 가능한 반복 3. index의 증감 활용 |
while | 1. 예측 가변적인 반복 2. index 보다는 break, continue 활용 |
<8> 배열
동일한 type의 변수를 여러개 사용하다보면 변수의 수도 증가하고 코드의 길이가 증가한다. 또, 반복문 적용이 불가하고 변수의 수가 동적으로 결정될 경우에 사용이 불가하다.
이 때, 배열(Array)를 사용해서 동일한 타입의 변수를 대신한다.
- 정의
(1) 동일한 타입의 데이터 여러개를 하나의 연속된 메모리 공간에 관리하는 것
(2) 요소에 접근하는 속도가 매우 빠르며 크기 변경이 불가하다. - 배열 선언
(1) 배열 선언:
new keyword와 함께 데이터 타입과 크기를 지정한다 → new data_type[size]
ex) int [] array = new int[2]; → array 는 생성된 배열을 가르키는 참조형 변수다.
(2) 배열 선언의 4가지 방식- int [] array1 = new int [5] ; array = new int [5];
- int [] array 2 = new int [5];
- int [] arryay3 = new int[] {1,2,3,4,5};
- int [] array4 = {1,2,3,4,5};
🤦🏻♀️ 배열 선언 후 생성 시 초기화에 주의해야 한다 !
int [] array1 ;
array1 = {1,2,3,4,5}; //Compile Error -> array size is not initialized
//Valid Code
int [] intarr = {1,2,3};
//inValid Code : { } 를 통한 배열 생성은 변수 선언과 동시에 해야한다
bool[] bools;
bools = {true, false, false} ;
int [] array2 ;
array2 = new int [] {1,2,3,4,5}; //선언할 때는 배열의 크기를 알 수 없을 때
3. 배열의 값을 조회 할 때에는 index 를 사용한다
4. for- each 는 배열에서 자주 쓰인다 → Read Only 인 경우에만 주로 쓰인다
5. Array is Immutable
배열은 최초 메모리 할당 이후 변경이 불가하다
개별 요소는 다른 값으로 변경/overwrite 가능하지만 삭제할수가 없고, 크기를 늘리거나 줄일 수도 없다 → resize: ArraysCopyOf 를 사용해서 한다
6. 2차원 배열
배열 선언:
- int arr1 [ ] [ ] = new int [4][2] ;
- int [ ] arr2 [ ] = new int [4][2]; → 2D Array : [ ] 의 위치는 상관 없다 !
- int [ ] [ ] arr3 = new int [4][3];
- int [ ] [ ] arr5 = new int [ ] [ ] {{1,2,3,4,5},{2,3,4},{3,4} };
- int [ ] [ ] arr6 = {{1,2} , {2,4,5,6,2} , {2,3,4,} };
- int [ ] [ ] arr4 = new int [4]{1,2,3,4,5} ; → 불가능 !!
int [][] arr2D = new int [4][]; //valid
arr2D[2] = new int [2]; //valid
arr2D[0]= new int[4]; //valid
arr2D[1]= {1,2,3}; //inValid! -> arr2D = new int [] {1,2,3}; 으로 수정
🤦🏻♀️ 2D Arrays Tip
1. 프린트 방법
배열을 프린트 할때는,
(1) 1차원 배열일 경우, Arrays.toString()
(2) 2차원 배열일 경우 Arrays.deepToString() 을 사용한다
2. Getting Length:
int [ ] [ ] array1 = new int [4][5];
(1) row : array1[0].length //4
(2) column : array1. length //5
'취준 > JAVA' 카테고리의 다른 글
추상화 (0) | 2022.05.17 |
---|---|
객체 지향 프로그래밍 (0) | 2022.05.17 |
Class Case Exception (0) | 2022.05.17 |
Variables (0) | 2021.07.15 |
다짐 (0) | 2021.07.15 |