본문 바로가기
혼자 공부하는 자바

혼자 공부하는 자바 (60강 ~ 64강)

by moca7 2024. 6. 17.

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(포장) 객체로 만드는 과정.  

- 언박싱: 포장 객체에서 기본 타입의 값을 얻어내는 과정.   

 

기본 타입의 값을 Wrapping된 객체로 얻는 방법은 2가지

 

- 생성자의 매개값으로 기본타입의 값을 주는 경우

바로 이 기본 타입의 값을 박싱한 포장 객체가 만들어짐.

 

- 생성자의 매개값으로 문자열을 주는 경우

이 문자열을 해당 기본 타입으로 변환을 한 후 박싱해서 포장 객체가 만들어짐.

 

 

ㅁ 포장객체를 생성하는 또 다른 방법

- 생성자를 이용하지 않고 각 포장 클래스가 가진 정적 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);