이것이 자바다 - Part 12

mj·2023년 1월 21일
0
post-thumbnail

Part 12 java.base 모듈

API 도큐먼트

자바 표준 모듈에서 제공하는 라이브러리는 방대하기 때문에 쉽게 찾아서 사용할 수 있도록 도와주는 API 도큐먼트가 있다.

라이브러리가 클래스와 인터페이스의 집합이라면, API 도큐먼트는 이를 사용하기 위한 방법을 기술한 것이다.

아래 URL 에 방문하여 JDK 버전별로 사용할 수 있는 API 도큐먼트를 볼 수 있다.

https://docs.oracle.com/en/java/javase/index.html

java.base 모듈

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

이 모듈에 포함되어 있는 패키지는 대부분의 자바 프로그램에서 많이 사용하는 것들이다.
다음은 java.base 모듈에 포함된 주요 패키지와 용도를 설명한 표이다.

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

우리가 지금까지 사용한 String, System, Integer, Double, Exception, RuntimeException 등의 클래스는 java.lang 패키지에 있고, 키보드 입력을 위해 사용한 Scanner 는 java.util 패키지에 있다.

java.lang 은 자바 언어의 기본적인 클래스를 담고 있는 패키지로, 이 패키지에 있는 클래스와 인터페이스는 import 없이 사용할 수 있다.

  • java.lang 패키지 주요 클래스
클래스용도
Object- 자바 클래스의 최상위 클래스로 사용
System- 키보드로부터 데이터를 입력받을 때 사용
- 모니터(콘솔)로 출력하기 위해 사용
- 진행 시간을 읽을 때 사용
시스템 속성(프로퍼티)을 읽을 때 사용
String- 문자열을 저장하고 조작할 때 사용
StringBuilder- 효율적인 문자열 조작 기능이 필요할 때 사용
java.util.StringTokenizer- 구분자로 연결된 문자열을 분리할 때 사용
Btye, Short, Character, Integer, Float, Double, Boolean- 기본 타입의 값을 포장할 때 사용
- 문자열을 기본 타입으로 변환할 때 사용
Math- 수학 계산이 필요할 때 사용
Class- 클래스의 메타 정보(이름, 구성 멤버) 등을 조사할 때 사용

Object 클래스

클래스를 선언할 떄 extends 크워드로 다른 클래스를 상소갛지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 됨.

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

그렇기 때문에 Object 가 가진 메소드는 모든 객체에서 사용할 수 있다.

메소드용도
boolean equals(Object obj)객체의 번지를 비교하고 결과를 리턴
int hashCode()객체의 해시코드를 리턴
String toString()객체 문자 정보를 리턴

객체 동등 비교

Object 의 equals() 메소드는 개체의 번지를 비교하고 boolean 값을 리턴한다.

public boolean equals(Object obj)

equals() 메소드의 매개변수 타입이 Object 이므로 자동 타입 변환에 의해 모든 객체가 매개값으로 대입될 수 있다.
equals() 메소드는 비교 연산자인 == 과 동일한 결과를 리턴한다.

일반적으로 Object 의 equals() 메소드는 재정의해서 동등 비교용으로 사용된다.
예를 들어 String 은 equals() 메소드를 재정의해서 내부 문자열이 같은지를 비교한다.

객체 해시코드

객체 해시코드란 객체를 식별하는 정수를 말한다.
Object 의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 생성하기 때문에 객체마다 다른 정수를 리턴한다.

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

public int hashCode()

equals() 메소드와 마탄가지로 hashCode() 메소드 역시 객체의 데이터를 기준으로 재정의해서 새로운 정수값을 리턴하도록 하는 것이 일반적이다.

자바는 두 객체가 동등함을 비교할 때 equals()와 hashCode() 메소드를 같이 사용하는 경우가 많다.
우선 hashCode() 가 리턴하는 정수값이 같은지 확인하고, 그 다음 equals() 메소드가 true 를 리턴하는지 등을 확인해서 동등 객체임을 판단한다.

