Java

13일차 공부 Objects, Big Integer&Decimal, 비밀번호, 대소문자구분, 열거

이즈라핀 2020. 4. 23. 14:22

1 교시

 

 

**java.lang 패키지

1. Object - 최상위 클래스

 

2. Objects - Object 클래스의 Utility 클래스

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

 

3. Wrapper Class

=> 기본 자료형의 데이터를 참조형으로 사용하기 위해서 만든 클래스

=> C 나 Java의 문제는 기본 자료형이라고해서 Value 형을 만들고 여러개의 데이터를 저장하고 그 참조를 저장할 수 있는 (Reference)참조형을 만들어서 2가지를 구분했다.

이렇게 나눈 이유는 실행의 효율성 때문이었다.

Value 형은 빠르게 접근해서 사용할 수 있고 참조형은 메모리 접근이 한 번 더 필요하다.

 

=> 최근의 프로그래밍언어들은 모든 데이터를 참조형으로 만들어서 사용

=> Java에서 기본형의 데이터를 참조형으로 변환해서 프로그래밍을 편리하게 할 수 있도록 만든 클래스

 

boolean - Boolean

 

byte - Byte

short - Short

char - Character

int - Integer

long - Long

 

float - Float

double - Double

 

1) 생성자 - Default Constructor(매개변수가 없는 생성자가 없음)

Interger i = new Integer();    //이것은 에러

Interger i = new Integer(10);     //처음부터 데이터를 대입해서 생성

 

2) 기본형으로 변환

=> 기본형Value() 메소드를 이용

int n = i.intValue();

 

3) 문자열과의 변환

=> static 메소드로 parse자료형(String str) 있어서 문자열을 Wrapper 타입으로 변환이 가능한데 변환이 불가능한 문자열을 대입하면 예외가 발생한다.

Integer x = Integer.parseInt("123");   // x는 123

x = Integer.parseInt("123");    // NumberFormatException 발생

 

=> 문자열로 변환할 때는 toString()을 호출

toString이 Overriding 되어 있어서 저장하고 있는 값을 문자열로 변환해서 리턴해준다.

 

String str = x.toStrong();  // "123"

str = x.intValue + "";   // "123" - 문자열 + 숫자는 문자열 뒤에 숫자를 이어붙인다.

 

4) Auto Boxing

=> Wrapper 클래스에 기본형 데이터를 바로 대입할 수 있도록 해준다.

Integer i = 10;    // 10을 직접 대입하지 않고 생성자를 호출해서 대입을 해준다.

=> 반대로도 된다.

int x = i;    // Auto Unboxing이라고 한다.

 

 

 

2 교시

 

 

4. BigInteger & BigDecimal

1) BigInteger

=> 큰 정수를 저장하기 위한 클래스

=> int가 할당받은 메모리 한계로 인해서 절대값 21억 정도까지만 저장할 수 있어서 더 큰 정수를 사용하기 위해서 만든 클래스

=> 정수를 배열로 저장해서 사용

=> 인스턴스를 생성할 때는 문자열로 데이터를 받아서 생성

=> 기본형으로 변환할 때는 intValue() 메소드를 이용

 

2) BigDecimal

=> Float과 Double이 정밀한 소수를 표현에 한계가 있어서 만든 클래스

=> 숫자를 문자열로 저장하고 있다가 작업을 할 때 숫자로 변환해서 수행

=> 오라클과 같은 데이터베이스는 소수를 38자리까지 저장할 수 있는데 이러한 데이터를 자바에서 읽으면 정밀도 때문에 문제가 발생할 소지가 있다.

자바의 double은 소수 15자리가 넘어가면 저장을 못한다.

=> 생성을 할 때는 숫자를 문자열로 대입받아서 생성

=> 기본형으로 변환할 때는 intValue() 형태의 메소드가 있다.

 

3) 기타

=> 2개의 클래스의 인스턴스는 산술 연산자를 이용해서는 연산을 못하고 연산을 수행해주는 메소드를 이용해야 한다.

 

 

 

 

 

3 교시

 

 

5. java.lang.System

=> 모든 멤버가 static 이라서 인스턴스를 생성할 필요가 없다.

 

1) Field

=> in : 표준 입력 스트림 - 키보드

=> out : 표준 출력 스트림 - 모니터

=> err : 표준 에러 출력 스트림 - 모니터

 

2) Method

=> static void exit(int code) : 프로그램 종료

매개변수로 대입하는 데이터는 종료 이유를 설명하는 데이터

0이 정상 종료, 나머지 정수는 운영체제 별 에러 코드

 

=> static long nanoTime() : 현재 시간을 10의 -9승 초 단위로 리턴

 

=> static long currentTimeMillis() : 현재 시간을 10의 -3승 초 단위로 리턴

 

=> static int identityHashCode(Object x) : x의 해시코드를 정수로 리턴

 

=> epoch time : 1970년 1월 1일 자정을 0으로 해서 지나온 시간

 

0.4 초 정도 걸렸다.

 

 

 

=> static String getProperty(String propertyNmae) : 프로퍼티에 해당하는 값을 문자열로 리턴

