날아라쩡글이의 블로그입니다.

System, Wrapper, math class 본문

중앙 HTA (2106기) story/java API story

System, Wrapper, math class

날아라쩡글이 2021. 10. 3. 10:45
반응형

System class

  • 자바실행환경이 설치된 시스템(컴퓨터)에 대한 유용한 값과 객체를 제공하는 클래스이다. 
  • java.lang패키지에 속해있다. 
  • System 클래스의 모든 필드와 모든 메소드는 정적필드, 정적 메소드이다. 
  • 제공하는 것은
    • err  : error를 출력한다.(모니터, 콘솔) PrintStream
      • print, println, printf
    • in : 표준입력을 출력한다.(키보드)  InputStream
      • read method
    • out : 표준출력을 출력한다. (콘솔, 모니터) PrintStream
  • System.out.println(System.err);//java.io.PrintStream@7d6f77cc
  • System.out.println(System.in);//java.io.BufferedInputStream@5aaa6d82
    • BufferedInputStream으로 출력전용스트림이 존재하는 것을 확인 할 수 있다. 
  • System.out.println(System.out);//java.io.PrintStream@73a28541
  • System.err.println();와 System.out.println();을 작성하게 되면 출력결과값이 매번 다르게 출력이 된다.
  • System.err가 사용하는 출력객체와 System.out이 사용하는 출력객체가 서로 다른 객체기 때문에 각각 다른 전송통로로 메세지를 보낸다. 
  • 따라서, 어떤 메세지가 먼저 출력될지 매번 변하게 된다. 
  • 서로 통로가 다르기 때문에 어떤 문장이 먼저 갈지 장담할 수 없다. 쓰레드로 되기 때문에 어쩔때는 err의 문자열이 out의 문자열이 출력된다.
  • 그렇다면 이렇게 줄바꿈이 없이 진행될까?
    • 출력장치의 줄바꿈인지 오류메세지의 줄바꿈이 실행안된 건지 모름
  • 왜 중간에 글자가 섞이지 않을까? 
    • 읽어들일 때 줄바꿈의 문자 바로 앞까지 읽어들이기 때문에 예상대로 출력할 수 없다. 
  • 그렇기 때문에 에러메세지가 뜨면 섞여서 나올 것이다. 

System.in

  • 표준 입력 장치이다. 
  • Scanner -> enter칠때까지 알 수 있다. 
  • String의 문자열 입력받을 때 사용하는 메소드인 next();는 공백앞까지 읽어들인다는 뜻이다. 
  • nextLine();은 enter까지 읽어들인다는 메소드로 문자열 후에 nextInt();를 입력하고 또 다시 문자열을 입력하게 될 경우 버벅거림이 발생한다. enter까지 읽어들이기 때문인데, 이때 nextLine();을 한번더 작성해준다. 혹은 next();로 사용해준다. 

