지구정복

[JAVA] 11/16 | String클래스, StringBuffer클래스, Math클래스, 포장(Wrapper)클래스, 문자열 형변환, System클래스, 프로세스, Date와 Calendar클래스 본문

데이터 엔지니어링 정복/JAVA & JSP

[JAVA] 11/16 | String클래스, StringBuffer클래스, Math클래스, 포장(Wrapper)클래스, 문자열 형변환, System클래스, 프로세스, Date와 Calendar클래스

nooh._.jl 2020. 11. 16. 17:23
728x90
반응형

복습

  • *프로젝트
  •  
  • 사용자정의 클래스
    • package / import
      • 클래스명
        • 상속
        • 인스턴스
      • 문법
  • API - 내장클래스
    • 용도별로 패키지화
    • 기본적인 것 java.lang : 기본자료형과 관련된 패키지 / import하지 않는다.
    •  
    • Object
      • equals()
      • toString()
      • -------------override - 객체 내용비교, 내용값 출력
      • hashcode()
      • getClass()
    • String

ㅇString 객체

-불변성

        //1. String()의 특성 - 불변성
        String str = "ABC";
        str += "BCD";
        System.out.println(str);

        String pstr = str.replaceAll("ABC", "CDE");
        //str에 저장된 값은 메모리 힙영역에서 불변하다  / immutable(!=mutable)
        System.out.println(str);
        System.out.println(pstr);

 

-equls()

        //String 객체의 내용을 비교하려면 무조건 equals를 사용해야한다.
        //변수에 문자열을 바로 저장하면 같은 객체를 참조한다.
        //객체를 만들고 객체변수에 문자열을 저장하면 다른 객체를 참조한다. 따라서 참조값이 다르다.
        String str11 = "Hello World";
        String str12 = "Hello World";

        String str21 = new String("Hello World");
        String str22 = new String("Hello World");

        if(str21 == str22) {
            System.out.println("참조값이 같음");
        } else {
            System.out.println("참조값이 다름");
        }
        if(str21.equals(str22)) {
            System.out.println("내용값이 같음");
        } else {
            System.out.println("내용값이 다름");
        }

        if(str11 == str12) {
            System.out.println("참조값이 같음");
        } else {
            System.out.println("참조값이 다름");
        }
        if(str11.equals(str12)) {
            System.out.println("내용값이 같음");
        } else {
            System.out.println("내용값이 다름");
        }
        //hashCode()는 메모리에 생성된 객체의 주소를 정수로 변환한 형태
        System.out.println(str11.hashCode());
        System.out.println(str12.hashCode());
        System.out.println(str21.hashCode());
        System.out.println(str22.hashCode());

동일성 비교는 == 로 객체 인스턴스의 주소 값을 비교한다.

동등성 비교는 equals() 메소드를 사용해서 객체 내부의 값을 비교한다.

 

hashCode() 메소드는 객체 내부의 내용을 hash값으로 바꿔 hash 값을 리턴해주는 메소드이다.

같은 내용을 가진 문자열이라면 무조건 동일 hash값을 가진다.

하지만 hash값이 동일하더라도 값이 다를 수 있기 때문에 equals 메소드와 같이 사용해야 한다.

만약 같은 내용을 가지는 두 개의 객체의 해쉬코드값을 같지 않게 만드려면 hashCode() 메소드를 재정의해야 한다.

 

객체비교를 할 때는 아래의 알고리즘을 수행한다.

1. hashCode() 리턴값 같으면 2번, 다르면 다른 객체

 

2. equlas() 리턴값 같으면 동등객체, 다르면 다른 객체

 

 

ㅇStringBuffer 객체

문자열을 결합할때 + 연산자를 이용하면 기존 객체가 변경되는 것이 아니라 새로운 객체가 만들어진다. 이럴경우

메모리 낭비가 발생할 수 있다. 

이런 경우에는 StringBuffer 또는 StringBuilder 객체를 이용한다. 이는 내부버퍼(buffer: 데이터를 임시저장하는 메모리)

에 문자열을 저장해두고, 그 안에서 추가, 수정, 삭제 작업을 할 수 있다.

 

