60강. java.lang 패키지(5) - String 클래스 1
61강. java.lang 패키지(6) - String 클래스 2
62강. java.lang 패키지(7) - Wrapper(포장) 클래스
63강. java.lang 패키지(8) - Math 클래스
64강. java.util 패키지
60강. java.lang 패키지(5) - String 클래스 1
ㅁ String 클래스
- String str = "자바"; // 문자열 리터럴을 String형 변수에 대입.
- 문자열 리터럴을 작성하면 내부적으로 String 객체가 만들어지고, 그 String 객체의 번지가 str에 저장됨.
- String 클래스는 직접적으로 우리가 String 객체를 만들 수 있도록 다양한 생성자를 제공하고 있다.
- 여기에서는 byte 배열을 가지고 문자열을 만들 수 있는 생성자 몇가지를 살펴본다..
- 첫번째 생성자는 byte 배열 전체의 내용을 문자열로 만드는 생성자.
- 두번째 생성자는 byte 배열 안의 전체 데이터를, 지정한 문자셋으로 변환해서 문자열로 만드는 생성자.
- 세번째 생성자는 byte 배열 전체의 데이터를 문자열로 바꾸는 게 아니라, 지정한 위치의 이 개수만큼만 문자열로 만드는 생성자.
- 네번째 생성자는 byte 배열 전체의 데이터가 아니라 지정한 위치에 몇개까지만 주어진 문자셋으로 변환해서 문자열을 만듦.
ㅁ 예제
ㅁ 예제2
ㅁ String 클래스는 매우 많은 메서드를 가지고 있다.
- 문자열에 대한 정보, 문자열을 조작하는 메서드들이 많이 있다.
- replace는 기존에 있는 문자열에서 특정 부분을 대체할 때 사용.
- substring 메서드는 문자열에서 일부분을 추려낼 때 사용.
- 표 외에도 많은데, 다 외울 필요는 없다. 개발하다보면 자주 사용하고 외워진다.
ㅁ 문자 추출 charAt()
ㅁ 문자열 비교 equals()
- 문자열은 == 연산자 사용할 경우 원하지 않는 결과가 나올 수 있음.
- 객체가 달라도 문자열이 같은지를 비교하고 싶으면 String에서 오버라이딩한 equals() 메서드 사용.
- new 연산자를 사용해서 문자열 리터럴을 String 객체로 만듦.
밑에 두 개는 그냥 문자열 리터럴을 변수에 대입.
- new로 생성한 문자열은 항상 별개의 객체로 만들어짐.
2개의 String 객체를 3개의 변수가 참조.
ㅁ 바이트 배열로 변환 getBytes()
- 문자열을 가지고 getBytes() 메서드를 호출하면 각각의 문자를 byte로 만들어서 배열로 저장한 다음에 리턴함.
- 이때 getBytes() 메서드를 호출할 때 문자셋에 대한 정보를 주게 되면 문자셋이 정한 표준대로 변환.
- 여기서 시스템이란 운영체제를 뜻함. 윈도우 운영체제는 MS949라는 문자셋을 이용해서 문자를 byte로 바꿈.
MS949는 영어는 1byte, 한글은 2byte로 표현함.
- 만약 OS의 기본 문자셋이 UTF-8이라면, UTF-8은 영어는 1byte, 한글은 3byte로 표현함.
- 그래서 OS의 기본 문자셋이 어떤 거냐에 따라서 한글을 byte로 바꿀 때 2byte로 바꿔지는지 3byte로 바꿔지는지가 결정됨.
- EUC-KR은 MS949와 같이 영어는 1byte, 한글은 2byte로 표현함.
- bytes1과 bytes2 이 바이트 배열의 크기를 비교하면 다르다.
bytes1은 한글 하나를 2바이트로 표현해서 이 배열의 길이는 6이다.
bytes2은 한글 하나를 3바이트로 표현해서 이 배열의 길이는 9이다.
- 문자열을 byte로 바꾸는 과정을 인코딩이라고 함.
- 반대로 이렇게 얻은 byte 배열을 문자열로 복원하는 것을 디코딩이라고 함.
이때 처음 인코딩할 때 사용된 문자셋과 동일한 문자셋으로 디코딩을 해야 복원이 잘 됨.
EUC-KR이라는 문자셋을 이용해서 byte 배열을 얻었는데, 다시 UTF-8로 복원하려하면 한글이 깨짐.
UTF-8로 인코딩된 byte 배열을, EUC-KR로 복원하려하면 한글이 깨짐.
ㅁ 예제
- 이클립스는 최상단의 Window - Preferences - General - Workspace에서 하단의 Text file encoding에서 기본 문자셋을 지정할 수 있다.
61강. java.lang 패키지(6) - String 클래스 2
ㅁ 문자열 찾기 indexOf()
- 프로그램을 작성할 때 종종 문자열 안에서 특정 문자열이 포함되어 있는지, 포함되어 있지 않은지를 검사할 때가 있다.
또한 특정 문자열이 포함되어 있다면 그 위치가 어디인지도 필요할 때가 있다.
- indexOf()는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴하는 메서드.
- String에는 indexOf() 메서드와 유사하게 어떤 문자열이 포함되어 있는지 아닌지를 알려주는 메서드가 contains()다.
if(subject.contains("자바") == true) {
System.out.println("자바와 관련된 책이군요");
} else
System.out.println("자바와 관련없는 책이군요");
contains는 매개값으로 찾는 문자열을 제공하면, 전체 문자열에서 이 문자열이 존재하면 true, 존재하지 않으면 false를 리턴함.
ㅁ 문자열 길이 length()
- 문자열의 길이를 리턴
ㅁ 문자열 대치 replace()
- 첫번째 매개값인 문자열을 찾아 두번째 매개값인 문자열로 대치한 새로운 문자열 생성 및 리턴.
- String 타입은 문자열이 한 번 저장되면, 이 문자열을 다른 문자열로 바꿀 수 없다.
String을 불변의 문자열이라고 함.
- 그래서 replace()는 새로운 문자열을 리턴할 수 밖에 없는 것.
ㅁ 문자열 잘라내기 substring()
- 주어진 인덱스에서 문자열을 추출
- substring은 2개로 오버로딩 되어있다.
substring(int beginIndex)는 주어진 인덱스부터 끝까지 문자열을 추출.
substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출.
- endIndex: 부분 문자열이 끝나는 인덱스입니다. 이 인덱스의 문자는 포함되지 않습니다.
- 인덱스는 0부터 시작하며, endIndex는 포함하지 않고 그 전 인덱스까지만 반환합니다.
ㅁ 알파벳 소, 대문자 변경 toLowerCase(). toUpperCase()
- 영어로 검색할 때 대소문자와 상관없이 같은 결과가 나오게 입력된 검색어를 전부 다 대문자 또는 소문자로 바꿈 .
ㅁ 문자열 앞뒤 공백 잘라내기 trim()
- 문자열의 앞뒤 공백 제거한 새로운 문자열 생성 및 리턴
ㅁ 문자열 변환 valueOf()
- 기본 타입의 값을 문자열로 변환.
String str1 = String.valueOf(10.5);
String str2 = String.valueOf(true);
System.out.println(str1); // 10.5
System.out.println(str2); // true
62강. java.lang 패키지(7) - Wrapper(포장) 클래스
ㅁ java.lang 패키지에 속한 Wrapper 클래스. 무언가를 포장하고 있는 클래스라는 뜻이다.
ㅁ 포장 객체
- 기본 타입의 값을 내부에 두고 포장. // 포장 객체는 기본 타입의 값을 포장하는 객체다.
- 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없다.
- byte, short, int, long, float, double, char, boolean 기본 타입 값 갖는 객체.
- 포장 객체에 저장되는 기본 타입별로 포장 클래스가 별도로 존재함.
char 타입과 int 타입만 다름.
- java.lang에 저 포장 클래스들이 있다. 그래서 이들 클래스는 별도의 import없이 자바 프로그램에서 바로 이용 가능.
ㅁ Boxing과 Unboxing
- 박싱: 기본 타입의 값을 Wrapper(포장) 객체로 만드는 과정.
- 언박싱: 포장 객체에서 기본 타입의 값을 얻어내는 과정.
- 생성자의 매개값으로 기본타입의 값을 주는 경우
바로 이 기본 타입의 값을 박싱한 포장 객체가 만들어짐.
- 생성자의 매개값으로 문자열을 주는 경우
이 문자열을 해당 기본 타입으로 변환을 한 후 박싱해서 포장 객체가 만들어짐.
ㅁ 포장객체를 생성하는 또 다른 방법
- 생성자를 이용하지 않고 각 포장 클래스가 가진 정적 valueOf메서드를 이용하는 방법.
- valueOf는 해당 포장 클래스 타입(. 이전)의 포장 객체를 생성하는데,
지금 같은 경우 Integer의 valueOf니까 매개값을 int 타입으로 변환해서,
그것을 Integer 객체 안에 넣어서 Integer 객체의 참조를 리턴.
- Integer 클래스뿐 아니라 다른 포장 클래스도 valueOf 메서드가 있다.
ㅁ 언박싱
- 각각의 포장 클래스는 '기본 타입 이름 + value()'라는 메서드를 제공함. // byte면 byteValue() 메서드.
- '기본 타입 이름 + value()' 메서드를 호출하여 언박싱. 포장객체에 포장되어 있는 기본 타입 값을 리턴.
ㅁ 자동 박싱
- 포장 클래스 타입에 기본값이 대입될 경우 자동 박싱 발생.
Integer obj = 100; // 자동 박싱
(자바 문법에서 기본 타입의 값은 클래스 타입에 대입할 수 없다.)
(100이라고 하는 기본 타입의 값은 Integer라는 객체에 자동 박싱이 돼서 실제 대입이 되는 것은 포장 객체의 번지)
ㅁ 자동 언박싱
- 기본 타입에 포장 객체가 대입되는 경우 및 연산에서 자동 언박싱 발생.
Integer obj = new Integer(200);
int value1 = obj; // 자동 언박싱
int value2 = obj + 100; // 자동 언박싱
(자바 문법에서 객체를 기본 타입 변수에 대입할 수 없다.)
(obj라고 하는 포장 객체 안에 있는 기본 타입의 값, 즉 int 값을 언박싱해서 끄집어내서 대입.)
('객체 + 기본타입의값'도 말이 안 됌.)
(포장 객체인 경우 자동 언박싱돼서 이 안에 있는 기본 타입의 값이 나온거)
ㅁ 문자열을 기본 타입 값으로 변환
- 포장 클래스는 어떤 기본값을 포장 객체로 만드는 기능만 가지고 있는 것이 아니라,
문자열을 기본 타입값으로 변환하는 메소드도 제공합니다.
- 프로그램을 작성하면서 문자열을 int로 바꾼다든지 double로 바꾸는 경우가 많은데 바로 여기서 제공하는 기능.
- 포장 클래스로 문자열을 기본타입값으로 변환
- 모든 포장 클래스는 'parse + 기본 타입 이름'의 정적 메소드를 가지고 있다.
ㅁ 포장 값 비교
- 래퍼 객체 안의 값 비교.
- 포장 객체는 내부 값 비교하기 위해 == 및 != 연산자를 사용하지 않는 것이 좋음.
==과 != 연산자는 객체의 번지를 비교하는 연산자라서.
- obj1과 obj2는 300이 아니라, 300을 포장하고 있는 포장 객체다.
-
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println(obj3 == obj4); // true가 나옴.
obj3과 obj4가 같은 객체를 참조한다.
자바는 이 범위의 값들을 자주 사용하기 때문에 이전에 박싱된 객체가 있으면 그걸 재사용함.
- 자바는 Integer 객체를 생성할 때 메모리 사용을 최적화하기 위해 오토박싱(Auto-Boxing) 시 특정 범위의 값에 대해 캐싱을 사용합니다. 구체적으로, Integer 클래스는 -128에서 127 사이의 값에 대해 캐시를 사용합니다. 이는 자주 사용되는 작은 정수 값들을 메모리에서 재사용함으로써 성능을 최적화하기 위함입니다.
- 그렇다고 저 값의 범위를 기억하며 포장 객체를 사용하긴 매우 귀찮기 때문에, 되도록 ==과 != 연산자를 사용하지 말라는 것.
ojb3.equals(obj4) <- 이걸 써라. 그 안의 값들을 비교하고 싶은거니까.
63강. java.lang 패키지(8) - Math 클래스
ㅁ Math 클래스
- Math.round()는 자바에서 제공하는 메서드로, 소수점 이하의 값을 반올림하는 기능을 제공합니다. 이 메서드는 기본적으로 소수점 이하 첫 번째 자리에서 반올림을 수행합니다. 이를 통해 Math.round()가 반환하는 값은 항상 가장 가까운 정수 값이 됩니다.
- Math.round()가 반환하는 값은 항상 정수지만, 이걸 활용해 소수 이하 특정자리에서 반올림 할 수 있음.
double value = 12.3456;
double temp1 = value * 100; // 1234.56
double temp2 = Math.round(temp1); // 1235.0
double v16 = temp2/100.0; // 12.35
double value = 12.3446;
double temp1 = value * 100; // 1234.46
double temp2 = Math.round(temp1); // 1234.0
double v16 = temp2/100.0; // 12.34
ㅁ Math.random() 메소드는 0.0 이상 1.0 미만 범위에 속하는 하나의 double 타입 값 리턴
ㅁ java.lang 패키지
- Object 클래스: 자바의 최상위 부모 클래스, Object 클래스의 메소드는 모든 자바 객체에서 사용 가능.
- System 클래스: 운영체제의 일부 기능을 이용할 수 있음. 정적 필드와 정적 메소드로 구성.
- Class 클래스: 클래스와 인터페이스의 메타 데이터가 Class 클래스로 관리됨.
- String 클래스: String 클래스의 다양한 생성자를 이용하여 직접 String 객체를 생성 가능.
- Wrapper 클래스: 기본 타입의 값을 갖는 객체를 포장객체라고 함. 기본 타입의 값을 포장 객체로 만드는 것을 박싱, 반대의 과정을 언박싱이라고 함.
- Math 클래스: 수학 계산에 사용할 수 있는 메소드를 제공하며, Math 클래스가 제공하는 메소드는 모두 정적 메소드이므로 Math 클래스로 바로 사용 가능.
64강. java.util 패키지
ㅁ java.util 패키지는 날짜 정보를 제공하는 유용한 API를 포함하고 있다.
ㅁ Date 클래스
- 날짜를 표현하는 클래스
- 객체간 날짜 정보를 주고받을 때 매개 변수나 리턴 타입으로 주로 사용.
void method(Date date) {...}
Date method() {...}
- Date 클래스를 가지고 객체 생성도 가능.
Date now = new Date();
이러면 현재 운영체제의 날짜를 기준으로 해서 Date 객체가 만들어짐.
그런데 이 Date안에 있는 날짜 정보를 출력하면 우리나라 형식에 맞게 출력되는게 아니라 영어로된 문자열이 출력됨.
- 우리가 원하는 날짜 형식의 문자열을 얻기 위해서는 java.text 패키지의 SimpleDateFormat 클래스와 함께 사용.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
SimpleDateFormat는 날짜를 우리가 원하는 문자열로 변환해주는 기능을 갖고 있음.
SimpleDateFormat이라는 객체를 생성할 때 생성자 매개값에 우리가 원하는 날짜의 문자열 형식을 지정해주면, Date 객체가 가지고 있는 날짜 정보를 이용해서, 생성자 매개값에 준 형식대로 문자열을 완성해준다.
- 이렇게 SimpleDateFormat 객체를 생성한 뒤에, 이 객체의 format()이라는 메서드를 호출하면 문자열 형태대로 값을 리턴받을 수 있다.
String strNow = sdf.format(now);
ㅁ 예제
package sec02.exam01;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateExample {
public static void main(String[] args) {
Date now = new Date();
System.out.println(now.toString()); // toString() 생략해도 같음.
SimpleDateFormat sdf = new SimpleDateFormat( // ctrl shift o => import 선언 단축키.
"yyyy년 MM월 dd일 hh시 mm분 ss초"); // mm은 중복이라 월은 MM 써야 함.
String strNow = sdf.format(now);
System.out.println(strNow);
}
}
[실행 결과]
Wed Jun 19 23:26:39 KST 2024
2024년 06월 19일 11시 26분 39초
ㅁ Calendar 클래스
- 달력을 표현한 클래스로 운영체제의 날짜 및 시간 기준으로 다양한 정보를 얻을 수 있음.
- 추상 클래스이므로 new 연산자를 사용하여 인스턴스 생성이 불가능.
- getInstance()라는 정적 메소드를 이용하여 Calendar의 하위 객체를 얻을 수 있음.
- get() 메소드는 매개값으로 상수를 받음. Calendar 클래스는 위에서 보듯이 다양한 상수를 가지고 있습니다.
- get() 메소드에 매개값으로 MONTH를 주게 되면 0~11까지의 숫자를 리턴함.
- 일은 1~31, 주는 1(일요일)~7
ㅁ 예제
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH)+ 1;
int day = now.get(Calendar.DAY_OF_MONTH);
System.out.println(year);
System.out.println(month);
System.out.println(day);
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
System.out.println(hour);
System.out.println(minute);
System.out.println(second);
int week = now.get(Calendar.DAY_OF_WEEK);
String strWeek = null;
switch(week) {
case Calendar.MONDAY:
strWeek = "월"; break;
case Calendar.THURSDAY:
strWeek = "목"; break;
}
System.out.println(strWeek);
int amPm = now.get(Calendar.AM_PM);
String strAmPm = null;
if(amPm == Calendar.AM) {
strAmPm = "오전";
} else {
strAmPm = "오후";
}
System.out.println(strAmPm);
'혼자 공부하는 자바' 카테고리의 다른 글
혼자 공부하는 자바 (65강 ~ 66강) (0) | 2024.06.23 |
---|---|
혼자 공부하는 자바 (56강 ~ 59강) (1) | 2024.06.16 |
혼자 공부하는 자바 (51강 ~ 55강) (0) | 2024.06.14 |
혼자 공부하는 자바 (46강 ~ 50강) (1) | 2024.06.09 |
혼자 공부하는 자바 (40강 ~ 45강) (0) | 2024.05.31 |