method

  • long System.currentTimeMilis();
    • 현재 시간에 대한 유닉스 타임을 제공한다. 
      • 유닉스타임이란. 1969년 OS체제를 C언어 만든사람들, 벨 연구소에서 만들었다. 
      • 최초의 멀티사용자이다. 
      • 리눅스가 유닉스를 본따서 만들어진 것이다. 
      • 1970/1/1 00:00:00를 지금 이 순간까지 시간을 1/1000초 단위로 출력한다. 그렇기 때문에 값이 매번 변한다. 
      • 1969년 아래로가면 -의 값이 나오고 1970/01/01위로 올라갈 수 록 +의 값이 나온다. 
      • 홈페이지에서 개발자 도구로 확인해보면 유닉스 타입으로 html이 올라가 있는 것을 확인할 수 있다. 
      • 많이 사용되는 메소드이다. 
      • 컴퓨터의 특징으로는 site를 받아오면, web broweser를 저장한다. 같은 site를 들어가면 저장한 것을 다시 가져온다. 
      • 예전의 인터넷의 경우 회선이 느리고, 느린 회선으로 인해서 한번 접속하면 web brower을 저장하여 그 화면을 다시 출력했다. 그러나 현재의 인터넷의 경우 회선이 빠르고 한번 접속할 때마다 다른 화면이 출력되어야하기 때문에 
      • 유닉스타임을 이용하여 Url이 매번 달라져 새로운 모습을 출력시킬 수 있다. 자바스크립트에서서도 유닉스 타임이 많이 사용되고,
      • 현재 자바의 겨우 저장작업을 진행하고, 사용자의 그림을 업로드 시킬때, 
      • 즉, 인스타그램과 갤러리 사이트 게시판에 사진을 업로드 시키면 같은 이름의 파일이 올라갈 수 있다. 
      • 그러나 파일 이름이 중복이 되어서는 안되고, 매번 사진이름이 달라져야하기 때문에 
      • 유닉스 시간+ 파일이름 으로 저장하면 같은 이름의 파일이 존재하지 않게 된다. 유닉크한 값을 사용하게 된다. 
      • 동시에 올린다고 하더라도 1초에 1/1000초값이 중복될 일은 극히 드물기 때문에 실제 저장된 파일이름이 다르다. 
      • 그리고 파일이름을 출력할 때에는 spli을 이용하여 잘라내서 보이면 된다. 
      • 현재 값은 
      • 50년동안 1조6천억정도의 값이 있고, 50년뒤에도 3조2천 ,50년뒤에 6조4천으로 100년간은 13자리의 값을 유지한다. 
    • 컴퓨터의 현재시간정보를 알 수 있다. 
  • 시스템의 현재 날짜와 시간정보를 제공하는 객체를 생성한다. 

  • Date now = new Date();
    • 생성이 되는 그 순간에 System에 시간이 보안된다. 
    • toString이 재정의 되어있어서 날짜정보는 System.out.println(now); 이렇게 출력한다. 
  • Date day = new Date(0);
    • Date값을 0으로 입력하면 유닉스 시간의 첫 시간이 출력된다. 
    • 1970/1/1 00:00:00으로 한국은 영국보다 9시간이 빠르기 때문이다. 
    • 유닉스타임은 영국을 기준으로 해서 작성이 되어있고, Date의 해당되는 시간을 넣으면 날짜를 얻을 수 있다. 
    • 우리나라는 9시간이 빠르기 때문에 00시 출력이 아닌 09시에 출력된다. 
  • 날짜와 시간정보를 제공하는 객체는 java.util.Date
  • 날짜 정보를 제공하는 객체는 java.sql.Date //날짜정보만 제공된다. 
  • 시간 정보를 제공하는 객체는 java.sql.TimeStamp
  • 날짜 정보를 제공하는 객체는 java.time.LocalDate
  • 시간 정보를 제공하는 객체는 java.time.LocalTime
  • Local이란 내가 지금 살고있는 이 지금을 의미한다. 
  • 날짜와 시간 정보를 제공하는 객체는 java.time.LocalDateTime이다. 
    • Date는 특정날짜와 특정시간이 출력되는데, java.util에 있는 Date는 Deprecated가 작성되어있다. 사용하지 말라는 이야기이다. 
    • 많은 부분이 사용불가 선언이 되어있어 nethod도 거의 대부분 사용불가 선언이 되어있다. 현재시간정보를 갖고있는 객체를 만들 때 Date를 사용한다. 
    • 그러나 날짜에 대한 연산 (a날짜~b날짜의 기간, 몇일 남았는지 등)을 할 때에는 java.util이 제공하지 않아서 이전에는 API의 도움을 많이 받았다. 제일 불편했기 때문에 기능이 낮아져서 
    • 자바 8버젼부터는 java.time.package가 추가되어 날짜 관련한 작업에 대한 클래스를 제공하게 되었다. 
    • java.time.*;는 다양한 라이브러리를 지원한다. 1.8 작업이 수훨해졌다. 
  • ex) 날짜관련은 특정날짜입력이 아닌, 마감일, 예약일이 대부분으로 진행된다. 티켓예약날짜, 주문, 가입, 구매날짜, 등록날짜등 글을 쓰는 순간 입력이된다. 
  • Date는 날짜관련해서 Data는 생성됫을 때 날짜를 많이 사용한다. new Date로 획득된다. 
  • Time은 날짜의 간격, 미래날짜를 설정하는 작업을 할 때 time라이브러리로 계산한다. 

