본문 바로가기

Learning/JAVA

String의 특징, Calendar함수, StringBuilder, 입력한 문장의 글자 배열 다르게 하여 출력하기, HashMap, Collections.sort()

  • String의 특징. 기본 데이터형이 아닌, 클래스형이다. (클래스형은 대문자로 시작) 클래스는 객체와 메소드를 가지고 있다(StringTest, StringTest02, StringTest03)
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
32
33
34
35
36
37
38
39
40
41
42
43
package utilTest;
public class StringTest {
     public static void main(String[] args) {
          //String은 클래스형. 기본데이터형이 아님. 클래스는 대문자로 시작.
          //클래스형은 new 로 객체를 만든다. 그런데 지금까지 String i=oo; 이런식으로 선언했었다.
          //어떻게 가능했던 걸까?
          //클래스는 주소값을 가지니까 str에는 100이란 주소값을 가지고 있고 출력할때 100이 가리키는 안녕이라는 값을 출력하는것.
          //==는 주소가 맞는지 물어본다. 그래서 str과 str1은 주소가 같기에 같다고 출력되고
          //equals는 내용이 맞는지 물어본다. 그래서 str과 tmp는 내용이 같기에 같다고 출력된다.
          String str="안녕";
          String str1="안녕";
          String tmp=new String("안녕");
          if(str==str1) {
              System.out.println("str==str1 주소 같다");
          }else {
              System.out.println("str==str1 주소 다르다");           
          }
          if(str==tmp) {
              System.out.println("str==tmp 주소 같다");
          }else {
              System.out.println("str==tmp 주소 다르다");              
          }
          if(str.equals(str1)) {
              System.out.println("str equals str1 내용 같다");
          }else {
              System.out.println("str equals str1 내용 다르다");           
          }
          if(str.equals(tmp)) {
              System.out.println("str equals tmp 내용 같다");
          }else {
              System.out.println("str equals tmp 내용 다르다");           
          }
          str=str+str1;
          //안녕안녕이 str에 담긴다. 원래있던 str의 안녕은 사라지고, 주소값도 달라진다.
          //String은 정적 클래스. 내용 수정이 불가하다.
          //동적클래스를 사용하는게 낫다. String Builder 혹은 String Buffer.
          if(str==str1) {
              System.out.println("주소 같다");
          }else {
              System.out.println("주소 다르다");
          }
     }
}

 

+ String클래스에 속한 함수들

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
package utilTest;
public class StringTest02 {
     public static void main(String[] args) {
          String str="안녕하세요 Hello  지금은 자바 공부중!!!";
          System.out.println("str 길이: "+str.length()); //문자열의 길이
          System.out.println("H위치: "+str.indexOf('H'));
          System.out.println("H위치: "+str.indexOf("Hello")); //문자가 시작되는 위치
          System.out.println("4번째 문자의 위치: "+str.charAt(4));
          String tmp="열심히 합시다";
          System.out.println("str과 tmp 연결: "+str+tmp);
          System.out.println("str과 tmp 연결: "+str.concat(tmp));
          int value=7;
          System.out.println("str과 value 연결: "+str+value);
          //System.out.println("str과 value 연결: "+str.concat(value));
          //concat안에는 String형이 들어가야하는데 value는 int형.
          //String의 함수가 static으로 만들어졌기 때문에 클래스 이름으로 접근가능.
          //valueof를 통해 int형을 String형으로 변환.
          String s=String.valueOf(value);
          System.out.println("str과 value 연결: "+str.concat(s));
          System.out.println("tmp와 value 연결: "+tmp.concat(String.valueOf(value)));
          String msg="abcdefg";
          System.out.println(msg.toUpperCase());
          System.out.println(msg.toUpperCase().toLowerCase());
          String[]arr=str.split(" ");
          for(int i=0;i<arr.length;i++) {
              System.out.println(arr[i]);
          }
    System.out.println(arr.length);
     }
}

 