객체 문자 정보

Object 의 toString() 메소드는 객체의 문자 정보를 리턴한다. 객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.
기본적으로 Object 의 toString() 메소드는 '클래스명@16진수해시코드' 로 구성된 문자열을 리턴한다.

객체의 문자 정보가 중요한 경우에는 Object 의 toString() 메소드를 재정의해서 간결하고 유익한 정보를 리턴하도록 해야 한다.

레코드 선언

데이터 전달을 위한 DTO(Data Transfer Object) 를 작성할 때 반복적으로 사용되는 코드를 줄이기 위해 Java 14 부터 레코드가 도입되었다.

다음 코드는 class 키워드 대신에 record 로 대체하고 클래스 이름 뒤에 괄호를 작성해서 저장할 데이터의 종류를 변수로 선언하였다.

public record Person(String name, int age) {
}

이렇게 선언된 레코드 소스를 컴파일하면 변수의 타입과 이름을 이용해서 pricate final 필드가 자동 생성되고, 생성자 및 Getter 메소드가 자동으로 추가된다.

그리고 hashCode(), equals(), toString() 메소드를 재정의한 코드도 자동으로 추가된다.

롬북 사용하기

롬북은 JDK 에 포함된 표준 라이브러리는 아니지만 개발자들이 즐겨 쓰는 자동 코드 생성 라이브러리이다. 롬북은 레코드와 마찬가지로 DTO 클래스를 작성할 때 Getter, Setter, hashCode(), equals(), toString() 메소드를 자동 생성하기 때문에 작성할 코드의 양을 줄여준다.

레코드와의 차이범은 필드가 final 이 아니며, 값을 읽는 Getter 는 getXxx(또는 isXxx) 로, 값을 변경하는 Setter 는 setXxx 로 생성된다는 것이다.

클래스 선언 위해 어노테이션 @Data 가 붙게 되면 컴파일 과정에서 기본 생성자와 함께 Getter, Setter, hashCode(), eqals(), toString() 메소드가 자동 생성된다.

@Data 외에도 다음과 같은 어노테이션을 사용할 수 있다.

어노테이션설명
@NoArgsConstructor기본(매개변수가 없는) 생성자 포함
@AllArgsConstructor모든 필드를 초기화시키는 생성자 포함
@RequiredArgsConstructor기본적으로 매개변수가 없는 생성자 포함. 만약 final 또는 @NonNull 이 붙은 필드가 있다면 이 필드만 초기화시키는 생성자 포함
@GetterGetter 메소드 포함
@SetterSetter 메소드 포함
@EqualsAndHashCode()equals() 와 hashCode() 메소드 포함
@ToString()toString() 메소드 포함

System 클래스

자바 프로그램은 운영체제상에서 바로 실행되는 것이 아니라 자바 가상 머신 위애서 실행된다.
따라서 운영체제의 모든 기능을 자바 코드로 직접 접근하기란 어렵다. 하지만 java.lang 패키지에 속하는 System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다.

System 클래스의 정적 필드와 메소드를 이용하면 프로그램 종료, 키보드 입력, 콘솔(모니터) 출력, 현재 시간 읽기, 시스템 프로퍼티 읽기 등이 가능하다.

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

콘솔 출력

out 필드를 이용하면 콘솔에 원하는 문자열을 출력할 수 있다.

err 필드도 out 필드와 동일한데, 차이점은 콘솔 종류에 따라 에러 내용이 빨간색으로 출력된다는 것이다.

키보드 입력

자바는 키보드로부터 입력된 키를 읽기 위해 System 클래스에서 in 필드를 제공한다.
다음과 같이 in 필드를 이용해서 read() 메소드를 호출하면 입력된 키의 코드값을 얻을 수 있다.

int keyCode = System.in.read();

키 코드는 각 키에 부여되어 있는 코드로 숫자와 영문 대소문자는 아스키코드와 동일하다.