환경 변수 정보와 시스템 환경 변수 정보를 제공한다. 

  • System은 시스템과 관련된 환경설정 정보를 제공한다. 
  • 반환타입을 확인해야한다. 
  • System.getenv("확인하고 싶은 환경변수의 값 입력 ex) JAVA_HOME"); 
    • 첫날에 java의 path정보를 환경변수에 입력하였다. 
    • 확인하고 싶은 환경변수의 값을 다르게하여 확인할 수 있다. 
    • 컴퓨터의 사용자 이름을 조회하는 것은 USERNAME이다. 
    • Map을이용하여 내컴퓨터 AppData 저장위치등 path의 값을 전체적으로 출력하여 확인할 수 있다. 
    • System.env는 사용자의 디렉토리로, 정보출력을 할 수있다. LocalAppData가 출력이 가능하다. 
    • 시스템의정보 또한 출력할 수 있다. 
    • Properties System.getProperties();
      • 시스템의 운영체제, 시스템의 아키텍처, 설치의 자바에 대한 정보를 제공한다. 
      • getenv는 환경변수를 출력하고 getProperties는 컴퓨터에 대한 정보를 출력한다.
    • file separator 는 window는 \ 역슬레쉬가 표시된다. 리눅스는 /으로 파일을 구분한다.
    • line separator 는 줄바꿈문자로 OS체제에서는 \n으로 표시되고, 다른 곳중에서는 \c,\r을 사용한다. 
    • 가끔씩 사용하는 일이 있다. 운영체제의 구분자가 어떤건지, 문자 어떤걸 사용할지 줄바꿈문자를 어떤걸 사용하는지 확인이 가능하다. 

System으로 제공이 가능한 것

  1. 표준입력장치, 표준출력장치, 표준에러출력장치와 연결된 스트림을 제공한다. 
  2. 컴퓨터의 환경변수, 프러퍼티의 값을 제공한다. 
  3. 컴퓨터의 현재 시간 정보를 제공한다. 

System class는 method arrayCopy를 제공한다. 배열크기는 수정 못 하지만, 더 넓은 배열을 만들어서 내용을 복제하여 담을 수 있다. 

  • 배열 복사하기 
  • 원본의 배열이 int[] src = {10, 20, 30, 40, 50}; 가 있을 경우 60, 70, 80을 추가해야하는 경우 
  • 배열 큰 것을 만들어서 복사해서 넣어둔다. 
  • 데이터는 언제나 가변적이기 때문에 10개에서 index칸이 모자랄 경우 20짜리로 array를 만들어서 20에 이동시키면된다. 
  • StringBuilder와 StringBuffer안의 Buffer복사하는 것처럼 복사한다. 
  • System.arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length);
  • src : 원본배열, srcPos : 원본배열부터 복사시작위치, 대부분의 시작위치는 0이다. 
  • dest : 대상배열, destPos : 대상 배열에 원본배열이 저장될 위치 , length : 대상배열에 저장할 원본배열의 데이터 길이 
  • arrayCopy Ctrl+마우스 우클릭을 하면 native라고 C나 C++로 구현된 코드라는 표시로 작성되어있다.

 

