본문 바로가기

수업 정리

13일차 수업정리(java.lang 패키지)

희소행렬 - 0이 많은 행렬(압축하는데 사용)

** java.lang 패키지
1. Object - 최상위 클래스

2. Object - Object클래스의 Utility 클래스
    => Object 클래스에 없는 데 자주 사용할 만한 기능을 메소드로 추가한 클래스

3. Wrapper Class
    => 기본 자료형의 데이터를 참조형으로 사용하기 위해서 만든 클래스
    => C, Java 문제점 : 기본 자료형 Value형, 여러 데이터와 그 참조를 저장 가능한 Reference형을 만들어 2가지를 구분
        - 이유 : 실행의 효율성(Value형 - 빠르게 접근하여 사용, Reference형 : 메모리 접근이 한번 더 필요)
    => 최근의 프로그래밍언어들은 모든 데이터를 참조형으로 만들어서 사용
    => Java에서 기본형의 데이터를 참조형으로 변환하여 프로그래밍을 편리하게 할 수 있도록 만든 클래스
  1) 종류
    - boolean / Boolean
  
    - byte / Byte
    - short / Short
    - char / Character
    - int / Integer
    - long / Long
    
    - float / Float
    - double / Double
  2) 생성자 : Default Constructor(매개변수가 없는 생성자가 없음) 
    - Integer i = new Integer();     //에러 발생(매개변수를 대입해서 생성)
      Integer i = new Integer(10);  //생성 가능
  3) 기본형 변환
    => 기본형 Value() 메소드를 이용
    ex) int n = i.intValue();
  4) 문자열과의 변환
    => static 메소드의 parse(String str)로 문자열을 Wrapper 타입으로 변환 가능, 변환불가 문자열 대입시 예외 발생
    ex) Integer x = Integer.parseInt("123");  //x는 123
         x = Integer.parseInt("12k");  //NumberFormatException 발생
    => 문자열로 변환시 toString()을 호출
         toString이 Overriding되어 있어 저장하고 있는 값을 문자열로 변환하여 리턴
         ex) String str = x.toString();  // "123"
              str = x.intValue + "";  //"123" - 문자열 + 숫자는 문자열 뒤에 숫자를 이어붙임
  5) Auto Boxing
    => Wrapper 클래스에 기본형 데이터를 바로 대입할 수 있도록 해줌
    ex) Integer i = 10;  //10을 직접 대입하지 않고 생성자를 호출하여 대입(반대로도 가능)
         int x = i  //Auto Unboxing이라고 함

4. BigInteger & BigDecimal
  1) BigInteger : 큰 정수를 저장하기 위한 클래스
    => int가 할당받은 메모리 한계(절대값 21억정도)로 인해, 더큰 정수를 사용하기 위해 만든 클래스
    => 정수를 배열로 저장하여 사용
    => 인스턴스 생성시 문자열로 데이터를 입력받아서 생성
    => 기본형으로 변환시 intValue() 메소드를 이용
  2) BigDecimal
    => Float와 Double이 정밀한 소수를 표현에 한계아 있어 만든 클래스
    => 숫자를 문자열로 저장하고 있다가 작업시 숫자로 변환하여 수행
    => 데이터베이스(오라클등)는 소수 38자리까지 저장가능, 이러한 데이터를 자바에서 읽을시 정밀도에 문제 발생
         (자바의 double은 소수 15자리 이상은 저장 불가) 
    => 생성시 숫자를 문자열로 대입받아서 생성
    => 기본형 변환시 intValue() 형태의 메소드가 있음
  3) 기타
    => 2개의 클래스의 인스턴스는 산술 연산자를 이용하여 연산X, 연산을 수행해주는 메소드를 이용

5. java.lang.System
    => 모든 멤버가 static이라서 인스턴스를 생성할 필요가 없음
  1) Field
    => in : 표준 입력 스트림(키보드)
    => out : 표준 출력 스트림(모니터)
    => err : 표준 에러 스트림(모니터 - 글자가 빨간색으로 나옴)
  2) Method
    => static void exit(int code) : 프로그램 종료
        - 매개변수로 대입하는 데이터는 종료이유를 설명하는 데이터
        - 0이 정상종료, 나머지 정수는 운영체제 별 에러코드
    => epoch time : 1970년 1월 1일 자정을 0으로 해서 지나온 시간
    => static long nanoTime() : 현재 시간을 10의 -9승 초 단위로 리턴 - epoch time 기준
    => static long currentTimeMillis() : 현재 시간을 10의 -3승 초 단위로 리턴 - epoch time 기준
    => static int identityHashCode(Object x) : x의 해시코드를 정수로 리턴
    => static String getProperty(String propertyName) : 프로퍼티에 해당하는 값을 문자열로 리턴
         (프로퍼티들은 시스템 관련된 옵션 - 응용프로그램 제작시 옵션값을 확인해서 특정 동작 추천)

