12장 java.base 모듈

모듈 → 라이브러리라고 봐도 무방하다.

 

12.1 API 도큐먼트

읽는 방법

1. 웹 사이트 메뉴 이용

2. 웹 사이트 검색 이용 →

3. 이클립스 이용

 

예시> String 

public class String {
	public int field1;
    	protected int field2;
    
    int field3;			// 디폴트 
    private int field4;		// 프라이빗   
}
// public과 protected 접근 제한자에 한에서 API Doc에서 볼 수 있다.

→ 각각의 클래스를 찾아보며 Field, Constructor, Method 등을 살펴보았다.

 

12.2 java.base 모듈

모든 모듈이 의존하는 기본 모듈로, 유일하게 requires하지 않아도 사용할 수 있다.

패키지 용도
java.lang 자바 언어의 기본 클래스 제공
java.util 자료 구조와 관련된 컬렉션 클래스 제공
java.text 날짜 및 숫자를 원하는 형태의 문자열로 만들어주는 포맷 클래스 제공
java.time 날짜 및 시간을 조작하거나 연산하는 클래스 제공
java.io 입출력 스트림 클래스 제공
java.net 네트워크 통신과 관련된 클래스 제공
java.nio 데이터 저장을 위한 Buffer 및 새로운 입출력 클래스 제공

java.lang 패키지

→ String, System, Integer, Double, Exception, RuntimeException 등이 있고, 이 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.

 

 

12.3 Object 클래스

※ 클래스를 선언 할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다.

따라서 자바의 모든 클래스Object의 자식이거나 자손 클래스

(= Object가 가진 메소드는 모든 객체에서 사용 가능)

 

Object의 주요 메소드

메소드 용도
boolean equals(Object obj) 객체의 번지를 비교하고 결과 리턴

(매개변수 타입이 Object이므로 자동 타입 변환에 의해 모든 객체가 매개값으로 대입 가능)
int hashCode() 객체의 해시코드 리턴

(해시코드 : 객체의 주소값을 기반으로 생성한 객체의 고유한 정수값. 즉, 유일함을 나타내는 값)
String toString() 객체 문자 정보 리턴

 

→ 일반적으로 Object의 equals() 메소드는 재정의해서 동등 비교용으로 사용

     (동등 비교 : 객체가 달라도 내부의 데이터가 같은지를 비교)

 

예시)

public class Member {		// (extends Object)가 생략된 것이다
	public String id;
	
	public Member(String id) {		// 문자열 초기화 생성자
		this.id = id;
	}
	
	@Override
	public boolean equals(Object obj) {		// String클래스도 이런식으로 재정의
		if(obj instanceof Member target) {
			if(id.equals(target.id)) {
				return true;
			}
		}
		return false;
	}
}

 

● 객체 해시코드

→ 객체를 식별하는 정수.

객체의 메모리 번지를 이용하여 해시코드 생성. 따라서 객체마다 다른 정수값을 리턴

hashCode() 메소드 용도는 equals() 메소드와 비슷한데, 두 객체가 동등한지를 비교할 때 주로 사용

equals() 메소드와 마찬가지로 객체의 데이터를 기준으로 재정의하여 새로운 정수값을 리턴하는 것이 일반적이다.

 

1) 두 객체의 hashCode()가 리턴하는 정수 값이 같은지 확인

2) equals()를 사용하여 true를 리턴하면 동등 객체임을 판단

 

예시)

public class Student {
	private int no;
	private String name;
	
	public Student(int no, String name) {	// private 접근제한자 초기화
		this.no = no;
		this.name = name;
	}
	
	public int getNo() { return no; }		// 게터
	public String getName() { return name; }		// 게터
	
	@Override
	public int hashCode() {		// 해시코드 재정의
		int hashCode = no + name.hashCode();
		return hashCode;
	}
	
	@Override
	public boolean equals(Object obj) {		// equals 재정의
		if(obj instanceof Student target) {
			if(no == target.getNo() && name.equals(target.name)) {
				return true;
			}
		}
		return false;
	}
}

 

● 컬렉션(15장에서 배움)에 속하는 HashSet → 동등 객체를 중복 저장하지 않음