wrapper class

  • 기본자료형 타입에 대응되는 클래스다. 
  • 기본자료형 값을 가지고 있는 객체를 만들 수 있다. 
  • java.lang패키지에 정의되어 있다. 
  • 사용해야할 때
    • 기본자료값이 아닌 객체로 정의해야할 때 
    • 호출할 메소드의 매개변수가 객체를 요구할 때 
    • null값이 저장될 가능성이 있을 때 
    • 해당 기본자료형값에 대한 다양한 기능을 실행해야할 때 
  • 지원하는 wrapper클래스 
  • 기본자료형 Wrapper class
    byte Byte
    short Short
    int Int
    long Long
    float Float
    double Double
    char Char
    boolean Boolean
  • Why? 연산자와 기본자료형의 경우 객체가 아니다, 그렇기 때문에 객체만 담을 수 있는 타입이 있는데, 숫자 1을 담고 있는데, 담기지 않아서 정수를 표현하는 클래스를 이용해서 담는 것이다. 
  • When?
    1. Object[] obj = new Object[10];
      • obj[0] = 1; 객체가 아니여서 담을 수 없다. Object의 자손이 아니다 
    2. public boolean equals(Object obj){}
      • 기본자료형은 Object의 매개변수로써 전달 할 수 없다. 
    3. public object method(){ return 1; } 
      • 반환값이 Object기 때문에 return값을 1로 설정할 수 없다.

4. null값이 필요할 때 

  • 가입정보를 받을 때, name과 email, password는 필수사항이지만, age는 선택사항이여서 입력을 하지않았다. 
  • 객체의 기본값은 null이고 기본자료형은 기본값이 0으로 설정되어있다. 
  • 객체의 기본값을 보면 빈칸이라는 느낌이 오지만, int age의 경우 0이 설정되있기 때문에 0살이라는건지 ,값을 입력안한건지 확인이 어렵다는 것이다. 

Auto Boxing/ Auto unBoxing

  • int a = 10;
  • Integer a1 = new Integer(10); 
  • Integer a2 = new Integer("1000");
  • 참조변수 a에는 기본자료형 타입의 정수값 10이 저장되어 있다. 
  • a1에는 정수 10을 포함하고 잇는 Integer객체의 주소값을 가지고 있다. 
  • a2에는 문자열"1000"을 1000으로 변경해서 포함하고 있는 Integer객체의 주소 값을 가지고 있다. 
  • 그러나 중간에 선이 가있는데, Deprecated가 적혀있다. 
  • 자바 9버젼부터 폐기 예정이라는 뜻이다. 자바 8버젼에서는 사용이 가능하다.
  • Why? 자바 5버젼부터 AutoBoxing 과 Auto unBoxing이 사용되기 때문이다. 
  • 오토박싱, 오토 언박싱(자바 5버젼부터 지원하는 기능이다. )
  • 기본자료형을 wrapper클래스타입의 객체로 
  • wrapper클래스타입의 객체를 기본자료형의 값으로 변경하는 것을 자동으로 처리하는 것을 의미한다. 

오토박싱

  • 변수의 타입의 wrapper클래스 타입과 저장할 변수의 타입이 기본자료형일 때 자동으로 변수의 타입과 일치하는 wrapper객체를 생성해서 기본자료형 값을 저장한 다음 그 객체를 참조변수에 대입하는 것이다. 
  • 왼쪽의 객체를 따라서 객체를 생성하는 것을 오토 박싱이라고 한다. 
  • 이렇게도 사용이 가능하다. 모든객체의 조상인 Object를 바라보고 있기 때문에 1번 2번처럼 작성해도 상관없다. 
  • Object의 타입의 참조변수 b1은 Integer객체의 내부에 있는 Object를 클래스 형변환 하여 참조하고 있기 때문이다. 

오토언박싱

  • wrapper클래스 타입의 객체에 저장된 값을 기본자료형 타입의 변수에 대입하면 자동으로 해당 wrapper객체가 가지고 있는 기본자료형 값이 대입된다. 
  • 오토언박싱으로 객체+ 객체+ 정수의 값을 변환하지 않고 계산할 수 있다. 

Integer method

  • integer의 경우 MAX_VALUE/ MIN_VALUE로 static method로 최대값 2^63-1과 최소값-2^63이 정해져 있다. 
  • class Integer는 compare(int x, int y)의 값처럼 비교를 할 수 있다. 두수가 같으면 0이고, x값이 크면 양수, y값이 크면 음수의 값이 출력된다. 
  • 양수로 결과값이 출력되는 것은 max(int a , int b), min(int a , int b) 으로 비교할 수 있다. 
  • 역순기능도 존재한다. 
  • Integer.toBinaryString(정수값)  : 2진수의 값으로 출력된다.
  • Integer.toOctalString(정수값) : 8진수의 값으로 출력된다. 
  • Integer.toHexString(정수값) : 16진수의 값으로 출력된다.