프로퍼티들은 시스템 관련된 옵션

응용프로그램을 만들 때 이 옵션 값을 확인해서 특정 동작을 추천하기도 한다.

 

 

 

 

4 교시

 

 

6. java.lang.Class

=> 클래스에 대한 정보를 소유한 클래스

=> 인스턴스를 직접 생성하지 않고 다른 인스턴스를 이용해서 생성

=> 인스턴스들이 getClass() 를 호출해서 생성

 

7. java.lang.Math

=> 수학과 관련된 클래스

=> 운영체제 별로 다른 결과가 나오는 경우가 있다.

모든 운영체제에서 동일한 결과를 만들고자 하는 경우에는 StrictMath를 이용하면 되는데 연산 속도는 Math보다 느림.

=> Constructor가 없다. 모든 멤버가 static이기 때문이다.

 

8. java.lang.Runtime

=> 프로세스 실행과 관련된 클래스

=> exec 이라는 메소드에 문자열로 명령어를 대입하면 이 명령어를 수행한다.

=> Constructor가 없다. 

=> Singleton 패턴으로 디자인된 클래스

생성자가 없는데 abstract class도 아니고 static이 아닌 메소드를 소유한 경우에는 이름 뒤에 Factory가 붙는 클래스가 있는지 확인해봐야 하고 없으면 메소드들 중에서 static이 붙고 자신의 클래스를 리턴하는 메소드가 있는지 찾아봐야 한다.

 

메모장이 실행된다.

 

 

 

5 교시

 

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개의 메소드만 사용하도록 제한하는 경우가 있다.

 

한글자씩 순서대로 출력된다.

 

 

비밀번호로 활용

같은 결과, 더 간결한 코드

ex1) 하나의 문자열을 입력박아서 대문자, 소문자, 그리고 숫자, 기타문자의 개수를 파악해서 4가지중 1가지라도 없으면 부적합한 비밀번호 그렇지 않으면 사용가능한 비밀번호로 출력해보기

 

 

 

 

6 교시

 

String toUpperCase() : 모두 대문자로 변환해서 리턴하는 메소드

String toLowerCase() : 모두 소문자로 변환해서 리턴하는 메소드

=> 영문은 대소문자를 구분하는 경우도 있지만 구분하지 않는 경우가 많다.

영문을 저장할 때는 모두 대문자나 소문자로 변경해서 저장하는 경우가 많다.

예외적인 경우는 비밀번호

조회를 할 때도 대소문자 구분을 하지 않는다.

 

 

 

 

 

7 교시

 

String [] split(String pattern) : pattern을 기준으로 문자열을 분할해서 문자열 배열로 생성

String substring(int startindex) : startindex 부터 마지막까지 문자열을 잘라서 리턴

String substring(int startindex, int endindex) : startindex부터 endindex 앞까지 잘라서 리턴

 

 

 

 

 

 

8 교시

 

 

3) 빠른 열거

=> 배열이나 List, Set의 데이터를 빠르게 접근하기 위한 방법

for(데이터1개의 자료형 변수명 : 배열이름) {

 

}

=> 배열의 모든 데이터가 순서대로 변수에 대입되고 { }안의 내용을 반복 수행

 

 

 

 

 

4) 조회와 관련된 메소드

int indexOf(String str) : str이 있는지 조회해서 있으면 첫번째 위치의 인덱스를 리턴

int lastIndexOf(String str) : str이 있는지 조회해서 있으면 마지막번째 위치의 인덱스를 리턴

 

String msg = "Hello Java Hello Java Hi";

msg.indexOf("Java") ->6

msg.lastIndexOf("Java") -> 17

 

데이터가 없는 경우에는 음수를 리턴 (회수나 위치를 찾을때 음수의 의미?)

msg.indexOf("Python") ->  -1

 

 

 

**연습문제

1. String coupang = "0420,10000,0421,20000,0422,-,0423,14000";
// 위의 데이터는 날짜와 매출을 연속적으로 기록한 것임
// 위의 데이터를 가지고 매출의 평균을 구하시오.
// -는 매출이 없는 것이 아니라 영업을 하지 않은 경우이므로 제외하고 매출의 평균을 구하세요.

// 1. , 단위로 분할해서 출력
// 2. 짝수번째 데이터만 출력
// 3. 짝수번째 데이터의 평균을 구하기

 

2. String str = "GGGNDDKDHGCCGDKSLDJGCCGCCGKDGCCGDDD";

// 위의 문자열에서 GCCG의 위치를 전부 출력하시오.

// 단 GCCG로 한 번 찾으면 이 문자열은 제외를 해야한다.

// charAt 과 length 만을 이용해서 해결

// 염기서열 문제

 

3. 문자열 메소드 사용

1) 문자열 데이터에서 각 글자를 하나씩 출력(charAt과 length)

 

2) 문자열 데이터를 숫자로 변환해서 출력(?parse? 메소드 이용)

 

3) 숫자로 변환되지 않는 문자열 데이터의 경우 예외를 발생시키지 않다록 하는 작업

 

4) 첫번째 문제에 도전

 

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