(hashCode()와 equals()메소드를 이용하여 동등 객체인지 판단함)

 

예시)

import java.util.HashSet;

public class HashSetCodeExample {

	public static void main(String[] args) {
		HashSet hashSet = new HashSet();
		
		Student s1 = new Student(1, "홍길동");
		hashSet.add(s1);
		System.out.println("저장된 객체 수: " + hashSet.size());
		
		Student s2 = new Student(1, "홍길동");
		hashSet.add(s2);
		System.out.println("저장된 객체 수: " + hashSet.size());
		
		Student s3 = new Student(2, "홍길동");
		hashSet.add(s3);
		System.out.println("저장된 객체 수: " + hashSet.size());
	}
}

 

 

● 객체 문자 정보

Object의 tostring() 메소드는 객체의 문자 정보를 리턴. (클래스명@16진수해시코드)

객체의 문자 정보가 중요한 경우 재정의하여 리턴

예시)

public class SmartPhone {
	private String company;
	private String os;
	
	public SmartPhone(String company, String os) {
		this.company = company;
		this.os = os;
	}
	
	@Override
	public String toString() {
		return company + ", " + os;
	}
}

 

 

● 롬복(Lombok) 사용하기

JDK에 포함된 표준 라이브러리는 아니지만 개발자들이 즐겨 쓰는 자동 코드 생성 라이브러리

https://projectlombok.org/download

 

1) 다운로드 받은 lombok.jar 파일이 있는 곳에서 관리자 권한으로 명령 프롬프트 실행하고 명령어 실행

2) 롬복을 설치할 이클립스를 찾아 인스톨 버튼을 눌러준다.

3) 이클립스가 롬복 기능을 인식하도록 이클립스를 재시작해준다.

4) 해당 프로젝트에 lib 폴더를 생성하고 다운로드한 lombok.jar 파일을 lib 폴더에 복사한다.

5) lombok.jar 파일을 선택하여 [Build Path] → [Add to Build Path] 선택

6) 새로운 클래스를 만들고 필드 선언 후 클래스 선언 위에 @Data를 붙여보자.

 

@Data 를 '어노테이션'이라 하며 @Data가 붙게 되면 컴파일 과정에서 기본 생성자와 함께

Getter, Setter, hashCode(), equals(), toString() 메소드가 자동 생성된다.

 

어노테이션 설명
@NoArgsConstructor 기본 생성자 포함
@AllArgsConstructor 모든 필드를 초기화시키는 생성자 포함
@RequiredArgsConstructor 기본 생성자 포함.
만약 final 또는 @NonNull 이 붙은 필드가 있다면 해당 필드만 초기화시키는 생성자 포함
@Getter Getter 메소드 포함
@Setter Setter 메소드 포함
@EqualsAndHashCode equals()와 hashCode() 메소드 포함
@ToString toString() 메소드 포함

 

 

 

 

12.4 System 클래스

자바 프로그램은 운영체제상에서 바로 실행되는 것이 아닌 자바 가상 머신(JVM) 위에서 실행된다.

따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어려움.

java.lang 패키지에 속하는 System 클래스를 이용하면 일부 기능 이용 가능하다.

정적 멤버 용도
필드 out 콘솔(모니터)에 문자 출력
err 콘솔(모니터)에 에러 내용 출력
in 키보드 입력
메소드 exit(int status) 프로세스 종료
currentTimeMillis() 현재 시간을 밀리초 단위의 long 값으로 리턴
nanoTime() 현재 시간을 나노초 단위의 long 값으로 리턴
getProperty() 운영체제와 사용자 정보 제공
getenv() 운영체제의 환경 변수 정보 제공

 

예시)

try{
	int value = Integer.parseInt("1oo");
} catch(NumberFormatException e){
	System.err.println("[에러 내용]");
    System.err.println(e.getMessage());
}

 

● 진행 시간 읽기

System 클래스의 currentTimeMillis() 메소드와 nanoTime() 메소드는 1970년 1월 1일 0시부터 현재까지 진행된 시간을 리턴한다.

long time1 = System.nanoTime();
		
int sum=0;
for(int i=0; i<1000000; i++) {
	sum += 1;
}
		
long time2 = System.nanoTime();
System.out.println((time2-time1)/Math.pow(10, 9));