wrapper클래스의 parseXXX(문자열 메소드)

  • 문자열을 기본자료형 타입의 값으로 변환하는 정적메소드 
  • int  = Integer.parseInt(String text);
    • 정수를 작성할 때에는 _을 써도 되지만, 문자열을 작성할 때에는 하이픈을 넣을 수 없다. 
    • 정수변환으로 인하여 소숫점값을 허용하지 않는다.
    • 숫자외에 어떤 문자도 있어서는 안된다. 
    • 공백문자를 허용하지 않는다. 
    • 자리수를 나타내는 , 문자는 허용하지 않는다. 
    • Long과 Double도 마찬가지다. 
    • 사용자가 입력한 것에서 공백을 없애고 숫자외의 값이 들어가지 않도록 조절해야한다. 
    • 사용자의 입력을 최소화하고 고를 수 있도록 조정하는 것이 중요하다
  • long = Long.parseLong(String text);
  • double = Double.parseDouble(String text);
    • 실수로 변환하기 때문에 소숫점 값을 허용한다. 
    • 소숫점만 표시하고, 소숫점 이하 값이 없어도 상관없다. 
    • 정수형의 문자열도 상관없다. 
  • boolean = Boolean.parseBoolean(String text);
  • boolean은 글자 true와 false를 boolean값으로 변경해준다. 
  • Java.lang.NumberFormatException : 숫자형식의 문자열이 아닌 값을 숫자로 변환할 때 발생하는 오류이다. 

math 클래스 

  • 수학 연산과 관련된 기능을 제공하는 클래스이다. 
  • 모든 필드와 모든 메소드가 정적필드, 정적메소드이다. 
  •  java.lang package내부에 있는 class이다. 

method

  • double random(); 
    • 난수 얻기
    • 매번 새로운 값이 나타나는 , 랜던값을 얻게 되는 숫자
    • random()은 0.0보다 크거나 같고, 1.0보다 작은 임의의 실수를 반환한다. 
  • (int)(Math.random()*6)+1;
    • 1~6까지의 숫자를 얻기 
    • indexs는 0부터시작해서 5의 값이 출력되기 때문에 +1을 입력해줘서 전체적으로 1씩증가되게 입력한다. 
    • random의 반환값의 경우 double이기 때문에 강제형변환을 하여 정수로 바꿔준다 
  • long round(double value);
    • 반올림 된 값을 얻기 
  • double ceil(double value);
    • 천장값 얻기 
    • 값이 실수값 일 때 자신보다 큰 정수중에서 가장 작은 정수값을 반환한다. 
    • 가장큰 정수 4,5,6,7... 가장작은 정수 4
    • 반환값은 실수지만 정수로 변환하여 많은 사용을 한다. 
    • ex) 목록을 표시하는 게 1페이지당 20개일 경우 데이터는 25개를 가지고 있다 
    • 그럼 이 ceil을 이용하여 2페이지로 표시 할 수 있다. 
  • double floor(double value);
    • 바닥값 얻기 
    • 값이 실수값 일 때 자신보다 작은 정수중에서 가장 큰 정수 값을 반환한다. 
    • 가장작은 정수 ...1,2,3  가장큰 정수 값 3
    • 반환값은 실수지만 정수로 변환하여 많이 사용한다. 
    • 천장값과 바닥값의 경우 paging처리를 위하여 많은 이용을 한다. 
반응형

'중앙 HTA (2106기) story > java API story' 카테고리의 다른 글

Set interface, List interface(iterator)  (0) 2021.10.07
Generic(제네릭)  (0) 2021.10.05
StringBuilder, StringBuffer  (0) 2021.10.03
String Class  (0) 2021.10.01
java API, java.Lang  (0) 2021.09.30
Comments