StringBuffer생성자는 여러가지로 오버로딩되어 있어서 기본생성자는 16개의 문자들을 저장할 수 있는 초기 버퍼를 만든다.

문자열을 매개변수로 생성자를 만들면 문자열의 길이 + 기본 16개의 공간들이 합쳐져서 버퍼크기가 지정된다.

아래 예시와 같다.

public class Ex111602 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer(100);
        StringBuffer sb3 = new StringBuffer("Hello World");

        System.out.println(sb1.capacity());
        System.out.println(sb2.capacity());
        System.out.println(sb3.capacity()); //문자수11+기본공간16 = 27
    }
}

 

 

-여러가지 메소드

public class Ex111602 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer(100);
        StringBuffer sb3 = new StringBuffer("Hello World");

        System.out.println(sb1.capacity());
        System.out.println(sb2.capacity());
        System.out.println(sb3.capacity()); //문자수11+기본공간16 = 27

        ////내부버퍼에서 문자조작하기
        //문자 단위 조작 (문자열은 웬만해서는 계속 문자열로 처리하는 것이 좋다.)
        //charAt : 특정 인덱스 위치 문자 추출
        //setCharAt(index, ch) : 문자열에서 주어진 인덱스 문자를 다른 문자로 교체
        //deleteCharAt(index) : 특정 인덱스 위치 문자 제거
        //subString : 문자열 분리
        //apend() : 문자열 끝에 매개값을 추가
        //insert(인덱스, 문자) : 특정 인덱스에 매개 문자를 추가
        //delete(시작인덱스, 끝인덱스) : 시작인덱스문자부터 끝 인덱스 문자까지 문자삭제
        //reverse() : 문자열의 순서가 뒤바뀜
        System.out.println( sb3 );

        sb3.append("Good");
        System.out.println( sb3 );

        sb3.insert(3, "추가");
        System.out.println( sb3 );

        sb3.delete(0, 4);
        System.out.println( sb3 );

        sb3.reverse();
        System.out.println( sb3 );
    }
}

 

-문제) 사용자에게 문자열 입력받고 맨 앞 글자만 대문자로 변환해서 출력하기

1번 : Scanner 사용

import java.util.Scanner;

public class Ex111603 {
    public static void main(String[] args) {
        Scanner se = new Scanner(System.in);
        System.out.println("영어로 아무 문자열을 입력하세요");
        String str = se.nextLine();

        String[] strArray = str.split(" ");

        String result = "";
        for(String astr : strArray) {
            result += astr.substring(0,1).toUpperCase() + astr.substring(1)+" ";
        }
        System.out.println(result);
    
    
    }
}

 

2번: args 배열 사용

public class Ex111604 {
    public static void main(String[] args) {
        //"" 하나만 입력받기 위한 제어문
        if (args.length != 1) {
            System.out.println("1개를 입력하세요");
        } else {
            System.out.println("정상");
        }

        String strName = args[0];
        String[] names = strName.split(" ");
        /* 디버깅하기
        for (String name: names){
            System.out.println(name);
        }
        */

        String result = "";
        for(String name: names) {
            result += name.substring(0,1).toUpperCase() + name.substring(1)+" ";
        }
        System.out.println("결과: "+result.trim() );
    
    }
}

 

3번: 메서드화해서 출력하기 (메소드를 사용하는 것을 구조적 프로그래밍이라고 한다.)

public class Ex111605 {

    public static String capitalizeName(String strName) {
        String[] names = strName.split(" ");

        String result = "";
        for(String name: names) {
            result += name.substring(0,1).toUpperCase() + name.substring(1)+" ";
        }
        return result.trim();
    }

    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("1개를 입력하세요");
        } else {
            System.out.println("정상");

            String result = Ex111605.capitalizeName(args[0]);
            System.out.println("결과 "+result);
        }

    }
}

 

4번: 객체화해서 출력하기 (객체 지향 프로그래밍)

//클래스
public class Ex111606_utilEx {
    
    public String capitalizeName(String strName) {
        String[] names = strName.split(" ");

        String result = "";
        for(String name: names) {
            result += name.substring(0,1).toUpperCase() + name.substring(1)+" ";
        }
        return result.trim();
    }
}


