1. String.format => System.out.printf 와 사용법은 동일
=> 문자열로 서식을 적용해서 리턴을 해주는 메소드
=> C언어의 printf 함수와 유사하게 사용하는데 출력을 하는 것이 아니고 문자열을 리턴
=> format ("서식", 데이터나열)
=> 서식(%로 시작)
%d: 10진 정수 출력
%5d: 자리 출력으로 빈 자리는 공백
%-5d: 왼쪽 맞춤을 수행하고 5자리로 출력하고 빈 자리는 공백
%05d: 5자리로 출력하고 빈 자리는 0
%o: 8진수 출력
%x: 16진수
%c: 문자 출력
%e: 지수 형태로 실수 출력
%f: 고정 소수점 형태로 실수 출력
%3.1f: 최소 3자리 소수는 1자리(2번째 자리에서 반올림)
%03.1f: 최소 3자리 소수는 1자리(2번째 자리에서 반올림), 빈자리는 0
%-3.1f: 최소 3자리 소수는 1자리(2번째 자리에서 반올림), 왼쪽 맞춤
%s: 문자열
%5s: 문자열을 5자리로 출력하고 빈 자리는 공백
%-5s: 문자열을 5자리로 출력하고 빈자리는 공백으로 출력하고 왼쪽 맞춤
실습) 구구단 출력
public class Main1 {
public static void main(String[] args) {
for(int j=1; j<=9; j=j+1) {
for(int i =2; i<=9; i=i+1) {
System.out.printf(" %d*%d = %02d\n",j,i, j*i);
}
System.out.printf("\n");
}
}
}
2. 인코딩과 디코딩
Encoding (인코딩): 암호화, 문자열을 메모리에 저장하는 코드로 변경하는 것
Decoding (디코딩): 해독, 메모리에 저장된 코드를 문자열로 변환하는 것
컴퓨터는 숫자만 저장
ASCII Code : 영문을 숫자로 표현하기 위한 미국 표준 코드
NULL: 48 0x30
'A': 65 0x41
'a': 97 0x61
1)한글 인코딩 방식
ms949(cp949, euc-kr):MS가 사용하던 인코딩 방식 - 예전 웹 페이지나 윈도우의 기본설정
utf-8:현재 사용하는 브라우저들의 인코딩 방식 - Mac 이나 Linux의 표준 인코딩 방식
2)String에서의 변환
byte [] getBytes(): 문자열을 바이트 배열로 변환해주는 메소드로 매개변수로 인코딩 방식을 대입할 수 있습니다.
String(byte배열, "인코딩방식"): byte 배열을 인코딩방식의 문자열로 리턴해주는 String 의 생성자
3)Eclipse의 인코딩 설정
[Window] - [Preferences] 메뉴를 실행한 후 왼쪽 창에서 [General] - [Workspace]를 선택하고
오른쪽 창에서 Text file
3. StringBuilder
=> 문자열 클래스로 비슷한 클래스로는 StringBuffer가 있다.
=> 객체를 생성할 때 여분의 공간을 가지고 있어 뒤에 문자열을 이어붙일 수 있다.
String
=> 변경할 수 없는 문자열
StringBuilder
=> 변경가능한 문자열
=> 멀티스레드에 안전하지 않음
StringBuffer
=> 변경가능한 문자열
=> 멀티스레드에 안전
=> 비추천 (legacy-warning)
1) 생성자
StringBuilder()
StringBuilder(String str)
2) 메소드
void append(String str): str을 뒤에 추가
String toString(): String으로 변환
public class Main5 {
public static void main(String args[]) {
StringBuilder sb = new StringBuilder("Test ");
sb.append("Hello StringBuilder");
String str = sb.toString();
System.out.println("str:" + str);
}
}
4. 검색(Search) 알고리즘
1) 순차검색: 데이터가 정렬되지 않은 경우에 데이터를 순서대로 검색
2) 제어검색: 데이터가 정렬되어 있을 때 사용
- Binary Search (이분검색) : 중앙값과 비교, 작으면 왼쪽, 크면 오른쪽
- fibonacci search : 첫번째와 두번재째는 1, 세번째 부터는 이전
검색값-최소값 / 최대한 - 최소값 x데이터 갯수
3) 보간 검색 : 검색위치를 제안
4) 이진트리검색 : 데이터를 저장할때 이진 트리 씀(sort)
5. 빠른 열거(Fast Enumeration)
=>배열처럼 동일한 자료형의 데이터를 여러 개 저장하고 있는 데이터들을 빠르게 순회할 수 있도록 만든 문법
for(임시변수 in 여러개의 데이터를 가진 객체 이름){
반복 수행할 내용;
}
=>임시변수에 데이터가 순서대로 하나씩 대입됩니다.
6. Generics (코드는 위의 실습 예시 아래 포함 되어있음)
=>java 일반화 프로그래밍 지원 기능
=>일반화 프로그래밍: 동일한 알고리즘을 사용하는 경우에 자료형에 상관없이 하나만 만들어두고 알고리즘을 사용할 때 자료형을 결정지어서 사용하자는 프로그래밍 - 스크립트 언어가 모두 이 방식을 이용합니다.
1) Generics를 적용한 클래스
class 클래스이름<미지정자료형>{
미지정 자료형을 사용한 내용;
}
2.Generics를 적용한 클래스의 객체 만들기
클래스이름<확정자료형>변수명 = new 클래스이름<확정자료형>();
=>확정 자료형은 참조형만 가능합니다.
boolean, byte, short, char, int, long, float, double 은 안됨
3.Generics가 적용된 클래스의 객체를 만들 때 확정 자료형을 기재하지 않으면 자료형은 Object가 됩니다.
그리고 경고가 발생합니다.
7. java.util.Arrays 클래스
=>배열과 관련된 클래스
1) 클래스 상속계층과 특성 파악
public class Arrays extends Object
=>Object 클래스로부터 상속받은 클래스
=>abstract class: 상속을 해서 사용 - 객체 생성 못함
=>final class: 상속을 못함
=>interface: implements 해서 사용 - 객체 생성 못함
2) 생성자(Constructor) 확인
=>생성자 없음
- abstract class 나 interface는 아니었는지 확인
- 모든 메소드 앞에 static이 붙었는지 확인
- 위의 경우에 해당되지 않는 경우에는 static 자신의이름 으로 된 메소드가 있는지 찾아야 합니다.
3) 주요 메소드
- static <T> List<T> asList(T... a): 데이터를 개수에 상관없이 받아서 List 객체로 리턴해주는 메소드
- static int binarySearch(배열, 데이터): 배열의 데이터가 정렬된 경우에 데이터를 찾아서
그 위치를 리턴해주는 메소드
배열의 데이터가 정렬되어 있지 않으면 올바른 결과를 리턴하지 않습니다.
배열에 데이터가 없으면 음수를 리턴
- static boolean equals(배열1, 배열2): 배열1과 배열2의 데이터가 동일한지 여부를 리턴해주는 메소드
- static void sort(배열): 배열의 데이터를 정렬해주는 메소드
배열의 각 요소가 Comparable 인터페이스를 implements 한 경우에는 바로 정렬해줍니다.
그렇지 않은 경우는 정렬을 하지 못하고 예외를 발생시킵니다.
- static <T> void sort(T[] a, Comparator<? super T> c): a 배열의 데이터를 c를 이용해서 비교한 후 정렬합니다.
배열의 데이터가 Comparable 인터페이스를 implements 하지 않은 경우에 사용
- stream()도 중요한데 나중에 Stream을 할 때 사용
실습) 사용자 정의 클래스를 만들고 배열을 만들어서 출력
- Data 클래스: 사용자 데이터를 저장하기 위한 클래스
public class Data implements Comparable{
public int number;
public String name;
public int age;
public int score;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//객체의 크기를 비교하기 위한 메소드, 정렬할때 사용
//현재의 데이터에 매개변수의 데이터 보다 크면 양수
//동일하면 0
//현재 데이터가 매개변수의 데이터 보다 작으면 음수
//를 리턴해주면 기본적으로 오름차순 정렬을 해줍니다.
@Override
public int compareTo(Object o) {
//CompareTo 의 매개변수는 Object 타입으로 되어있어서
//원래의 자료형으로 변환해서 사용해야하는데
//여기서 원래 타입은 자신의 클래스 타입입니다.
//return score - ((Data)o).score;
//내림 차순을 원하면 전체 값의 부호를 음수로 바꾸면 된다.
Data other = (Data)o;
//문자열은 크기 비교를 compareTo 라는 메소도로 수행
//동일성 여부는 equals 라는 메소드로 수행
return name.compareTo(other.name);
//이름비교
}
}
import java.util.Arrays;
public class Main4 {
public static void main(String[] args) {
Data d1 = new Data();
d1.setNumber(1);
d1.setAge(27);
d1.setName("볶음밥");
d1.setScore(100);
Data d2 = new Data();
d2.setNumber(2);
d2.setAge(25);
d2.setName("닭고기");
d2.setScore(80);
Data d3 = new Data();
d3.setNumber(3);
d3.setAge(32);
d3.setName("시리얼");
d3.setScore(90);
//데이터 하나의 배열로 묶기
Data [] food = {d1, d2, d3};
//배열의 데이터 출력하기
System.out.printf("%10s","번호");
System.out.printf("%20s","이름");
System.out.printf("%10s","나이");
System.out.printf("%10s","점수");
Arrays.sort(food);
//food 배열의 모든 데이터 순회하기
//food 의 모든 데이터가 순서대로 temp에 대입
for(Data temp : food) {
System.out.printf("\n%7d",temp.getNumber());
System.out.printf("%15s",temp.getName());
System.out.printf("%10d",temp.getAge());
System.out.printf("%8d",temp.getScore());
}
System.exit(0);
}
}
=>main 메소드에서 singers 배열을 정렬하기 위해서 Arrays.sort(singers) 코드를 추가했는데 에러가 발생
=>singers 배열에 저장된 데이터는 Data 클래스의 객체인데 Data 클래스는 Comparable 인터페이스를 implements 하지 않아서 크기 비교를 할 수 없기 때문입니다.
=>데이터를 정렬하기 위한 방법은 Data 클래스에 Comparable 인터페이스를 implements 해서 compareTo 메소드를 재정의해서 해결할 수 있고 sort 메소드를 호출할 때 Comparator 인터페이스를 implements 한 객체를 두번째 매개변수로 대입해 주어도 됩니다.
'IT > JAVA (17.12.18~)' 카테고리의 다른 글
15일 JAVA(15) (0) | 2018.01.10 |
---|---|
14일차 JAVA(14) (0) | 2018.01.09 |
12일차 JAVA(12) (0) | 2018.01.04 |
11일차 JAVA(11) (0) | 2018.01.03 |
10일차 JAVA(10) (0) | 2018.01.02 |