+String의 길이(문자열)를 출력, 그 문자열을 공백으로 구분하여 배열의 길이 출력, 16진수와 8진수로 변환하는 메소드

 

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
32
33
34
35
package utilTest;
public class StringTest03 {
     public static void main(String[] args) {
          String tmp="1 0 15 23 6 21 17 10 11 12 13 14";
          //tmp의 길이를 출력. 문자열의 길이.
          System.out.println("tmp의 길이: "+tmp.length());
          
          //tmp를 공백으로 구분하여 배열의 길이 출력
          String []arr=tmp.split(" ");
          System.out.println("arr의 길이: "+arr.length);
          for(int i=0;i<arr.length;i++) {
              System.out.println(arr[i]+"\t");
          }System.out.println("====");
          
          //16진수
          //Integer라는 클래스에 toHexString을 쓰면 16진수로 바꿔준다.
          System.out.println(Integer.toHexString(15));
          
          /*
          arr배열안에 있는 숫자를 16진수로 변경
          문자를 숫자로 바꾸는 메소드 parseInt를 사용해야
          정수만 인수로 받는 toHexString을 통해 16진수로 변환시킬 수 있다.
          */
          String oct="";
          String hex="";
          for(int i=0;i<arr.length;i++) {
              int v=Integer.parseInt(arr[i]);
              oct+=Integer.toOctalString(v)+"\t";
               hex+=Integer.toHexString(v).toUpperCase()+"\t";
          }
          System.out.println("8진수: "+oct);
          System.out.println("16진수: "+hex);
          
     }
}
cs

  • 자바 API 중 Calendar 함수를 사용하여 현재 시각 출력하기 (CalendarTest)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package utilTest;
import java.util.Calendar;
public class CalendarTest {
     //static으로 된 함수는 static으로만 부를 수 있다.
     public static void printCalendar(String msg, Calendar cal) {//now는 Calendar형
          //년,월,일 출력
          int year=cal.get(Calendar.YEAR); //년
          int month=cal.get(Calendar.MONTH)+1//0부터 되어있기 때문에 현재의 월을 출력하려면 +1.
          int day=cal.get(Calendar.DAY_OF_MONTH); //일
          System.out.println(year+"/"+month+"/"+day);
          //요일
            System.out.println(cal.get(Calendar.DAY_OF_WEEK)); //일요일부터 센다.
          int d=cal.get(Calendar.DAY_OF_WEEK);
          String yul="";
          switch(d) {
          case Calendar.SUNDAY : yul="일"break;
          case Calendar.MONDAY : yul="월"break;
          case Calendar.TUESDAY : yul="화"break;
          case Calendar.WEDNESDAY : yul="수"break;
          case Calendar.THURSDAY : yul="목"break;
          case Calendar.FRIDAY : yul="금"break;
          case Calendar.SATURDAY : yul="토"break;
          }
          System.out.println("요일: "+yul);
          System.out.println(Calendar.SUNDAY); //1
          int ampm=cal.get(Calendar.AM_PM);
          String ampmStr="";
          /*
          if(ampm==Calendar.AM) {
               ampmStr="오전";
          }else {
               ampmStr="오후";
          }
          */
          ampmStr=(ampm==Calendar.AM)? "오전":"오후";
          int h=cal.get(Calendar.HOUR);
          int m=cal.get(Calendar.MINUTE);
          int s=cal.get(Calendar.SECOND);
          System.out.println("현재시각: "+ampmStr+" "+h+":"+m+":"+s);
     }
     public static void main(String[] args) {
          Calendar now=Calendar.getInstance();
          CalendarTest.printCalendar("현재", now);
     }    
}

 


  • StringBuilder사용하여 문자열 출력하기 (StringBuilderTest)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package utilTest;
public class StringBuilderTest {
    public static void main(String[] args) {
        String str="string";
        //StringBuilder는 문자를 동적으로 받기때문에 출력, 삭제 등이 간편
        StringBuilder sb=new StringBuilder(str);
        System.out.println(sb);
        sb.append("자바"); //맨 뒤에 문자 삽입
        System.out.println(sb);
        sb.insert(2"oracle"); //위치를 지정하여 문자 삽입
        System.out.println(sb); //storaclering자바
        System.out.println(sb.toString()); //toString은 문자로 바꾼다.
        sb.delete(25);
        System.out.println(sb); //인덱스 2앞에 커서가 있다고 생각. o,r,a가 없어짐. stclering자바
        sb.reverse();
        System.out.println(sb); //문자열 거꾸로 출력
        System.out.println(sb.charAt(3)); //3번째 있는 문자 출력
        System.out.println(sb.substring(3)); //문자 추출: 인덱스 3번째부터 끝까지 출력
        System.out.println(sb.substring(3,5)); //3에서 부터 5전까지 출력.
    }
}
cs

 


  • 입력한 문장의 길이만큼 반복하여 첫번째 글자를 맨뒤에 붙여서 출력하기. (StringTest04)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package utilTest;