read() 메소드는 호출과 동시에 키 코드를 읽는 것이 아니라, Enter 키를 누르기 전까지는 대기 상태에다가 Enter 키를 누르면 입력했던 키들을 하나씩 읽기 시작한다.

단 read() 메소드는 IOException 을 발생할 수 있는 코드이므로 예외 처리가 필요하다.

프로세스 종료

운영체제는 실행 중인 프로그램을 프로세스로 관리한다. 자바 프로그램을 시작하면 JVM 프로세스가 생성되고, 이프로세스가 main() 메소드를 호출한다.

프로세스를 강제 종료하고 싶다면 System.exit() 메소드를 사용한다.

System.exit(int status)

exit() 메소드는 int 매개값이 필요한다, 이 값을 종료 상태값이라고 한다. 종료 상태값으로 어떤 값을 주더라도 프로세스는 종료되는데 정상 종료일 경우 0, 비정상 종료는 1 또는 -1 로 주는 것이 관례이다.

종료 상태값의 활용
종료 상태값은 System에 설정되는 SecurityManage 에서 활용되는데, 종료 상태값에 따라 특정 행위를 할 수 있도록 코딩할 수 있다. 하지만 Java17 에서 SecurityManager 가 더이상 사용되지 않는다.

진행 시간 읽기

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

이 두 메소드는 프로그램 처리 시간을 측정하는 데 주로 사용된다. 프로그램 처리를 시작할 때 한 번, 끝날 때 한 번 읽어서 그 차이를 구하면 프로그램 처리 시간이 나온다.

시스템 프로퍼티 읽기

시스템 프로퍼티란 자바 프로그램이 시작될 때 자동 설정되는 시스템의 속성을 말한다.
예를 들어 운영체제 종류 및 사용자 정보, 자바 버전 등의 기본 사양 정보가 해당된다.

문자열 클래스

자바에서 문자열과 관련된 주요 메소드는 다음과 같다.

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

String 클래스

String 클래스는 문자열을 저장하고 조작할 때 사용한다. 문자열 리터럴은 자동으로 String 객체로 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 객체를 생성할 수도 있다.

프로그램을 개발하다 보면 byte 배열을 문자열로 변환하는 경우가 종종 있다.
이때는 String 생성자 중에서 다음 두가지를 사용해 String 객체로 생성할 수 있다.

String str = newe String(byte[] bytes);
String str = new String(byte[] bytes, String charsetName);

StringBuilder 클래스

String은 내부 문자열을 수정할 수 없다.
문자열의 + 연산은 새로운 String 객체가 생성되고 기존의 문자열은 계속 버려지기 때문에 효율성이 좋다고 볼 수 없다.
잦은 문자열 변경 작업을 해야 한다면 String 보다는 StringBuilder 를 사용하는 것이 좋다.

