Java의 특징
1.운영체제의 독립적
- JRE(Java Runtime Environment)가 설치되어 있는 모든 운영체제에서 실행 가능.
- JRE : JVM(자바 가상머신) + 표준 클래스 라이브러리.
2.객체 지향 언어(Object Oriented Programming, OOP)
- 모든 기능은 객체로 만들어 사용.
- 유지보수가 쉽고 확장성이 높다.
3.함수형 프로그래밍 지원
- 자바 8버전부터 함수형 프로그래밍 지원 문법인 람다식, 스트림 추가.
4.자동 메모리 관리(Garbage Collection)
- 자바는 가비지 컬렉터(Garbage Collertor)를 실행시켜 메모리 관리 수고를 덜어 핵심 코드에 집중할수 있다.
JVM과 JDK
JVM(Java Virtual Machine)
- 자바는 컴파일러를 통해 기계어로 변환되는 언어.
- 컴파일 : 특정 프로그래밍 언어를 기계어로 번역하는 과정.
- .java file → javac → .class file → JVM → OS
- JVM : 자바 프로그램 실행 도구. Bytecode를 OS에 맞게 기계어로 변환.
Java 설치 관련 도구
- JRE(Java Runtime Enviroment) : JVM + 표준 클래스 라이브러리
- JDK(Java Development Kit) : JRE + 개발에 필요한 도구
타입(Type)
기본타입(primitive type)
- 값 저장 시, 데이터의 실제 값 저장
정수타입 byte(1byte), short(2byte), int(4byte), long(8byte)
- long 타입 할당 시 뒤에 ‘L’ 붙여서 할당.
1
long longNumber = 1234567890L;
자료형 | 크기 | 데이터 | 타입범위 |
---|---|---|---|
byte | 1byte | 정수 | -128 ~ 127 |
short | 2byte | 정수 | -32,768 ~ 32,767 |
int | 4byte | 정수 | -2,147,483,648 ~ 2,147,483,647 |
long | 8byte | 정수 | -9,223,372,036,854,775,807 ~ 9,223,372,036,854,775,807 |
- 언더플로우 < 타입범위 < 오버플로우
1
2
3
4
5
6
7
byte underflow = -128;
underflow--;
System.out.println(underflow); // 127
byte overflow = 127;
overflow++;
System.out.println(overflow); // -128
- 값 할당 시, float는 뒤에 ‘f’, double은 ‘d’를 붙임.(단, double은 생략 가능)
1
2
float floatNumber = 5.5f;
double doubleNumber = 5.5555d; // 5.5555 가능
자료형 | 크기 | 데이터 | 타입범위 |
---|---|---|---|
float | 4byte | 실수(부동 소수점수) | +-1.5 * 10-⁴⁵ ~ +- 3.4*10³⁸ |
double | 8byte | float보다 2배 정밀한 실수 | +-5.0_10-³²⁴ ~ 1.7_10³⁰⁸ |
- 논리타입 boolean(1byte)
- 0과 1로 표현하므로 1bit로 표현 가능
- JVM의 데이터 최소 단위가 1byte
- 문자타입 char(2byte)
- 유니코드기반
- 하나의 문자만 저장 가능 (ex, ‘a’)
- 작은 따옴표만 사용
- 참조타입(reference type)
- 값 저장 시, 데이터의 주소 값 저장
- 객체 주소 저장, 8개의 기본형 제외한 나머지 타입(클래스)
- 타입 변환
- 자동 타입 변환
- 타입크기가 작은 타입에서 큰 타입으로의 변환
- 덜 정밀한 타입에서 더 정밀한 타입으로의 변환
- 자동 타입 변환
1
2
byte byteValue = 10;
int intValue = byteValue;
수동 타입 변환
타입 크기가 큰 타입에서 작은 타입으로의 변환
1 2
long longNum = 1; byte byteNum = (byte)longNum;
참조타입에서의 메서드 사용 가능
1 2 3 4
StringBuilder sb = new StringBuilder(); sb.append("Hello "); sb.append("World!"); String hw = sb.toString(); // Hello World! 출력
문자열(String)
문자열은 참조타입
문자열은 되도록 리터럴로 생성.
1 2 3 4 5 6
String str1 = "apple" // 리터럴 String str2 = "apple; // 리터럴 String str3 = new String("apple"); // new 키워드로 문자열 객체 생성 System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false System.out.println(str1.equals(str3)); // true
문자열 합치기
문자열 쪼개기 🔗StringTokenizer
연산자
산술연산자 | 기능 | 비교연산자 | 기능 |
---|---|---|---|
+ | 더하기 | n < m / n > m | n이 m보다 작다/n이 m보다 크다 |
- | 빼기 | n <= m / n >= m | n과 m이 작거나(크거나) 같다 |
* | 곱하기 | n == m | n과 m이 같다 |
/ | 나누기 | n != m | n과 m이 다르다 (not 연산자) |
% | 나머지 | n && m | n과 m (and 연산자) |
- | - | n ⅼⅼ m | n 혹은 m (or 연산자) |
증감연산자
1
2
3
4
5
6
7
8
num++; // num + 1; 과 같다 num--; // num - 1; 과 같다
// 단, 위치에 따라 연산순서가 달라진다.
int num1 = 10;
System.out.println(num1++); // 10 출력 (후위형 증감연산자)
num1 = 10;
System.out.println(++num1); // 11 출력 (전위형 증감연산자)
- 후위형 증감연산자 : 기존의 값으로 코드를 먼저 실행시킨 다음에 증감연산 수행
- 전위형 증감연산자 : 증감연산을 먼저 수행시킨 다음, 결과값으로 코드를 실행
삼항연산자
조건식 ? 조건식이 true일때 실행문 : 조건식이 false일때 실행문
연산자 우선순위
우선순위 | 연산자 | 내용 |
---|---|---|
1 | (), [] | 괄호, 대괄호 |
2 | ! , ~ , ++ , – | 부정 / 증감 연산자 |
3 | *, / , % | 곱셈 / 나눗셈 연산자 |
4 | < , <= , > , >= | 대소 비교 연산자 |
5 | && | AND 연산자 |
6 | ⅼⅼ | OR 연산자 |
7 | ? : | 삼항연산자 |
8 | = , += , -= , /= , %= | 대입 / 할당 연산자 |
콘솔입출력
콘솔 출력
1
2
3
4
5
System.out.print("Hello World");
System.out.print("Nice to meet you!);
> 출력
> Hello WorldNice to meet you!
- 단순 출력 System.out.print()
1
2
3
4
5
6
System.out.println("Hello World");
System.out.println("Nice to meet you!);
> 출력
> Hello World
> Nice to meet you!
줄바꿈 출력 System.out.println()
- 형식 출력 System.out.printf()
- printf에서의
f
는 formatted 의 약자로, 출력할 형식을 지시해줄수 있다.
지시자 | 출력 포맷 |
---|---|
%b | Boolean |
%d | 10진수 |
%o | 8진수 |
%x, %X | 16진수 |
%c | 문자 |
%s | 문자열 |
%n | 줄바꿈 |
1
2
3
4
5
6
import java.util.Scanner; // (1)
Scanner s = new Scanner(System.in); // (2)
String input = s.nextLine(); // (3)
System.out.println(input); // (4)
- 콘솔 입력
java.util
에 저장되어있는 데이터 입력 프로그램 Scanner을 불러온다.- Scanner 클래스로 객체를 생성한다.
- 객체를 생성할때 new 연산자를 통해 생성하는데 이는 추후 정리할 예정.
- 입력받은 데이터를 변수 input에 할당한다.
- 타입은 그때마다 변경가능하다.
- 타입마다
nextline()
,nextInt()
,nextFloat()
등을 사용한다.
- 입력받은 데이터를 출력한다.
조건문
- 특정 조건 해당시 특정 부분만 실행 가능
if - else 문
1
2
3
4
5
6
7
8
if (조건식1) {
// 조건식1이 true일때 실행되는 실행문
} else if (조건식2) {
// 조건식1은 false이고 조건식2는 true일때 실행되는 실행문
} else {
// 위 모든 조건이 false일때 실행되는 실행문
// 생략 가능
}
1
2
3
4
5
6
7
8
9
10
11
12
if (5 < 10) {
return true;
} else {
return false;
}
---------------------
if (5 < 10) return true;
else return false;
// 위 두 코드는 같다.
- 조건식은 boolean값으로 평가되어야한다
{}
를 블록이라고도 하는데 블록에 들어가는 식이 한줄일 경우{}
생략 가능
switch 문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
public static void main(String[] args) {
int randomNum = (int)(Math.random() * 10) + 1; // 1 ~ 10 까지 랜덤으로 숫자 뽑기
switch (randomNum) {
case 1 :
System.out.println("1입니다");
break;
case 2 :
case 3 :
System.out.println("2랑 3입니다");
case 4 :
System.out.println("4도 있어요!");
break;
default :
System.out.println("5 ~ 10입니다");
}
- if - else 문과 달리 조건문이 아닌 변수가 어떤 값을 갖느냐에 따라 실행문이 작동한다.
- break;를 적어주면 밑의 case를 실행하지 않고 반복문을 빠져나간다
- default는 모든 case에 해당하지 않으면 실행한다
반복문
for 문
1
2
3
for (int i = 0; i < 100; i++) {
실행문
}
- 조건문이 true인 동안 계속 반복
- 반복할 횟수를 알고있는 경우 사용하면 좋다
향상된 for문 (for-each 문)
1
2
3
4
int[] nums = {1, 2, 3, 4, 5};
for (int num : nums) {
실행문
}
- 배열 요소를 순회하는 경우 사용하기 좋다
while 문
1
2
3
4
int num = 0;
while(num < 10) {
num++;
}
- 반복횟수를 모를 때 사용하면 좋다
- 조건문이 true인 동안 계속 반복
do - while 문
1
2
3
4
5
do {
System.out.println("무조건 1번 실행");
} while (num < 10) {
num++;
}
do는 무조건 한번 실행 후 while문 실행
- break : 반복문 종료
- continue : 다음 반복 실행
배열
- 배열의 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 선언 + 초기화
int[] arr1 = new int[5]; // 기본값은 0이므로 현재 {0, 0, 0, 0, 0}
String[] strArr1 = new String[5]; // 기본값은 null이므로 현재 {null, null, null, null, null}
// []에 수를 지정하는건 배열 요소의 개수를 지정해주는것
// 선언 + 초기화 + 값 할당
// 두가지 방법이 있다
int[] arr2 = new int[] {1, 2, 3, 4, 5};
int[] arr3 = {1, 2, 3, 4, 5};
String[] strArr2 = new String[] {"apple", "kiwi", "melon", "mango", "berry"};
String[] strArr3 = {"apple", "kiwi", "melon", "mango", "berry"};
// 선언 따로 할당 따로
int[] arr4;
arr4 = {1, 2, 3, 4 5};
- 배열 길이, 인덱스
1
2
3
4
5
6
7
8
9
10
11
12
int[] arr1 = {1, 2, 3, 4, 5};
System.out.println(arr1.length);
System.out.println(arr1[4]);
> 출력
> 5
> 5
// 인덱스는 1이 아니라 0부터 시작한다.
// 즉, arr1 배열을 예로 들면
// { 1, 2, 3, 4, 5} 각 요소들의 인덱스는
// 0 1 2 3 4 인 것이다
주의❗
- 문자열의 길이를 구할때는
length()
1
2
3
4
5
6
String str = "Hello";
System.out.println(str.length());
> 출력
> 5
- 다차원배열에서 2차원 배열은 표와 비슷한 형태
1
2
3
4
5
6
7
int[][] arr; // 2차원 배열
int[][] arr1 = new int[3][3];
/*{
{0, 0, 0},
{0, 0, 0},
{0, 0, 0}
}*/
- 가변배열 : 내부배열의 길이를 정하지않음
1
int[][] arr = new int[5][];