import java.util.Scanner;
public class StringTest04 {
        
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("문장입력>>");
        String line=sc.nextLine();
        //문장의 길이만큼 반복
        for(int i=0;i<line.length();i++){
            //첫글자 구하기
            //String first=line.substring(0,1);
            char first=line.charAt(0);
            //두번째부터 끝까지 구하기
            String second=line.substring(1);
            //2+1하기
            line=second+first;
            System.out.println(line);
        }
        
    }
}

 


  • key와 value로 구성된 HashMap (HashMapTest)
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
32
33
34
35
36
37
38
39
40
41
42
43
package utilTest;
 
import java.util.HashMap;
 
public class HashMapTest {
 
    public static void main(String[] args) {
        //Key와 Value로 구성된 Map이란 자료구조.
        HashMap<StringString> hm=new HashMap<StringString>();
        //Map에 저장하는 명령어는 put.
        //순서는 중요하지 않고 값만 돌려줌.
        hm.put("one""첫번째");
        hm.put("two""두번째");
        hm.put("three""세번째");
        hm.put("four""네번째");
        System.out.println(hm);
        System.out.println(hm.size()); //크기는 length가 아닌 size();
        hm.put("one""첫번째 one"); //키가 중복되면 허용하지 않고 덮어쓰기가 된다.
        System.out.println(hm);
        System.out.println(hm.size());
        System.out.println(hm.get("two")); //두번째. get의 인수로 키를 적으면 value값을 알려줌.
        hm.put("1","새로넣음");
        System.out.println(hm);
        
        //key의 값을 출력하려면 keySet()함수 이용.
        for(String s:hm.keySet()) {
            System.out.println(s);
        }
        //value값을 출력하려면 get()함수 이용
        for(String s:hm.keySet()) {
            System.out.println(hm.get(s));
        }
        System.out.println(hm.containsKey("1")); //true. key값에 1이 있는지 물어봄
        System.out.println(hm.containsValue("두번째")); //true. value값에 두번째가 있는지 물어봄
        
        //value값을 출력하는 또다른 함수 values()
        for(String s:hm.values()) {
            System.out.println(s); 
        }
        
    }
}
 

  • HashMap에 key와 value를 넣고 id과 비번이 일치하는지 출력하기 (HashMapTest02)
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
32
package utilTest;
 
import java.util.HashMap;
import java.util.Scanner;
 
public class HashMapTest02 {
 
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        HashMap<StringString> map=new HashMap<StringString>();
        map.put("java""1111");
        map.put("oracle""1234");
        map.put("jsp""abcd");
 
        System.out.println("ID를 입력하세요");
        String id=sc.nextLine();
        
        System.out.println("패스워드를 입력하세요");
        String pw=sc.nextLine();
        
        if(map.containsKey(id)==false) { //id가 없음
            System.out.println("ID 존재 안함");
        }
        //get(key)이 가리키는 value값과 pw가 일치하는지 물어봄.
        else if(map.get(id).equals(pw)==false) {//비번오류
            System.out.println("비번 일치 하지 않음");
        }
        else {
            System.out.println("ID/PWD 일치");
        }
    }
}

  • 1부터 20사이의 난수 10개를 map에 넣으시오. 키 값은 1~10, value값은 1~20사이 난수. 중복된 난수를 허용하지 않는다. map의 values 값들을 작은 값부터 정렬-Collection.sort()(Test01)
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
32
33
34
35
36
37
38
39
40
package utilTest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test01 {
    public static void main(String[] args) {
        //1부터 20사이의 난수 10개를 map에 넣으시오
        //키 값은 1~10, value값은 1~20사이 난수
        //단 중복된 난수는 허용하지 않는다.
        Map<Integer, Integer> map=new HashMap<Integer, Integer>();
        for(int i=1;i<11;i++) {
            while(true) {
                int value=(int)(Math.random()*20)+1//1에서 20사이
                if(!map.containsValue(value)) {
                    //map.containsValue(value)==false와 같은말
                    //value가 없으면 value값에 넣으란 소리.
                    //중복된 게 있으면 키값도 삭제해버리니까 while문을 쓰는게 좋음
                map.put(i,value);
                break;
                }
            }
        }
        for(Integer i:map.values()) {
            System.out.print(i+"\t");
        }
        System.out.println();
        System.out.println(map);
        
        System.out.println();
        //map에 들어있는 value값들을 Integer형 ArrayList에 담는다.
        List<Integer>list=new ArrayList<Integer>(map.values());
        //작은값부터 정렬한다.
        Collections.sort(list);
        for(int i:list) {
            System.out.print(i+"\t");
        }
System.out.println();
    }
}

 


  • 문장의 한글자마다 2씩 더하여 암호화 하고 다시 2씩 빼서 복호화하여 출력하기 (EncTest)
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
32
33
34
35
36
37
38
package utilTest;
public class EncTest {
    public String encrypt(String msg) {
        String dap="";
        for(int i=0;i<msg.length();i++) {
            //공백이면. 한글자이기 때문에 char.''홑따옴표
            if(msg.charAt(i)==' ') {
                dap+=msg.charAt(i);
            }else {
                dap+=(char)(msg.charAt(i)+2); //누적시키기위해 +=.  
            }
        }
        return dap;
    }
    