//메인클래스
public class Ex111606 {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("1개를 입력하세요");
        } else {
            System.out.println("정상");

            Ex111606_utilEx  u = new Ex111606_utilEx();
            String result = u.capitalizeName(args[0]);
            System.out.println("결과 "+result);
        }

    }
}

 

 

ㅇMath 객체

public class Ex111607_MathEx {
    public static void main(String[] args) {
        int v1 = Math.abs(-5);
        double v2 = Math.abs(-3.14);
        System.out.println("v1 = "+ v1);
        System.out.println("v2 = "+ v2);

        double v3 = Math.ceil(5.3);
        double v4 = Math.ceil(-5.3);
        System.out.println("v3 = "+ v3);
        System.out.println("v4 = "+ v4);

        double v5 = Math.floor(5.3);
        double v6 = Math.floor(-5.3);
        System.out.println("v5 = "+ v5);
        System.out.println("v6 = "+ v6);

        int v7 = Math.max(5, 9);
        double v8 = Math.max(5.3, 2.5);
        System.out.println("v7 = "+ v7);
        System.out.println("v8 = "+ v8);

        int v9 = Math.min(5, 9);
        double v10 = Math.min(5.3, 2.5);
        System.out.println("v9 = "+ v9);
        System.out.println("v10 = "+ v10);

        double v11 = Math.random();
        System.out.println("v11 = "+ v11);

        double v12 = Math.rint(5.3);
        double v13 = Math.rint(5.7);
        System.out.println("v12 = "+ v12);
        System.out.println("v13 = "+ v13);

        long v14 = Math.round(5.3);
        long v15 = Math.round(5.7);
        System.out.println("v14 = "+ v14);
        System.out.println("v15 = "+ v15);

        double value = 12.3456;
        double temp1 = value * 100;
        long temp2 = Math.round(temp1);
        double v16 = temp2/100.0;
        System.out.println("v16 = "+ v16);

    }
}

 

ㅇWrapper(포장) 클래스

기본타입(byte, char, short, int, long, float, double, boolean)의 값을 갖는 객체를 포장객체라고 한다.

포장 객체의 특징은 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다. 만약 내부의 값을 변경하고 싶다면

새로운 포장 객체를 만들어야 한다.

 

만드는 방법은 기본 타입의 값을 주거나 문자열을 주거나 valueOf() 메소드를 사용하면 된다.

포장 클래스에는

Byte, Character, Short, Integer, Long, Float, Double, Boolean

 

기본타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.

public class Ex1116_BoxingUnboxingEx {
    public static void main(String[] args) {
        //Boxing
        Integer obj1 = new Integer(100);            //기본타입
        Integer obj2 = new Integer("200");          //문자열
        Integer obj3 = Integer.valueOf("300");      //valueOf()

        //Unboxing
        int value1 = obj1.intValue();
        int value2 = obj2.intValue();
        int value3 = obj3.intValue();

        System.out.println(value1);
        System.out.println(value2);
        System.out.println(value3);
    }
}

 

-박싱과 오토박싱

auto boxing은 굳이 생성자 안에 값을 집어넣지 않고 바로 객체변수에 값을 집어넣는 것을 의미

public class Ex1116_WrapperEx02 {
    public static void main(String[] args) {
        //boxing
        Integer i1 = new Integer(123);

        //auto boxing
        Integer i2 = 123;

        //unboxing
        int i3 = i2;
    }
}

 

 

ㅇ형변환하기

public class Ex1116_WrapperEx{
    public static void main(String[] args) {
        Integer i1 = new Integer(123);

        byte b = i1.byteValue();
        float f = i1.floatValue();

        System.out.println(b);
        System.out.println(f);

        String s1 = i1.toString();
        String s2 = Integer.toString(123);

        System.out.println(s1);
        System.out.println(s2);

        //진법변환
        System.out.println(Integer.toBinaryString(123) );

        //문자열을 정수 또는 실수로 변환하기
        int i2 = Integer.parseInt("123");
        Float f2 = Float.parseFloat("1.23f");

        System.out.println(i2 );
        System.out.println(f2 );

    }

}

 

 

