티스토리 뷰
자바 특징
- 플랫폼 독립적 : 운영체제에 따라 코드를 재작성하지 않아도 됨.
- 객체 지향적 : 절차 지향적 언어에 비해 생산성이 높음. 보안성 높음.
자바 프로그램 작성/실행 과정
- 자바 소스 코드 작성 -> 자바 컴파일러가 바이트 코드 생성 -> 바이트 코드를 각 운영체제에 맞는 JVM이 실행
자바 활용도
- 웹 애플리케이션, 모바일 애플리케이션, 엔터프라이즈 애플리케이션, 웹/앱 서버 등
자바 플랫폼
- Java SE (Standard Edition) : 기본 개발 환경
- Java EE (Enterprise Edition) : 서버 기반 프로그램 개발 환경
- Java ME (Micro Edition) : 모바일, 임베디드 시스템 개발 환경
변수(Variable)
- 데이터를 저장하는 메모리 공간에 붙여준 이름
변수 이름 규칙
- 문자와 숫자, _(underscore), $ 사용 가능
- 대문자와 소문자 구분
- 숫자로 시작 불가
- 공백 사용 불가
- 미리 예약된 이름 사용 불가
표기법
- 카멜 표기법(Camel case) : 가장 앞의 문자는 소문자로, 나머지 단어의 첫 문자는 대문자료 표기
- 파스칼 표기법(Pascal case) : 각 단어의 첫 문자를 대문자로 표기
자료형(Data Type)
- Number : int, long, float, double / 2진수(0b), 8진수(0), 16진수(0x)를 이용해 표현 가능
- Boolean : true, false
- Character : char
- String : String, StringBuffer
문자열
- String : 일반 문자열.
관련 메소드 : methods : equals, indexOf, replace, substring, toUpperCase
- StringBuffer : 문자열을 자주 추가하거나 변경할 때 사용하는 자료형
관련 메소드 : append, insert, substring
자료구조
배열(Array)
- 자료형에 [] 붙이면 해당 자료형에 대한 배열이 된다.
리스트(List)
- 배열과 같이 여러 데이터를 담을 수 있는 자료형. 추가로 여러 가지 메소드를 제공 ex) ArrayList
관련 메소드 : add, get, size, remove, clear, sort, contains
맵(Map)
- key, value 형태로 데이터를 저장하는 자료형 ex) HashMap
관련 메소드 : put, get, size, remove, containsKey
제네릭스(Generics)
- <>를 이용해 자료를 명시적으로 지정. 제한적일 수 있지만 안정성을 높여주고 형변환을 줄여줌
연산자
- 항과 연산자 : 단항 연산자, 이항 연산자, 삼항 연산자
- 대입 연산자(=), 부호 연산자(+, -)
- 산술 연산자 (+, -, *, /, %), 증가/감소 연산자(++, --)
- 관계 연산자(>, <, >=, <=, ==, !=)
- 논리 연산자(&&, ||, !)
- 복합 대입 연산자(+=, -=, %= 등)
- 비트 논리 연산자(&, |, ^, ~)
- 비트 이동 연산자(<<, >>, >>>) : >>>의 경우 부호 비트 상관 없이 0으로 채움
관련 메소드 : Integer.toBinaryString
조건문 : if, switch
반복문 : for, foreach, while, do ... while
클래스(Object) : 객체를 정의하는 설계도
객체(Object) : 실체
인스턴스(Instance) : 클래스와 객체의 관계. 클래스로부터 객체를 선언하는 것을 인스턴스화라고 한다. 어떤 객체는 어떤 클래스의 인스턴스이다.
생성자(Constructor) : 객체가 생성될 때 자동으로 호출된다.
this, this() : this는 객체 자신을 의미하고 this()는 생성자를 의미한다.
오버로딩(Overloading) : 한 클래스 내에 같은 이름의 메소드를 여러 개 정의하는 것
- 조건
1. 메소드의 이름이 같아야 함.
2. 매개변수의 개수 또는 타입이 달라야 함(리턴 타입의 차이로는 오버로딩 되지 않음).
접근제어자 : 클래스의 변수나 메소드에 제한을 두는 키워드
- private : 해당 클래스에서만 접근 가능
- public : 어디서든 접근 가능
- default : 해당 패키지 내에서만 접근 가능
- protected : 해당 패키지 및 상속받은 클래스에서 접근 가능
Static : 변수나 메소드의 특성을 바꾸는 키워드
- 특징 : 메모리에 한 번만 할당됨. 즉, Static 변수나 메소드는 공유되는 특성을 가짐
- Static 클래스 변수 : 해당 클래스의 각 개체들이 값을 공유
- Static 클래스 메소드 : 객체를 생성하지 않아도 호출 가능
상속(Inheritance) : 기존 클래스에 기능 추가 및 재정의하여 새로운 클래스를 정의
- 부모 클래스 : 상속 대상이 되는 기존 클래스(=상위 클래스, 기초 클래스)
- 자식 클래스 : 기존 클래스를 상속하는 클래스(=하위 클래스, 파생 클래스)
- 특징
1. 부모 클래스의 필드와 메소드가 상속된다. 단, 생성자, 초기화 블록은 상속되지 않는다.
2. 다중 상속은 불가능하다
3. private, default 멤버는 자식 클래스에서 접근 불가능하다. default의 경우, 내부 패키지의 자식 클래스는 가능하다.
- super : 부모 클래스와 자식 클래스의 멤버 이름이 같을 때 구분하는 키워드
- super() : 부모 클래스의 생성자 호출
오버라이딩(Overriding) : 부모 클래스의 메소드를 자식 클래스에서 재정의
- 조건
1. 메소드의 선언부는 부모 클래스의 메소드와 동일해야 함
2. 반환 타입에 한해, 부모 클래스의 반환 타입으로 변환할 수 있는 타입으로 변경 가능.
3. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경 불가
4. 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 불가
다형성(Polymorphism)
- 한 객체가 여러 가지 타입을 가질 수 있는 것
- 부모 클래스 타입의 참조 변수로 자식 클래스 인스턴스 참조
* 업캐스팅 : 자식 클래스의 객체가 부모 타입으로 형 변환되는 것
* 다운캐스팅 : 원래 자기 객체가 부모 타입으로 형 변환된 것을 다시 자신의 클래스 쪽으로 형 변환시켜 주는 것이다.
instanceof : 실제 참조하고 있는 인스턴스의 타입 확인. // 다형성을 쓸 수 있는지 없는지 판별하는 도구
추상 메소드(Abstract Method)
- 자식 클래스에서 반드시 오버라이딩 해야 하는 메소드
- 선언만하고 구현 내용이 없음
추상 클래스(Abstract Class)
- 하나 이상의 추상 메소드를 포함하는 클래스
- 반드시 구현해야 하는 부분에 대해 명시적으로 표현
- 추상 클래스 자체는 객체 생성 불가
인터페이스(Interface)
- 다중 상속처럼 사용할 수 있는 기능
- 추상 메소드와 상수만으로 이루어짐
내부 클래스(Inner Class) : 클래스 안에 선언한 클래스
- 특징
1. 내부 클래스에서 외부 클래스 멤버에 접근이 가능함.
2. 외부에서는 내부 클래스에 접근이 불가
- 종류
1. 인스턴스 클래스(instance class) : 바깥 클래스를 만들어야 사용할 수 있는 형태
2. 정적 클래스(static class) : 내부 클래스에 static이라는 키워드가 붙어서 메모리에 바로 상주되는 클래스. 바깥 클래스가 만들어지지 않아도 바로 사용 가능하다.
3. 지역 클래스(local class) : 클래스 안의 어떤 메소드 안에 클래스가 있는 형태
4. 익명 클래스(anonymous class) : 이름을 가지지 않는 클래스. 선언과 동시에 객체를 생성된다. 일회용 클래스이다.
콘솔 입력 방법
1. Scanner : 매개변수로 System.in을 넣고 사용하면 된다.
2. System.in.read() : 문자를 하나만 읽어온다. 아스키 문자이기 때문에 만약 문자인 숫자를 숫자로 받으려면 -'0'를 해주어야 한다. 입력에서 enter key를 누르면 입력에 enter key가 남기 때문에 System.in.read(new byte[System.in.available()]);처럼 스트림에 남아 있는 코드를 바이트로 읽어서 처리해주든가 해야한다.
3. inputStreamReader : 매개변수로 System.in을 넣어줘야 한다. 여러 개의 문자를 받아올 수 있고 그 값을 받아올 배열이 필요하다.
4. BufferedReader : 매개변수로 InputStreamReader를 넘겨줘야 한다. 한 라인씩 읽을 수 있다.
System.out.print("입력: ");
int a = System.in.read() = '0';
System.out.println("a = " + a); // a = 1
System.in.read(new byte[System.in.available()]);
InputStreamReader reader = new InputStreamReader(System.in);
char[] c = new char[3];
System.out.print("입력: ");
reader.read(c);
System.out.println(c);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("입력: ");
String s = br.readLine();
System.out.println(s);
Scanner sc = new Scanner(System.in);
System.out.println(sc.nextLine());
* 같이 자주 사용되는 형변환 메소드 : Integer.parseInt(), Integer.valueOf() (Wrapper 객체 반환), Integer.toString()
콘솔 출력 방법
1. System.out.println()
2. System.out.print()
3. System.out.printf() : d(정수), o(8진수), x(16진수), f(부동소수점), c(문자), s(문자열), %5d(공간 5개를 차지한 뒤 숫자 표현), %.2f(3번째 자리에서 반올림하여 2번째 자리까지 표현)
파일 출력
1. FileWriter : 매개변수로 파일 경로 지정해주면 된다. 두 번째 매개변수는 이어쓰기와 관련있다.
2. PrintWriter : 매개변수로 파일 경로 지정해주면 된다. 이어 쓰기를 할 땐 FileWriter를 이어쓰기 모드로 선언해서 매개변수로 넣어줘야 한다.
3. FileOutputStream
파일 입력
1. BufferedReader : 매개변수로 FileReader를 넣어주면 파일에서 읽을 수 있다.
2. FileInputStream
// 파일 쓰기
FileWriter fw = new FileWriter("./memo.txt");
String memo = "헤드 라인\n";
fw.write(memo);
memo = "1월 1일 날씨 맑음\n";
fw.write(memo);
fw.close();
PrintWriter pw = new PrintWriter("./memo.txt");
memo = "헤드 라인";
pw.println(memo);
memo = "1월 1일 날씨 맑음\n");
fw.write(memo);
pw.close();
// 파일 이어 쓰기
FileWriter fw2 = new FileWriter("./memo.txt", true);
memo = "1월 2일 날씨 완전 맑음\n";
fw2.write(memo);
fw2.close();
PrintWriter pw2 = new PrintWriter(new FileWriter("./memo.txt", true));
memo = "1월 3일 날씨 흐림\n";
pw2.println(memo);
pw2.close();
// 파일 읽기
BufferedReader br = new BufferedReader(new FileReader("./memo.txt"));
while (true) {
String line = br.readLine();
if (line == null) break;
System.out.println(line);
}
br.close();
예외(Exception)
- 정상적이지 않은 케이스
ex) 0으로 나누기, 인덱스 초과, 없는 파일 등
예외 처리(Exception Handling)
- 정상적이지 않은 Case에 대한 적절한 처리 방법
finally : 예외 발생 여부와 관계없이 항상 실행되는 부분
throw : 예외를 발생시킴
throws : 예외를 전가시킴
try {
...
} catch(예외 case 1) {
....
} catch(예외 case 2) {
....
}
... 함수이름() {
throw new Exception();
}
... 함수이름() throws Exception {
...
}
Collection Framework : 여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것
1. List : 순서가 있는 데이터 집합. 데이터의 중복 허용
- 대표 구현 클래스
1)ArrayList : add, remove, size, contains, indexOf
2)LinkedList : add, addFirst, addLast, remove, removeFirst, removeLast, size
3)Vector
2. Set : 순서가 없는 데이터 집합. 데이터의 중복을 허용하지 않음
- 대표 구현 클래스
1)HashSet : add, remove, size, contains
2)TreeSet : add, remove, clear, first, last, lower, higher
3. Map : 키와 값의 쌍으로 이루어진 데이터 집합. 순서를 유지하지 않음
- 대표 구현 클래스
1)HashMap : put, remove, get
2)TreeMap : put, remove, get, firstEntry, firstKey, lastEntry, lastKey, lowerEntry, higherEntry
람다 표현식 : 메소드 대신 하나의 식으로 표현한 것. 익명 함수(Anonymous Function)라고도 한다.
- 장점
1. 일반적으로 코드가 간결해짐
2. 코드 가독성이 높아짐
3. 생산성인 높아짐
- 단점
1. 재사용이 불가능(익명)
2. 디버깅 어려움
3. 재귀함수로는 맞지 않음
스트림(Stream) : 배열, 컬렉션 등의 데이터를 하나씩 참조하여 처리 가능한 기능
- for문의 사용을 줄여 코드를 간결하게 함
- 스트림은 크게 3가지로 구성. Stream 생성, 중개 연산, 최종 연산
ex) 데이터소스객체.Stream생성().중개연산().최종연산();
- 스트림 생성
1. 배열 스트림 : Arrays.stream(arr)
2. 리스트 스트림 : ArrayList list = ~; list.stream();
- 중개 연산
1. Filtering : filter 내부 조건에 참인 요소들을 추출
2. Mapping : map 안의 연산을 요소별로 수행
- 스트림 최종 연산 : sum, average, min, max, forEach
- 스트림은 최종 연산을 만나면 더 이상 스트림 연산을 할 수 없고 종료된다.
// 1-1 배열 스트림
System.out.println("== 배열 스트림 ==");
String[] arr = new String[]{"a", "b", "c"};
System.out.println("== fori ==");
for (int i = 0; i < arr.length; i++) System.out.println(arr[i]);
System.out.println("== forEach ==");
for (String item : arr) System.out.println(item);
System.out.println("== to Stream ==");
Stream stream1 = Arrays.stream(arr);
stream1.forEach(System.out::println);
// 1-2 컬렉션 스트림
System.out.println("== 컬렉션 스트림 ==");
ArrayList list1 = new ArrayList(Arrays.asList(1, 2, 3));
System.out.println(list1);
Stream stream2 = list1.stream();
// stream2.forEach(System.out::println);
stream2.forEach(num -> System.out.println("num = " + num));
// 1-3 stream builder
System.out.println("== 스트림 builder ==");
Stream streamBuilder = Stream.builder().add(1).add(2).add(3).build();
streamBuilder.forEach(System.out::println);
// 1-4 stream generate
System.out.println("== 스트림 generate ==");
Stream streamGenerate = Stream.generate(() -> "abc").limit(3);
streamGenerate.forEach(System.out::println);
// 1-5 stream iterate
System.out.println("== 스트림 iterate ==");
Stream streamIterate = Stream.iterate(10, n -> n * 2).limit(4);
streamIterate.forEach(System.out::println);
// 1-6 기본 타입 스트림
System.out.println("== 기본 타입 스트림 ==");
IntStream intStream = IntStream.range(1, 5); // 끝 수를 포함하고 싶다면 rangeClosed 사용
intStream.forEach(System.out::println);
// 2. 스트림 중개 연산
System.out.println("== Filtering ==");
IntStream intStream2 = IntStream.range(1, 10).filter(n -> n % 2 == 0);
intStream2.forEach(System.out::println);
System.out.println("== Mapping ==");
IntStream intStream3 = IntStream.range(1, 10).map(n -> n * n);
intStream3.forEach(n -> System.out.print(n + " "));
System.out.println();
System.out.println("== Sorting ==");
IntStream intStream4 = IntStream.builder().add(5).add(1).add(3).add(4).add(2).build();
IntStream intStreamSort = intStream4.sorted();
intStreamSort.forEach(System.out::println);
// 3. 최종 연산
// 3-1. Sum, Average
System.out.println("== sum, average ==");
int sum = IntStream.range(1, 5).sum();
System.out.println("sum = " + sum);
double average = IntStream.range(1, 5).average().getAsDouble();
System.out.println("average = " + average);
// 3-2. Min, Max
System.out.println("== min, max ==");
int min = IntStream.range(1, 5).min().getAsInt();
System.out.println("min = " + min);
int max = IntStream.range(1, 5).max().getAsInt();
System.out.println("max = " + max);
// 3-3. reduce
System.out.println("== reduce ==");
Stream<Integer> stream3 = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)).stream();
System.out.println(stream3.reduce((x, y) -> x + y).get());
// 3-4. forEach
System.out.println("== forEach ==");
IntStream.range(1, 10).filter(n -> n == 5).forEach(System.out::println);
- Total
- Today
- Yesterday
- boj 3006
- 백준 16562
- boj 16562
- 백준 14868
- 부트 캠프
- 디지털 비디오 디스크
- 인간 대포
- 백준 1106
- 백준 3006
- 제로베이스 스쿨
- 백준 12713
- boj 14868
- 백준 2336
- 백준 9345
- boj 1280
- 터보소트
- 백준 2243
- boj 10473
- boj 12713
- boj 10775
- boj 9345
- 제로베이스 백엔드 스쿨
- Ugly Numbers
- 백준 1280
- 백준 10775
- boj 1106
- boj 2243
- 백준 10473
- boj 2336
- 사탕상자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |