IT/JAVA (17.12.18~)

13일차 JAVA(13)

만두토끼 2018. 1. 5. 17:29

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 여러개의 데이터를 가진 객체 이름){

반복 수행할 내용;

}

=>임시변수에 데이터가 순서대로 하나씩 대입됩니다.


import java.util.ArrayList;
import java.util.HashMap;

public class Main2 {
public static void main(String[] args) {
//정수 배열 생성
int [] ar = {30,20,10,50,60,21};
long start = System.nanoTime();
for(int i=0; i<ar.length; i=i+1) {
System.out.println(ar[i]);
}
long end = System.nanoTime();
System.out.println("걸린시간: "+(end-start));
//빠른 열거를 이용한 배열의 순회
//다음 데이터를 읽을 준비한 상태로 수행
start = System.nanoTime();
for(int imsi : ar) {
System.out.println(imsi);
}
end = System.nanoTime();
System.out.println("걸리시간: "+(end-start));
ArrayList<Integer> a1 = new ArrayList<Integer>();
HashMap<String, Object> map = new HashMap<String, Object>();
}
}






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을 할 때 사용


실습) 배열 내의 데이터 위치 찾기 
import java.util.Arrays;

public class Main3 {

public static void main(String[] args) {
int [] ar = {30,10,130,4,6};
int idx = Arrays.binarySearch(ar, 10);
System.out.println("10의 위치: "+idx);
//정렬이 되지 않은 상태에서는 올바르지 않은 결과가 리턴될 수 있다.
Arrays.sort(ar);
idx = Arrays.binarySearch(ar, 10);
System.out.println("10의 위치: "+idx);
}
}



실습) 사용자 정의 클래스를 만들고 배열을 만들어서 출력

- 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