time2 - time1 연산으로 그 사이의 프로그램 처리 시간을 구할 수 있다.

Math.pow(10, 9)는 나노초, 10의 9승을 표현한 것이다.

 

 

12.5 문자열 클래스

클래스 설명
String 문자열을 저장하고 조작할 때 사용
StringBuilder 효율적인 문자열 조작 기능이 필요할 때 사용
StringTokenizer 구분자로 연결된 문자열을 분리할 때 사용

 

● String 클래스

// 기본 문자셋으로 byte 배열을 디코딩해서 String 객체로 생성
String str = new String(byte[] bytes);

// 특정 문자셋으로 byte 배열을 디코딩하여 String 객체로 생성
String str = new String(byte[] bytes, String charsetName);

charset → UTF-8, EUC-KR 등

컴퓨터는 디코딩, 인코딩 과정에서 byte단위로 데이터를 넘겨준다.

 

● StringBuilder 클래스

String은 내부 문자열을 수정할 수 없다.

StringBuilder를 이용하면 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.

리턴 타입 메소드(매개변수) 설명
StringBuilder append(기본값 | 문자열) 문자열을 끝에 추가
StringBuilder insert(위치, 기본값 | 문자열) 문자열을 지정 위치에 추가
StringBuilder delete(시작 위치, 끝 위치) 문자열 일부를 삭제
StringBuilder replace(시작 위치, 끝 위치, 문자열) 문자열 일부를 대체
String toString() 완성된 문자열을 리턴

 

String data = new StringBuilder()
			.append("DEF")
			.insert(0, "ABC")
			.delete(3, 4)
			.toString();
// 이런식으로도 사용 가능하다

 

● StringTokenizer 클래스

문자열이 '구분자'로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하려면!

1) String의 split() 메소드 이용 → 정규 표현식으로 구분

String data1 = "홍길동&이수홍,박연수";
String[] arr = data1.split("&|,");

 

2) StringTokenizer 이용 → 문자로 구분

String data2 = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(data2, "/");

 

리턴 타입 메소드(매개변수) 설명
int countTokens() 분리할 수 있는 문자열의 총 수
boolean hasMoreTokens() 남아 있는 문자열이 있는지 여부
String nextToken() 문자열을 하나씩 가져옴
String data2 = "홍길동/이수홍/박연수";
		//문자열을 "/"로 구분하여 하나씩 저장
		StringTokenizer st = new StringTokenizer(data2, "/");		
		// 남아 있는 문자열의 여부에 따라 while문 반복
        while(st.hasMoreTokens()) {	
        	// 문자열을 하나씩 가져옴
			String token = st.nextToken();
			System.out.println(token);
		}

 

 

12.6 포장 클래스

자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다.

기본 타입 포장 클래스
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
boolean Boolean

→ 단지 객체로 생성하는 데 목적이 있음. (15장에서 학습할 컬렉션 객체 때문)

 

박싱(boxing) → 기본 타입의 값을 포장 객체로 만드는 과정

언박싱(unboxing) → 포장 객체에서 기본 타입의 값을 얻어내는 과정

Integer obj = 100;		// 박싱
int value = obj;		// 언박싱
int result = obj + 100;		// 정수 리터럴과 연산시 언박싱 후 연산

 

포장 클래스의 equals() 메소드는 내부의 값을 비교하도록 재정의되어있다.

→ 객체 내부 값을 비교하고 싶으면 equals()를 사용하자.

 

 

12.7 수학 클래스

 

구분 코드
절대값 Math.abs(t1);
올림값 Math.ceil(t1);
버림값 Math.floor(t1);
최대값 Math.max(t1, t2, ... );
최소값 Math.min(t1, t2, ... );
랜덤값 Math.random( );
반올림값 Math.round(t1)

 

'JAVA' 카테고리의 다른 글

10일차 2024 - 3 - 11  (0) 2024.03.17
14일차 2024 - 3 - 15  (0) 2024.03.14
12일차 2024 - 3 - 13  (0) 2024.03.13
3일차 2024 - 2 - 28  (0) 2024.02.28
2일차 2024 - 2 - 27  (0) 2024.02.28

+ Recent posts