package: 비슷한 카테고리의 클래스끼리 그룹화해둔 것
java.lang 이라는 패키지 안에는 일반적으로 자주 사용되는 클래스들이 포함되어 있다. 그리고 이 패키지는 자동으로 자바 프로그램에 제공이 된다. 만약 다른 패키지의 클래스를 불러와서 사용하려면 import packagename.* 또는 import packagename.ClassName;이라는 import statement가 필요하다.
package 아래에는 subpackage라는 계급도 존재한다. 따라서
import packagename.subpackagename.ClassName 등의 import statement도 존재를 한다.
ex)import java.util.*
보시다시피 packagename은 소문자로 작성되므로 주의하자.
static은 main method에서 class를 만들지 않고도 실행할 수 있게 만들어주는 접근제어자다. 즉 모든 main method는 static.
identifier: user가 naming할 수 있는 것
int x; //x declarated
double y,z; //y and z declarated
x = 15; //x initialized to 15
double p = 2.3; //p declarated $ initialized to 2.3
이외에도 integer랑 부동소수점 실수들이 메모리에 어떻게 저장되는지 교재에 나와있으나, 이 부분에 수업 전 내용에서 다뤘으므로 넘어간다.
Primitive data type들은 서로 다른 type으로 변환될 수 있다.
int total, n;
double average;
average = (double)total/n; //total이 먼저 explicit casting 되고, n이 implicit casting된다.
--
double cost = 10.7;
int num = (int) cost; //double을 int로 explicit casting하여 값이 짤린다.
교재에서는 이 셋 간의 변환을 가르치고 있는데 별로 안 중요하니까 넘어가라. 나와도 쉽게 할 수 있을 듯.
final int CLASS_SIZE = 35;
final double TAX_RATE = 0.08;
핵심: operator precedence(우선순위)