문제) args로( 숫자 사칙연산 숫자 ) 입력받아서 결과 출력하기

public class Ex1116_CalculatorEx01 {
    public static void main(String[] args) {
        if ( args.length != 3) {
            System.out.println("인자의 개수가 다릅니다: "+args.length);
        } else {
            int i1 = Integer.valueOf(args[0]);
            int i2 = Integer.valueOf(args[2]);
            String b = args[1];
        
            int sum=0;
            String result="";

            if(b.equals("+")) {
                System.out.println("결과 : "+(i1 + i2));
            } else if( b.equals("-") ) {
                System.out.println("결과 : "+(i1 - i2));
            } else if( b.equals("X") ) {
                System.out.println("결과 : "+(i1 * i2));
            } else if( b.equals("/") ) {
                System.out.println("결과 : "+(i1 / i2));
            }
        }
    }
}

 

 

System 클래스

자바프로그램은 운영체제상에서 바로 실행되는 것이 아니라 JVM 위에서 실행된다.

만약 JVM을 강제로 끝내거나 조작하고 싶을 때 자바의 java.lang의 System 클래스를 이용해서 조작할 수 있다.

여기에는 프로그램 종료, 키보드로부터 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기, 시스템 프로퍼티 읽기,

환경변수 읽기 등이 가능하다.

System 클래스의 모든 필드와 메소드는 정적 필드와 정적 메소드로 구성되어 있다.

 

-프로그램 종료 exit()

0일 때 정상 종료이다. 

public class Ex1116_SystemEx {
    public static void main(String[] args) {
        System.out.println("시작");

        if(args.length != 1) {
            System.out.println("비정상");
            System.exit(0);
        } else {
            System.out.println("정상");
        }

        System.out.println("끝");
    }
}

 

-현재 시간 읽기 currentTimeMillis(), nanoTime()

이들은 각각 밀리세컨드(1/1000초) 단위와 나노세컨드(1/10^9초) 단위의 long 값을 리턴한다.

public class Ex1116_SystemTimeEx {
    public static void main(String[] args) {
        long time1 = System.nanoTime();

        int sum = 0;
        for(int i=1; i<=1000000; i++) {
            sum += i;
        }

        long time2 = System.nanoTime();

        System.out.println("1~1000000까지의 합: "+sum);
        System.out.println("계산에 "+(time2-time1)+"나노초가 소요");
    }
}

 

-시스템 프로퍼티 읽기 getProperty()

public class Ex1116_SystemEx02 {
    public static void main(String[] args) {
        //자바 버전 읽기
        System.out.println( System.getProperty("java.version"));

        //사용자 정보 읽기
        System.out.println( System.getProperty("user.name"));
        System.out.println( System.getProperty("user.home"));

        //환경변수 읽기
        System.out.println( System.getenv("JAVA_HOME"));
    }
}

 

-배열 복사 arraycopy(원배열, 원배열시작인덱스, 복사할배열, 복사할배열 시작인덱스, 복사되는배열요소의수)

public class Ex1116_SystemEx03 {
    public static void main(String[] args) {
        int[] src = {1, 2, 3, 4, 5};
        int[] dest1 = null;         //초기화 안하고 선언만
        
        
        //shadow copy
        System.out.println("shadow copy");
        dest1 = src;

        System.out.println(src[0]);
        System.out.println(dest1[0]);

        dest1[0] = 10;
        System.out.println(src[0]);     //값이 같이 변경됨
        System.out.println(dest1[0]);   


        //deep copy(값복사)
        System.out.println("\ndeep copy(값복사)");
        int[] dest2 = {0, 0, 0, 0, 0};
        System.arraycopy(src, 0, dest2, 0, src.length);

        System.out.println(src[0]);
        System.out.println(dest2[0]);

        dest1[0] = 20;
        System.out.println(src[0]);     //원본배열 값은 변경 안됨.
        
        System.out.println(dest2[0]);
    }
}

 

 

ㅇ프로세스