StringBuilder 는 내부 버퍼(데이터를 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계되어 있다.
StringBuilder 가 제공하는 조작 메소드는 다음과 같다.

리턴 타입메소드(매개변수)설명
StringBuilderappend(기본값|문자열)문자열을 끝에 추가
StringBuilderinsert(위치, 기본값|문자열)문자열을 지정 위치에 추가
StringBuilderdelete(시작 위치, 끝 위치)문자열 일부를 삭제
StringBuilderreplace(시작 위치, 끝 위치, 문자열)문자열 일부를 대체
StringtoString()완성된 문자열을 리턴

StringTokenizer 클래스

문자열이 구분자로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하려면 String의 split() 메소드를 이용하거나 java.util 패키지의 StringTokenizer 클래스를 이용할 수 있다. split은 정규 표현식으로 구분하고, StringTokenizer 는 문자로 구분한다는 차이점이 있다.

여러 종류의 구분자가 아닌 한 종류의 구분자만 있다면 split() 메소드가 아니라 StringTokenizer 를 사용할 수 있다.
StringTokenizer 객체를 생성할 떄는 첫 번째 매개값으로 전체 문자열을 주고, 두 번째 매개값으로 구분자를 주면 된다.

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

StringTokenizer 객체가 생성되면 다음 메소드들을 이용해서 분리된 문자열을 얻을 수 있다.

리턴 타입메소드(매개변수)설명
intcountTokens()분리할 수 있는 문자열의 총 수
booleanhasMoreTokens()남아 있는 문자열이 있는지 여부
StringnextToken()문자열을 하나씩 가져옴

nextToken() 메소드는 분리된 문자열을 하나씩 가져오고, 더 이상 가져올 문자열이 없다면 예외를 발생시킨다.
그래서 nextToken() 을 사용하기 전에 hasMoreTokens() 메소드로 가져올 문자열이 있는지 먼저 조사하는 것이 좋은 방법이다.

포장 클래스

자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장 객체라고 한다.

포장 객체를 생성하기 위한 클래스는 java.lang 패키지에 포함되어 있는데, char 타입과 int 타입이 각각 Character, Integer 인 것만 제외하고는 기본 타입의 첫 문자를 대문자로 바꾼 이름을 가지고 있다.

기본 타입포장 클래스
byteByte
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

포장 객체는 포장하고 있는 기본 타입의 값을 변경할 수 없고, 단지 객체로 생성하는 데 목적이 있다.
이런 객체가 필요한 이유는 컬렉션 때문이다.

박싱과 언박싱

기본 타입의 값을 포장 객체로 만드는 과정을 박싱이라고 하고, 반대로 포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱이라고 한다.

Integer obj = 100;	//박싱
int value = obj;	//언박싱

문자열을 기본 타입 값으로 변환

포장 클래스는 문자열을 기본 타입 값으로 변환할 때도 사용된다.
대부분의 포장 클래스에는 parse + 기본타입 명으로 되어 있는 정적 메소드가 있다. 이 메소드는 문자열을 해당 기본 타입값으로 변환한다.

포장 값 비교

포장 객체는 내부 값을 비교하기 위해 == 와 != 연산자를 사용할 수 없다.

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

수학 클래스

Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공한다.
Math 클래스가 제공하는 메소드는 모두 정적이므로 Math 클래스로 바로 사용이 가능하다.

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

random() 메소드는 0.0과 1.0 사이의 double 타입 난수를 리턴한다.

난수를 얻는 또 다른 방법은 java.util.Random 클래스를 이용할 수 있다.
이 클래스를 이용하면 boolean, int ,double 난수를 얻을 수 있다.

다음은 Random 객체를 생성하기 위한 생성자이다.

객체생성설명
Random()현재 시간을 이용해서 종자값을 자동 설정한다.
Random(long seed)주어진 종자값을 사용한다.

종자값(seed) 란 난수를 만드는 알고리즘에 사용되는 값으로, 종자값이 같으면 같은 난수를 얻는다.

다음은 Random 클래스가 제공하는 메소드이다.

리턴값메소드(매개변수)설명
booleannextBoolean()boolean 타입의 난수를 리턴
doublenextDouble()double 타입의 난수를 리턴
intnextInt()int 타입의 난수를 리턴
intnextInt(int n)int 타입의 난수를 리턴

날짜와 시간 클래스

자바는 컴퓨터의 날짜 및 시각을 읽을 수 있도록 java.util 패키지에서 Date 와 Calendar 클래스를 제공한다.
또한 날짜와 시간을 조작할 수 있도록 java.time 패키지에서 LocalDateTime 등의 클래스를 제공한다.

클래스설명
Date날짜 정보를 전달하기 위해 사용
Calendar다양한 시간대별로 날짜와 시간을 얻을 때 사용
LocalDateTime날짜와 시간을 조작할 때 사용

Date 클래스

Date 는 날짜를 표현하는 객체 간의 날짜 정보를 주고받을 때 사용한다.
Date() 생성자는 컴퓨터의 현재 날짜를 읽어 Date 객체로 만든다.

Date now = new Date();

현재 날짜를 문자열로 얻고 싶다면 SimpleDateFormat 클래스와 함께 사용해야 한다.

Calendar 클래스

Calendar 클래스는 달력을 표현하는 추상 클래스이다. 날짜와 시간을 계산하는 방법이 지역과 문화에 따라 다르기 때문에 특정 역법에 따르는 달력은 자식 클래스에서 구현하도록 되어 있다.

특별한 역법을 사용하는 경우가 아니라면 하위 클래스를 만들 필요는 없고, Calendar 클래스의 정적 메소드인 getInstance() 메소드를 이용하면 컴퓨터에 설정되어 있는 시간대를 기준으로 Calendar 하위 객체를 얻을 수 있다.

Calendar now = Calendar.getInstance();

Calendar 가 제공하는 날짜와 시간에 대한 정보를 얻기 위해서는 get() 메소드를 이용한다.

형식 클래스

Foramt(형식) 클래스는 숫자 또는 날짜를 원하는 형태의 문자열로 변환해주는 기능을 제공한다.
Format 클래스는 java.text 패키지에 포함되어 있는데, 주요 Format 클래스는 다음과 같다.

Format 클래스설명
DecimalFormat숫자를 형식화된 문자열로 변환
SimpleDateFormat날짜를 형식화된 문자열로 변환

정규 표현식 클래스

문자열이 정해져 있는 형식으로 구성되어 있는지 검증해야 하는 경우가 있다.
자바는 정규 표현식을 이용해서 문자열이 올바르게 구성되어 있는지 검증한다.

정규 표현식 작성 방법

정규 표현식은 문자 또는 숫자와 관련된 표현과 반복 기호가 결합된 문자열이다.
다음은 정규 표현식을 구성하는 표현 및 기호에 대한 설명이다.

표현 및 기호설명
[]한개의 문자
\d한개의 숫자, [0-9]와 동일
\s공백
\w한 깨의 알파벳 또는 한 개의 숫자, [a-zA-Z_0-9] 와 동일
\..
.모든 문자 중 한 개의 문자
?없음 또는 한개
*없음 또는 한개 이상
+한 개 이상
{n}정확히 n개
{n, m}n개 부터 m개까지
a | ba 또는 b
()그룹핑

Patter 클래스로 검증

java.util.regex 패키지의 Pattern 클래스는 정규 표현식으로 문자열을 검증하는 matches() 메소드를 제공한다.
첫 번째 매개값은 정규 표현식이고, 두 번째 매개값은 검증할 문자열이다.
검증한 후의 결과는 boolean 타입으로 리턴된다.

boolean result = Pattern.matches("정규식", "검증할 문자열");

리플렉션

자바는 클래스와 인터페이스의 메타 정보를 Class 객체로 관리한다.
여기서 메타 정보란 패키지 정보, 타입 정보, 멤버(생성자, 필드, 메소드) 정보 등을 말한다. 이러한 메타 정보를 프로그램에서 읽고 수정하는 행위를 리플렉션이라고 한다.

프로그램에서 Class 객체를 얻으려면 다음 3가지 방법 중 하나를 이용하면 된다.

Class clazz = 클래스이름.class;
Class clazz = Class.forName("패키지..클래스이름");
Class clazz = 객체참조변수.getClass();

어노테이션

코드에서 @ 으로 작성되는 요소를 어노테이션이라고 한다. 어노테이션은 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인가를 알려주는 설정 정보이다.
어노테이션은 다음 세 가지 용도로 사용된다.

어노테이션 사용
1. 컴파일 시 사용하는 정보 전달
2. 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달
3. 실행 시 특정 기능을 처리할 때 사용하는 정보 전달

어노테이션 타입 정의와 사용

어노테이션도 하나의 타입이므로 어노테이션을 사용하기 위해서는 먼저 정의부터 해야 한다.

어노테이션을 정의하는 방법은 인터페이스를 정의하는 것과 유사하다.

다음과 같이 @interface 뒤에 사용할 어노테이션 이름이 온다.

public @interface AnnotationName {
}

이렇게 정의한 어노테이션은 코드에서 다음과 같이 사용된다.

@AnnotationName

어노테이션 속성

어노테이션은 속성을 가질 수 있다. 속성은 타입과 이름이 있으며 뒤에 괄호가 붙는다.
기본값을 가지는 경우 위에 default 키워드를 가진다.

public @interface AnnotationName {
	String prop1();
    int prop2()	default 1;
}
@AnnotationName(prop1="값");
@AnnotationName(prop1="값", prop2=3);

또한 기본 속성인 value 를 다음과 같이 가질 수 있다.

public @interface AnnotationName {
	String value();
}
@AnnotationName("값");

어노테이션 적용 대상

자바에서 어노테이션은 설정 정보라고 했다. 그렇다면 어떤 대상에 설정 정보를 적용할 것인지 명시해야 한다.
적용할 수 있는 대상의 종류는 ElementType 열거 상수로 정의되어 있다.

ElementType 열거 상수적용 요소
TYPE클래스, 인터페이스, 열거 타입
ANNOTATION_TYPE어노테이션
FIELD필드
CONSTRUCTOR생성자
METHOD메소드
LOCAL_VARIABLE로컬 변수
PACKAGE패키지

적용 대상을 지정할 때는 @Target 어노테이션을 사용한다.
@Target 의 기본 속성인 value는 ElementType 배열을 값으로 가진다. 이것은 적용 대상을 복수 개로 지정하기 위해서이다.

어노테이션 유지 정책

어노테이션을 정의할 때 한 가지 더 추가해야 될 내용은 @AnnotationName 을 언제까지 유지할 것인지를 지정하는 것이다.
어노테이션 유지 정책은 RetentionPolicy 열거 상수로 다음과 같이 정의 되어 있다.

RetentionPolicy어노테이션 적용 시점어노테이션 제거 시점
SOURCE컴파일 할 때 적용컴파일된 후에 제거됨
CLASS메모리로 로딩할 때 적용메모리로 로딩된 후에 제거됨
RUNTIME실행할 때 적용계속 유지됨

문제

  1. API 도큐먼트에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ 자바 표준 라이브러리를 프로그램에서 어떻게 사용할 수 있는지를 설명하고 있다.
    ➋클래스의상속관계및자식클래스들이무엇이있는지알수있다.
    ➌ 생성자 선언부, 필드의 타입, 메소드의 선언부를 확인할 수 있다.
    ➍ public, protected, default, private 접근 제한을 가지는 멤버들을 확인할 수 있다.
  • 답 : ➍
  1. java.base 모듈에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ 모든 표준 모듈이 의존하는 기본 모듈이다.
    ➋ 모듈 기술자에 requires를 하지 않아도 사용할 수 있는 모듈이다.
    ➌ java.base의 패키지에는 java.lang, java.util, java.io, java.net, java.sql 등이 있다. ➍ java.lang 패키지를 제외한 다른 패키지는 import 문을 필요로 한다.
  • 답 : ➌
  1. Object 클래스에 대한 설명 중 틀린 것은 무엇입니까?
    ➊ 모든 자바 클래스의 최상위 부모 클래스이다.
    ➋ Object의 equals ( ) 메소드는 == 연산자와 동일하게 번지를 비교한다.
    ➌ Object의 hashCode ( ) 메소드는 동등 비교 시 활용된다.
    ➍ Object의 toString ( ) 메소드는 객체의 필드값을 문자열로 리턴한다.
  • 답 : ➍
  1. 객체의 동등 비교를 위해 Object의 equals ( )와 hashCode ( ) 메소드를 오버라이딩했다고 가정할경우,메소드호출순서를생각하고다음 ( ) 안을채워보세요.
  • 답 :
hashCode
equals
  1. Object의 equals ( )와 hashCode ( ) 메소드를 오버라이딩해서 Student의 학번(studentNum ) 이 같으면 동등 객체가 될 수 있도록 Student 클래스를 작성해보세요(hashCode ( ) 메소드의 리턴 값은 studentNum 필드값으로 설정).
  • 답 :
@Override
public boolean equals(Object obj) {
    if (obj instanceof Student) {
        Student student = (Student) obj;
        if (studentNum.equals(student.getStudentNum())) {
            return true;
        }
    }
    return false;
}

@Override
public int hashCode() {
    return studentNum.hashCode();
}
  1. Member 클래스에서 Object의 toString ( ) 메소드를 오버라이딩해서 MemberExample 클래 스의 실행 결과처럼 나오도록 작성해보세요.
  • 답 :
@Override
public String toString() {
    return id + ": " + name;
}
  1. System 클래스에 대한 설명 중 틀린 것은 무엇입니까?
    ➊ System 클래스는 정적 필드와 정적 메소드만 제공한다.
    ➋ System.out은 콘솔에 출력할 때, System.in은 키보드에서 입력받을 때 사용한다.
    ➌ milisTime ( )과 nanoTime ( ) 메소드는 현재 시간에 대한 long값을 리턴한다.
    ➍ exit ( ) 메소드는 프로세스(JVM )를 종료시킨다.
  • 답 : ➌
  1. 다음 전체 코드를 실행하는 데 걸린 시간을 구하는 코드를 작성해보세요(단위 나노초).
  • 답 :
public class Main {
    public static void main(String[] args) {
        long startTime = System.nanoTime();
        int[] scores = new int[1000];
        for (int i = 0; i < scores.length; i++) {
            scores[i] = i;
        }
        int sum = 0;
        for (int score : scores) {
            sum += score;
        }
        double avg = (double) sum / scores.length;
        System.out.println(avg);
        System.out.println((System.nanoTime() - startTime) + " ns");
    }
}
  1. 다음 바이트 배열은 UTF-8 문자셋으로 인코딩한 데이터로, 다시 문자열로 디코딩해서 변수 data 에 저장하려고 합니다. 밑줄 친 곳에 들어갈 코드를 작성해보세요.
  • 답 :
new String(bytes, "UTF-8")
  1. 다음 코드는 1부터 100까지의 숫자를 통 문자열로 만들기 위해 += 연산자를 이용해 100번 반 복하고 있습니다. 이것은 곧 100개 이상의 String 객체를 생성하는 결과를 만들기 때문에 좋은 코 드라고 볼 수 없습니다. StringBuilder를 사용해서 좀 더 효율적인 코드로 개선해보세요.

  • 답 :
public class StringBuilderExample {
    public static void main(String[] args) {
        String str = "";
        StringBuilder sb = new StringBuilder();
        for (int i=1; i<=100; i++) {
            sb.append(i);
        }
        str = sb.toString();
        System.out.println(str);
    }
}
  1. 다음 문자열에서 쉼표(,)로 구분되어 있는 문자열을 StringTokenizer를 이용해서 분리시키고 출력해보세요.
아이디,이름,패스워드
  • 답 :
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
        String str = "아이디,이름,패스워드";
        StringTokenizer st = new StringTokenizer(str, ",");   
        while(st.hasMoreTokens()) {
            String token = st.nextToken();
            System.out.println(token);
        }
    }
}
  1. 숫자 100과 300으로 각각 박싱된 Integer 객체를 == 연산자로 비교한 결과 100을 박싱한 Integer 객체는 true가 나오지만, 300을 박싱한 Integer 객체는 false가 나왔습니다. 그 이유를 설 명하고, 값만 비교할 수 있도록 코드를 수정해보세요.
  • 답 : 포장 객체의 메모리 낭비를 줄이기 위헤 정수 타입에서는 -128 ~ 127 사이의 같은 값을 갖는 포장 객체의 번지는 공유된다. 해당 범위의 값을 갖는 포장 객체는 같은 번지수를 가지므로 ==, != 연산에서는 true 를 리턴하지만 obj3, obj4 에서는 값은 300으로 같은 값을 가지더라도 객체의 번지수가 다르기 때문에 ==, != 연산의 결과로 false 가 나온다.
public class IntegerCompareExample {
    public static void main(String[] args) {
        Integer obj1 = 100;
        Integer obj2 = 100;
        Integer obj3 = 300;
        Integer obj4 = 300;
        System.out.println(obj1.equals(obj2));
        System.out.println(obj3.equals(obj4));
    }
}
  1. Math 클래스가 제공하는 메소드의 리턴값이 잘못된 것은 무엇입니까?
    ➊ Math.ceil (5.3 ) -> 6.0
    ➋ Math.floor (5.3 ) -> 5.0
    ➌ Math.max (5.3, 2.5 ) -> 5.3
    ➍ Math.round (5.7 ) -> 6.0
  • 답 : ➍
  1. 난수를 얻는 방법을 잘못 설명한 것은 무엇입니까?
    ➊ Math.random ( ) 메소드는 0.0 <= ... < 1.0 사이의 실수 난수를 리턴한다.
    ➋ Random의 nextDouble ( ) 메소드는 0.0 <= ... < 1.0 사이의 실수 난수를 리턴한다.
    ➌ Random의 nextInt ( ) 메소드는 int 타입의 허용 범위에서 난수를 리턴한다.
    ➍ Random의 nextInt (int n ) 메소드는 0<= ... <=n 사이의 정수 난수를 리턴한다.
  • 답 : ➍
  1. 올해 12월 31일까지 몇 일이 남았는지를 구하는 코드를 작성해보세요.
  • 답 :
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class Main {
	public static void main(String[] args) {
		System.out.println(
    		LocalDateTime.now().until(
        		LocalDateTime.of(
            		LocalDateTime.now().getYear(), 
                	12, 
                	31, 
                	0, 
                	0, 
                	0
            	), 
            	ChronoUnit.DAYS
        	)
    	);
    }
}
  1. SimpleDateFormat 클래스를 이용해서 오늘 날짜를 다음과 같이 출력하도록 코드를 작성해 보세요.
