패키지 만들 때 java.com으로 만들면, java 폴더 안에 com 폴더를 생성해준다.
클래스 내부의 클래스는 자동으로 이름에 $가 붙는다. 따라서 클래스 이름에 $는 되도록 쓰지 말자. 그리고 PascalCase
가 기본이다.
자바의 환경변수 이름은 JAVA_HOME
고정
클래스와 관련된 상속은 단일, 인터페이스와 관련된 상속은 다중 상속이 가능하다.
실행 단계에서는 클래스 파일을 인터프리터가 구동하는 것이다.
// 한줄 주석
/* 부분 주석(단어 중간 주석), 여러 줄 주석 */
/**
* 문서화 주석, 보통 함수 위나 클래스 위에 온다.
* */
public class Test01Hello {
public static void main(String[] args) {
System.out.println("Hello, World!"); // sysout 치고 Ctrl + space 하면 자동완성도 됨
System.out.printf("%d %c %s", 456, 'B', "Hello"); // 456 B Hello
System.out.printf("%f", 3.141592); // 3.141592
System.out.printf("%.2f", 3.141592); // 3.14
// %d: 정수, %c: char, %s: string, %f: 실수
System.out.printf("%5d", 123); // ' 123'
} // end main
} // end class
블럭 끝날 때 주석으로 표시해주면 가독성에 좋다.
변수에 할당할 수 있는 대상은 모두 넓은 범위에서 literal
로 분류한다.
println()
은 매개변수가 없어도 돌아가면서 빈 줄을 하나 출력하지만, print()
는 매개변수 없으면 에러난다.
C계열 언어와 가장 큰 차이점. 메모리 해지에 대한 코드를 신경쓰지 않아도, OS에서 할당받은 메모리 중 필요 없어진 부분을 알아서 반환해준다.
byte(Byte)
, short(Short)
, char(Character)
, int(Integer)
, long(Long)
등float(Float)
, double(Double)
boolean(Boolean)
1바이트: byte
(-128 ~ 127)
2바이트: short
, char
(-32768 ~ 32767, ' ' ~ ' ')
4바이트: int
(약 -21억 ~ 21억), float
8바이트: long
(약 -900경 ~ 900경), double
public static void main(String[] args) {
byte b1 = 127;
System.out.println(b1.xxx); // b1에 점을 찍어도 아무 메서드가 없다.
System.out.println(Byte.MIN_VALUE); // Byte 객체는 내부 메서드를 사용할 수 있다.
byte b1 = (byte)128; // 강제 캐스팅이 가능하지만. byte는 -128~127 범위라 찍어보면 -128 나온다.
b1 = (byte)(127 + 1); 이것도 -128
int a = 2147483648L; // long으로 타입 변환됨
char c = 66;
System.out.println(c); // B
System.out.println((int) c); // 66
float f1 = 3.14f; // 자바는 실수 기본형이 double이기 때문에, f를 붙여서 명시를 해준다.
// long도 float에 할당이 가능하다.
// double이 8바이트이기 떄문에, float를 double에 당연히 할당할 수 있다.
boolean bool = false; // 0
bool = true; // 1
System.out.println(Boolean.TRUE + " or " + Boolean.FALSE); // "1 or 0"
// 래퍼런스 타입은 읽기 전용(final) 이므로 수정 불가능
}
static
변수에 접근하면, 글씨가 살짝 기울여져서 출력된다.System.out.println(100 + 'A'); // 165
System.out.println(100 + "A"); // 100A
System.out.println(100 + Integer.parseInt("100")); // 200
System.out.println(100 + Integer.parseInt("A")); // error
숫자 + 문자 = 숫자, 하지만
string
을 넣으면 결합된 값으로 인식한다.
Byte
, Short
등 위에 쓴 것들, String
등int a = 100;
System.out.println(a.MIN_VALUE); // error
Integer b = 100;
System.out.println(b.MIN_VALUE); // -2147483648
System.out.println(b.doubleValue()); // 100.0
System.out.println(b.getClass().getName()); // java.lang.Integer
String str = new String(new char[] {'a', 'n', 't'}); // String은 이런 식이다.
int[] sus = new int[] {};
System.out.println(str.length()); // 함수 타입
System.out.println(sus.length); // 참조 타입
// 미리 static final MIN_VALUE = 99 전역변수로 만들어놨다고 가정
Test01Var t01 = new Test01Var();
System.out.println(t01.MIN_VALUE); // 99
System.out.println(Test01Var.MIN_VALUE); // 99
+
, -
, *
등int su1 = 10;
int su2 = 3;
System.out.println(su1 / su2); // 3 (몫만 나온다)
System.out.println(su1 / 3.0); // 3.33333333333335
System.out.println(su1 % su2); // 1
long su_long = 9000000000000000000L; // 약 900경을 넘어서는 값은 처리할 수 없다.
BigInteger(string | byte[])
: 큰 수 처리 가능BigDecimal
import java.math.BigInteger;
import java.math.BigDecimal;
...
public static void main(String[] args) {
BigInteger b_long = new BigInteger("9000000000000000000");
System.out.println(b_long.add(new BigInteger("9000000000000000000")); // 18000000000000000000;
// subtract(), multiply(), divide(), remainder()도 가능하다. 반드시 매개변수로 new BigInteger 와야 함에 주의
double d1 = 2.0;
double d2 = 1.1;
System.out.println(d1 - d2); // 0.8999999999999999999999
BigDecimal d_su1 = new BigDecimal("2.0");
BigDecimal d_su2 = new BigDecimal("1.1");
System.out.println(d_su1.subtract(d_su2)); // 0.9
}
&
, |
, ^
, <<
, >>>
등System.out.println(10 & 6); // 2
System.out.println(10 ^ 6); // 12 (XOR, 1100)
System.out.println(1 << 1); // 2
System.out.println(1 << 3); // 8
System.out.println(8 >> 3); // 1
System.out.println(9 >> 3); // 1 (맨 오른쪽 1이 밀려나가면 그냥 없어진다)
System.out.println(-9 >>> 3); // 결과가 무조건 양수. 양수로 바꾸고 연산한다.
System.out.println(true & 3); // error
// 연산 한번에 5초라면,
System.out.println(true & false); // 10초
System.out.println(true && true); // 10초
System.out.println(true | false); // 10초
System.out.println(true || false); // 5초
=
, +=
, -=
, &=
, >>=
, %=
등int x = 10;
int y = 6;
y &= x;
System.out.println(y); // 2
(조건) ? (true) : (false)
int score = true ? 100 : 99;
System.out.println(score); // 100
++
, --
int x1 = 10;
int x2 = x1++; // x2 = x1이 먼저 실행하고, x1++이 실행된다.
.
, ,
, ()
, ...
(상위 요소).(하위 요소)
또는 ['a', 'b', 'c']
등 배열, 상속 등에 사용된다....
은 매개변수 배열연산에 사용된다.
if-else
switch-case
: 조건문에 정수, 문자형, 문자열만 올 수 있다. break
, default
를 잊지 말자.for
, while
aaa: for (int i = 0; i < 10; i++) {
bbb: for (int j = 0; j < 10; j++) {
ccc: for (int k = 0; k < 10; k++) {
System.out.print(k);
if (k > 5)
break aaa; // aaa를 정지
}
System.out.println();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
...
public static void main(String[] args) throws IOException { // BufferedReader 쓸려면 예외 throw 필요
...
boolean bool = true;
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
int i = 0;
while (bool) {
System.out.println("aaa");
String x = br.readLine(); // 특정 값 입력
if (x.equals("x"))
break;
i++;
}
...
int[] sus = new int[5]; // default 0, 정적할당
int[] sus2 = new int[] {0, 0, 0, 0, 0}; // 0 5개 동적할당, 출력 동일
int[][] suss = new int[5][10]; // [열][행], 이차원배열
int[][] suss2 = new int[][] {{11, 22, 33}, {44, 55, 66}}; // 이차원 동적할당 배열
String[] strs = new String[5]; // default null, 다른건 int와 같다.
String[] strs2 = {"aaa", "bbb", "ccc"}; // 좌변에 타입이 정의되어있다면, 이렇게도 가능하다.
strs2 = {"ccc", "ddd", "eee"}; // error