6. java.lang.Class
    => 클래스에 대한 정보를 소유한 클래스
    => 인스턴스를 직접 생성하지 않고 다른 인스턴스를 이용해서 생성
    => 인스턴스들이 getClass()를 호출해서 생성

7. java.lang.Math
    => 수학과 관련된 클래스
    => 운영체제 별로 다른 결과가 나오는 경우가 있음
         (모든 운영체제에서 동일한 결과를 만들고자 하는 경우 StrictMath를 이용(연산 속도가 Math보다 느림))
    => Constructor가 없음(모든 멤버가 static)

8. java.lang.Runtime
    => 프로세스 실행과 관련된 클래스
    => exec라는 메소드에 문자열로 명령어를 대입하면 이 명령어를 수행
    => Constructor가 없음
    => Singleton 패턴으로 디자인 된 클래스
        (생성자 X, abstruct classX이고, static이 아닌 메소드 소유시, 이름 뒤에 Factory가 붙는 클래스 확인, 없으면 메소

        드중 static이 붙고 자신의 클래스를 리턴하는 메소드가 있는지 찾아봐야 함

9. java.lang.String
    => 문자열을 다루기 위한 클래스
    => 내용을 변경할 수 없는 클래스
  1) 인스턴스 생성
    => 리터럴을 직접 대입해서 생성
        - String ? = "문자열";
    => 생성자를 호출해서 생성
        - String ? = new String(데이터);
        - 이 경우는 문자열을 대입하지 않고, byte 배열을 대입(네트워크, 파일로 부터 byte 단위로 읽어서 생성)
  2) 메소드
      - int length(); : 문자열의 길이를 리턴해주는 메소드
      - char charAt(int idx) : idx 번째에 해당하는 문자를 char로 리턴
    => 이 2개의 메소드만 가지면 나머지 모든 메소드를 직접 만들수 있음
        (C, Java로 문제를 해결하는 알고리즘 테스트에서 java는 이 2개의 메소드만 사용하도록 제한하는 경우도 있음)
    
      ex) 하나의 문자열을 입력받아서 대문자, 소문자, 그리고 숫자, 기타문자의 개수를 파악해서 4가지중 1가지라도 없으

         면 부적합한 비밀번호 그렇지 않으면 사용가능한 비밀번호로 출력해보기

      - String toUpperCase(); 모두 대문자로 변환해서 리턴하는 메소드
      - String toLowerCase(); 모두 소문자로 변환해서 리턴하는 메소드
    => 영문을 저장할 때는 모두 대문자나 소문자로 변경해서 저장하는 경우가 많음(예외 : 비밀번호, 조회도 구분X)

      - String[] split(String pattern) : pattern을 기준으로 문자열을 분할해서 문자열 배열로 생성
        ex) Hello World Java Python - " "를 기준으로 삼으면 4개로 나뉨
      - String subString(int startindex) : startindex 부터 마지막까지 문자열을 잘라서 리턴
        ex) irin.png - 4로 할시 png 출력
      - String subString(int startindex, int endindex) : startindex ~end 앞까지 잘라서 리턴

  3) 빠른 열거(배열이나 List, Set의 데이터를 빠르게 접근하기 위한 방법)
    => 형식 : for(데이터 1개의 자료형 변수명 : 배열명){  }
    => 배열의 모든 데이터가 순서대로 변수에 대입되고 { }안의 내용을 반복 수행
  4) 조회와 관련된 메소드
      - int indexOf(String str) : str이 있는지 조회해서 있으면 첫번째 위치의 인덱스를 리턴
      - int lastIndexOf(String str) : str이 있는지 조회해서 있으면 마지막번째 위치의 인덱스를 리턴
    ex) String msg = "Hello Java Hello Java Hi";
         msg.indexOf("Java") -> 6
         msg.lastIndexOf("Java") -> 17
        데이터가 없을 경우 음수를 리턴
         msg.indexOf("Python") -> -1(-1이 아닐수 있음)

** 연습문제
1. 
  1) "," 단위로 분할하여 출력
  2) 짝수번째 데이터만 출력
  3) 짝수번째 데이터의 평균을 구하기
  4) 가장 매출이 많은 날과 적은날을 빼고 

2. 
String str = "GGGNDDKDHGCCGDKSLDJGCCGCCGKDGCCGDDD";
//위의 문자열에서 GCCG의 위치를 전부 출력하시오
//단 GCCG로 한번 찾으면 이 문자열은 제외
//charAt와 length만을 이용해서 해결
//염기서열 문제

3. 문자열 메소드 사용
  1) 문자열 데이터에서 각 글자를 하나씩 출력(charAt와 length)

  2) 문자열 데이터를 숫자로 변환해서 출력(?.parse? 메소드 이용)
  
  3) 숫자로 변환되지 않는 문자열 데이터의 경우 예외를 발생시키지 않도록 하는 작업
 
  4) 첫번째 문제 go

  5) 두번째 문제는 반복문을 2개 사용해야 하고 첫번째 문자가 동일한 데이터를 만나면 그 위치를 기억시켜 작업해야함