프로세스
    프로그램 실행
        -램 일부와 cpu를 할당받은 상태
    자바 라이브러리를 통해서 프로그램 실행 가능하다.
    cmd 에서도 프로그램 실행 가능
        cd "c:\program files\internet explore"
        iexplore

-자바로 프로그램 실행시키기

throws Exception을 꼭 써주자.

그리고 경로를 쓸 때 "" 로 묶어주고, 백슬래시는 두 개 사용해줘야 한다.

public class Ex1116_ProcessBuilderEx01 {
    public static void main(String[] args) throws Exception {
        ProcessBuilder processBuilder 
            = new ProcessBuilder("C:\\Program Files\\Internet Explorer\\iexplore");
        processBuilder.start();
    }
}

 

네이버 창 바로 실행시키기

public class Ex1116_ProcessBuilderEx01 {
    public static void main(String[] args) throws Exception {
        ProcessBuilder processBuilder 
            = new ProcessBuilder("C:\\Program Files\\Internet Explorer\\iexplore", "www.naver.com");
        processBuilder.start();
    }
}

 

 

이번에는 그림판을 띄워서 이미지를 추가해보자.

public class Ex1116_ProcessBuilderEx01 {
    public static void main(String[] args) throws Exception {
        /*
        ProcessBuilder processBuilder 
            = new ProcessBuilder("C:\\Program Files\\Internet Explorer\\iexplore", "www.naver.com");
        processBuilder.start();
        */

        ProcessBuilder processBuilder2 
        = new ProcessBuilder("C:\\WINDOWS\\system32\\mspaint", "C:\\html\\Chrysanthemum.jpg");
        processBuilder2.start();
    }
}

 

 

 

ㅇDate, Calendar 클래스

시스템의 현재시간 가져오기

import java.util.Date;

public class Ex1116_DateEx01 {
    public static void main(String[] args) throws Exception {
        //java.util import안 했을 때
        java.util.Date d1 = new java.util.Date();
        System.out.println( d.toString() );

        Date d2 = new Date();
        System.out.println( d.toString() );
    }
}

 

 

년도와 달, 일을 가져오기

import java.util.Date;

public class Ex1116_DateEx01 {
    public static void main(String[] args) throws Exception {

        Date d1 = new Date();
        System.out.println( d1.toString() );
        System.out.println( d1.toLocaleString() );

        System.out.println( d1.getYear() + 1900 );
        System.out.println( d1.getMonth() + 1 );
        System.out.println( d1.getDate() );
    }
}

위에 오류가 뜨는데 그냥 경고하는 것이다.

 

-Calendar 사용

import java.util.Calendar;
public class Ex1116_CalendarEx01 {
    public static void main(String[] args) throws Exception {
        Calendar c = Calendar.getInstance();

        //날짜에 관한 정보가 다 나온다.
        System.out.println(c.toString() );

        //날짜에 관한 정보중 특정 정보만 읽기
        System.out.println(c.get(Calendar.YEAR) );
        System.out.println(c.get(Calendar.MONTH) );
        System.out.println(c.get(Calendar.DAY_OF_MONTH) );
        System.out.println(c.get(Calendar.DATE) );
    }
}

 

날짜를 임의로 설정할 수 있다.

import java.util.Calendar;
import java.util.Date;

public class Ex1116_CalendarEx02 {
    public static void main(String[] args) throws Exception {
        Calendar c = Calendar.getInstance();

        c.set(2020, 11-1, 1);
        System.out.println(c.toString() );

        //위에서 설정한 날짜값을 출력하기
        System.out.println(c.getTime() );

        //위에서 설정한 날짜값을 보기 쉽게 출력하기
        Date d = c.getTime();
        System.out.println(d.toLocaleString() );
    }
}

 

 

import java.util.Calendar;
import java.util.Date;

public class Ex1116_CalendarEx02 {
    public static void main(String[] args) throws Exception {
        Calendar c = Calendar.getInstance();

        
        c.set(2020, 11-1, 1);
        System.out.println(c.toString() );

        //위에서 설정한 날짜값을 출력하기
        System.out.println(c.getTime() );

        //위에서 설정한 날짜값을 보기 쉽게 출력하기
        Date d = c.getTime();
        System.out.println(d.toLocaleString() );

        //2020년 12월 31일의 요일을 알아내는 방법
        c.set(2021, 1-1, 1-1);
        System.out.println(c.get(Calendar.DAY_OF_WEEK ));

        String[] weeks = {"일", "월", "화", "수", "목", "금", "토"};
        System.out.println(weeks[c.get(Calendar.DAY_OF_WEEK )-1] );
    }
}

 

 

문제)

주민등록번호 검사용 클래스 

java JuminCheck 123456-1234567

를 입력하면 '맞다/틀리다' 가 나오는 실행문 만들기

 

1) 내 방법

public class JuminCheck {
    public static void main(String[] args) {
        if (args.length != 1) {
            System.out.println("한 자리만 입력하세요");
            System.exit(0);
        }
 
        String[] str = args[0].split("-");

        int[] juminArr = new int[13]; //문자열 주민번호를 숫자로 바꾼 뒤 집어넣을 배열
        int sum = 0;                  //각 주민번호 x2 한 뒤 총합 넣을 변수
        int x = 2;                    //각 주민번호에 곱할 숫자, 1씩 증가하다가 9되면 2로 초기화
        int y = 0;                    //배열 juminArr의 인덱스값
        
        for (int i=0; i<str.length; i++) {
            for (int j=0; j<str[i].length(); j++) {
                if (x<=9) {
                    juminArr[y] = Integer.valueOf( str[i].substring(j, j+1) ) * x;
                    System.out.println(juminArr[y]);
                    sum += juminArr[y];
                    x++; y++;
                } else {
                    x = 2;
                    juminArr[y] = Integer.valueOf( str[i].substring(j, j+1) ) * x;
                    System.out.println(juminArr[y]);
                    sum += juminArr[y];
                    x++; y++;
                }
            }
        }
        --x;
        sum -= juminArr[--y];
        

        if ( (11 - (sum % 11)) % 10 == juminArr[y]/x ) {
            System.out.println("맞다");
        } else {
            System.out.println("틀리다.");
        }
        
    }
}

 

 

2) 간단한 방법

public static void main(String[] args) {
		// TODO Auto-generated method stub
		if(args.length != 1) {
			System.out.println("java 클래스명 'xxxxxx-xxxxxxx' 형식으로 입력하세요");		
		} else {
			String strJumin = args[0].replaceAll("-", "");
			System.out.println(strJumin);
			
			// 문자열을 정수 = Integer.parseInt()
			
			int[] bits = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5};
			int sum = 0;
			for(int i = 0; i<bits.length; i++) {
				sum += Integer.parseInt(strJumin.substring(i,  i+1)) * bits[i];
			}
			
			int last = Integer.parseInt(strJumin.substring(12, 13));
			int result = (11-(sum % 11)) % 10;
			
			if(last == result) {
				System.out.println("맞음");
			} else {
				System.out.println("틀림");
			}
		}	
	}

 

3) 강사님 코드

public class JuminCheck02 {
    //주민번호 체크하는 메소드 정의
    public static boolean checkJumin(String jumin) {

        String strJumin = jumin.replaceAll("-", "");

        int[] bits = {2,3,4,5,6,7,8,9,2,3,4,5};
        int sum = 0 ;

        for(int i=0; i<bits.length; i++) {
            sum += Integer.parseInt(strJumin.substring(i, i+1)) * bits[i];
        }

        int lastNum = Integer.parseInt(strJumin.substring(12,13));
        int resultNum = (11 - (sum%11)) % 10;

        if(lastNum == resultNum) {
            return true;
        } else {
            return false;
        }
        
    }


    public static void main(String[] args) {
        if(args.length != 1) {
            System.out.println("000000-0000000 형식으로 입력하세요");
            System.exit(0);
        }
        if(args[0].length() != 14) {
            System.out.println("14자리로 입력하세요");
            System.exit(0);
        }

        //주민번호 체크하는 메소드 호출
        if ( JuminCheck02.checkJumin(args[0]) ) {
            System.out.println("맞다");
        } else {
            System.out.println("틀리다.");
        }
        
    }
}

 

728x90
반응형
Comments