xxxx년 xx월 xx일 x요일 xx시 xx분
  • 답 :
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {
    public static void main(String[] args) {
        System.out.println(new SimpleDateFormat("yyyy년 MM월 dd일 E요일 HH시 mm분").format(new Date()));
    }
}
  1. 정규 표현식을 이용해 첫 번째는 알파벳으로 시작하고 두 번째부터 숫자와 알파벳으로 구성된 8~12자 사이의 ID 값인지 검사하고 싶습니다. 알파벳은 대소문자를 모두 허용한다고 할 때, 다음 밑줄에 들어갈 코드를 작성해보세요.
  • 답 :
"[a-zA-Z][a-zA-Z0-9]{7,11}"
Pattern.matches(regExp, id)
  1. Class 객체에 대한 설명 중 틀린 것은 무엇입니까?
    ➊ Class.forName ( ) 메소드 또는 객체의 getClass ( ) 메소드로 얻을 수 있다.
    ➋패키지와클래스이름을알수있다.
    ➌ 클래스의 생성자, 필드, 메소드에 대한 정보를 알아낼 수 있다.
    ➍ getResource ( ) 메소드는 프로젝트 경로를 기준으로 리소스의 URL을 리턴한다.
  • 답 : ➍
  1. 어노테이션(Annotation)에 대한 설명 중 틀린 것은 무엇입니까?
    ➊ 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 역할을 한다.
    ➋ 클래스, 필드, 생성자, 메소드를 선언하기 전에 @어노테이션을 붙일 수 있다.
    ➌ @어노테이션(“*”)일 경우 value 속성값이 *가 된다.
    ➍ @어노테이션(“*”, prop=3 )일 경우 value 속성값은 *, prop 속성값은 3이 된다.
  • 답 : ➍
profile
사는게 쉽지가 않네요

0개의 댓글