    public String decrypt(String str1) {
        String bok="";
        for(int i=0;i<str1.length();i++) {
            //공백이면. 한글자이기 때문에 char.''홑따옴표
            if(str1.charAt(i)==' ') {
                bok+=str1.charAt(i);
            }else {
                bok+=(char)(str1.charAt(i)-2); //누적시키기위해 +=.  
            }
        }
        return bok;
    }
    
    public static void main(String[] args) {
        EncTest enc=new EncTest();
        String msg="Hi..Glad to meet you!!";
        System.out.println("암호화 전: "+msg);
        //한 문자에 2씩 더하기
        String str1=enc.encrypt(msg);
        System.out.println("암호화 후: "+str1);
        System.out.println("복호화 후: "+enc.decrypt(str1));
    }
}

 

+StringBuilder를 활용하여 똑같이 재현하기 (EncBuilderTest)

 

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
32
33
34
35
36
37
38
39
40
package utilTest;
 
public class EncBuilderTest {
    private StringBuilder encrypt(String msg) {
        StringBuilder sb=new StringBuilder();
 
        for(int i=0;i<msg.length();i++) {
            if(msg.charAt(i)==' ') { 
                sb.append(msg.charAt(i));
            }else {
                sb.append((char)(msg.charAt(i)+2));
            }
        }
        return sb;
    }
    
    private StringBuilder decrypt(String msg) {
        StringBuilder sb=new StringBuilder();
 
        for(int i=0;i<msg.length();i++) {
            if(msg.charAt(i)==' ') { 
                sb.append(msg.charAt(i));
            }else {
                sb.append((char)(msg.charAt(i)-2));
            }
        }
        return sb;
    }
 
    
    public static void main(String[] args) {
        EncBuilderTest eb=new EncBuilderTest();
        String msg="Hi..Glad to meet you!!";
        System.out.println("암호화 전: "+msg); 
        //한 문자에 2씩 더하기
        String str1=eb.encrypt(msg).toString(); //문자로 바꾸는 toString();
        System.out.println("암호화 후: "+str1);
        System.out.println("복호화 후: "+eb.decrypt(str1));
    }
}

  • 해쉬맵 map을 생성, 단어를 입력받아 단어와 입력 횟수 저장, 대소문자 구분없이 x치면 종료. map을 출력하기. map에 키값에 해당하는 단어가 있으면 values 수에 1을 더하고 단어가 없으면 1을 추가한다. (HashMapTest)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package utilTest;
import java.util.HashMap;
import java.util.Scanner;
public class HashMapTest03 {
    public static void main(String[] args) {
        /* 1.해쉬맵 map을 생성
         * 2.단어를 입력받아 단어와 입력 횟수 저장
         * 3.대소문자 구분없이 x치면 종료.
         * 4.map출력
         */
        HashMap<String, Integer>map=new HashMap<String, Integer>();
        Scanner sc=new Scanner(System.in);
        while(true) {
            System.out.println("단어를 입력하세요. 종료 x>>");
            String word=sc.nextLine();
                if(word.toLowerCase().equals("x")) break;
                if(map.containsKey(word)) { //map에 단어가 있으면 그 수에 1더하기
                    map.put(word,map.get(word)+1);
                }else { //map에 단어가 없으면 1추가
                    map.put(word,1);
                }
        }System.out.println(map);
    }
}