Arithmetic Operator(산술연산자): +, -, *, /, %
Realtional Operator(비교연산자): ==, !=, <, >, <=, >=
Logical Operator(논리 연산자): !, &&, ||
Assignment Operator(대입 연산자): =, +=, -=, *=, /=, %=
Increment/Decrement Operator(증감연산자): ++, --
*삼항/비트/시프트 연산자는 교재에 없다.
x-y <= emax(x,y) 방법을 사용한다. int a=2;
System.out.println(a++); //실행하고 나서 더한다 -> 2
System.out.println(++a); -> 3
IO.readLine(), IO.readDouble() 이런 식으로 나올 테니 알아둘 것.System.out.println();
\n: 줄바꿈
\": 큰따옴표 자체를 출력
\: \ 자체를 출력
System.out.println("He is known as \"furrygay\".");
//output: He is known as "furrygay".
System.out.println("I'm goint to cut th\nis.")
//output: I'm going to cut th
// is.
Selection statement = Decision-making Structure: 조건문
if, if else, nested if(중첩문), switch
Iterative statement: 반복문
for, for-each, while, do while
//if statement
if (a==3)
{
System.out.println("홍제시발");
}
//if...else statement
if (true)
{
System.out.println("시발앱컴");
}
else
{
System.out.println("사실백점맞음");
}
//nested if
if (앱컴싫어 == true)
if(일물싫어 == true)
System.out.println("휴학");
int a=3;
if (a>0)
if(a>4) System.out.println("꺼져 홍제야");
else System.out.println("사랑해 홍제야");
//기댓값: 아무것도 출력되지 않음
//현실: 사랑해 홍제야
else가 if(a>0)와 짝지을 줄 알았으나 if(a>4)와 연결되어 생기는 일이다. 사실 우리가 코드를 작성할 때는 {}를 쓰니까 그럴 일이 없긴 한데... 문제는 시험에 이런 식으로 함정이 나올 수도 있으므로 꼭 알아놓자.교재에는 안 나오지만 그래서 더 중요하다. if문이랑 바꾸는 법을 꼭 알자.
작년 기출에서는 조건을 if문 조건을 a>5같이 줘놓고 switch문으로 바꾸라는 문제가 있었다. 조건설정이 한정적인 switch문이므로 헷갈릴 수 있으나, 이건 casting 등을 이용하여 어떻게든 끼워맞출 수 있다. 당황하지 말자.
int a=4;
switch(a){
default:
System.out.print("흑흑");
case 3:
System.out.print("ㅅ비ㅏㄹ");
case 2:
System.out.print("개시발");
break;
case 1:
System.out.print("조같은 련아");
}
//output: 흑흑ㅅ비ㅏㄹ개시발
case는 엄밀히 따지면 실행할 코드를 조건으로써 보호하는 역할이라기보다는 조건이 맞는 자리로 호출하는 역할인 것 같다. 즉 break;를 만나지 않는 이상 코드는 계속해서 아래로 내려가며 코드들을 실행시킨다.
따라서, 위아래 코드 순서를 적당히 조절하면, 이런 부분들까지 활용할 수 있다.(정보 보안 등급이라던가...)
break가 끝까지 없으면 그냥 끝까지 실행하고 switch문을 나간다.
defualt는 if문의 else같은 친구다. 조건에 안 맞는 경우들을 모두 호출하는데 없다고 문제가 생기는 건 아니고 그냥 바로 switch문을 나간다.
반복문에서는 break와 continue 모두 쓰이나 여기서 continue 썼다가는 에러가 난다.
a에는 int를 넣어야 하는데, 사실 char도 된다. 실수형 넣으려고 하면 역정을 낸다.
for (initialization ; termination condition ; update statement)
{
/* body */
}
실행 순서는 initialization -> termination condition -> body -> update statement
종료 조건이 첫번째 실행 전부터 성립하면 그건 그냥 아무것도 실행하지 않을 뿐이다. 에러가 아니다.
모든 for문은 while문으로 변환이 가능하다!
break와 continue는 얘를 비롯한 반복문에서 알차게 사용된다. continue는 진행 중인 루프를 나가 다음 루프를 진행하는 것이고, break;는 반복문 전체를 벗어나는 것이다.
exit 조건이 비어있거나 true로 채워지면 무한반복.
while (boolean test)
{
/* loop body */
}
실행 순서는 boolean test -> loop body
for문에서 변환했을 때, initialization은 반복문 전에, update statement는 loop boy 끄트머리에 있게 된다.
만약 loop body에서 조건문이 false가 될 수 없는 코드가 적혀있다면 해당 반복문은 무한으로 반복하게 된다..
특히 continue를 잘못 써서 update statement에 도달하기 전에 다음 루프로 넘어가버린다면, 계속해서 같은 값으로 반복문을 맴돌게 될 것이다.
true를 쓰면 무한반복. 비워져있으면 에러다.
do{
/* loop body */
} while (boolean test)
//Enter list of positive integers, end with SENTINAL
final int SENTINAL = -999;
while (value != SENTINAL){
value=IO.readInt();
}
for (int element : a)
{
/*loop body*/
}
int[] d = new int[]{1,2,3};
for (int b : d)
{
System.out.print (b);
}
//output: 123
//d의 값들을 b에 순차적으로 복사
int[][] a = new int[][]{{1,2,3}, {2,3,4}};
for (int[] b : a){
System.out.println(b+);
for (int c : b)
System.out.println(c);
}
//output: [I@7adf9f5f 123 [I@372f7a8d 234
//즉 b에는 각 주소가 카피된다. c에는 b에 카피된 1차원 배열의 값들이 카피된다.
//4바이트(32bit, 16진수 8자리)의 주솟값이 복사된다.
}
element에 대입될 때 묵시적 형변환이 가능하다.
크게 두가지가 존재한다.
버그는 자바에서 제공하는 debugger를 사용하여 해결하거나, exception으로 핸들링한다.
모든 error는 exception으로 핸들링한다.(뭔 소린지 모르겠다만 그렇게 필기되어 있음.)
throw를 통해 exception을 지정할 수가 있다.
if (numScores == 0)
throw new ArithmeticException("Cannot divide by zero");
else
findAverageScore();