패키지와 중첩클래스, 랩퍼클래스 각종 메서드
학습 목표
- 패키지(package)에 대해 설명할 수 있다.
- 접근 제한자의 사용에 대해 설명할 수 있다.
- 중첩 클래스(Nested Class)에 대해 설명할 수 있다.
- 랩퍼 클래스(Wrapper Class)의 사용에 대해 설명할 수 있다.
- 문자열 처리 메소드의 사용에 대해 설명할 수 있다.
- Scanner 클래스의 사용에 대해 설명할 수 있다.
- 시간에 관련된 메소드의 사용에 대해 설명할 수 있다.
- 수학에 관련된 메소드의 사용에 대해 설명할 수 있다.
학습 내용
패키지
패키지란?
클래스(class) 인터페이스(interface) 어노테이션(Annotation)을 한데 모아놓은것
하나의 패키지는 물리적으로는 하나의 폴더임
자바에는 많은 편리한 패키지가 준비되어 있음
사용자가 필요에 따라 패키지를 만들 수도 있음
JDK에서 제공하는 패키지는 C언어의 라이브러리에 해당함
패키지가 다르면 같은 클래스 이름도 구변됨
패키지 선언
인텔리제이에서는 해당 방법으로 패키지를 생성할 수 있음

패키지 임포트
패키지를 이용하려는 프로그램에서 import라는 키워드 뒤에 패키지명.클래스명 을 기술해서 사용.
인텔리제이 에서는 해당 클래스를 호출하면 자동으로 import가 기술된다.
임포트하면 패키지에 포함된 클래스와 인터페이스를 사용 가능
C언어에서의 #include 헤더파일과 유사함
ImportTest 패키지의 AHello class를 참조한 모습


접근 제한자
접근 제한자란?
클래스 및 멤버의 이용을 제한하거나 확장하기 위한 키워드
public protected private이 있고 멤머 앞에 붙임
어떤 키워드도 붙이지 않으면 디폴트라고 함
오브젝트 상속에 영향을 줌
class 앞에는 private 제한자를 사용하지 않음

public : 다른 패키지와 동일 클래스 안에서 모두 접근 가능
protected : 다른 패키지에서는 상속받은 클래스만 접근 가능
default : 다른 패키지에서 접근 불가
private : 동일 패키지에서도 접근 불가
중첩 클래스
중첩 클래스(Nested Class)란?
클래스 내부에서 클래스를 선언해서 사용하는 경우
한 곳에서만 사용되는 클래스를 논리적으로 그룹화 하는 방법임
클래스 안에 클래스를 숨김으로써(캡슐화 증가) 복잡한 클래스 간의 관련성을 감소시킬 수 있음 (서랍에 정리하듯이)
소스 코드의 가독성을 높이고 유지보수에 유리한 측면이 있음
밖의 클래스를 Outer class라 하고, 내포된 클래스는 Nested class 라고 함
중첩 클래스는 static 지정에 따라 non-static nested class와 static nested class로 나뉨
non-static nested class 는 inner class로 부름
c언어에서 구조체 안에 구조체가 있는 경우와 유사함
Non static 중첩 클래스(inner class)
outer 클래스의 객체를 먼저 생성한 후, 이 객체를 이용해서 inner 클래스의 객체를 생성해야 함

상속 관계가 아니므로 inner 클래스 오브젝트 생성 시 outer 클래스의 생성자는 호출되지 않음
non static 중첩 클래스 내부에서는 outer 클래스의 private 멤버도 접근할 수 있음

private int a의 값으 20으로 바뀌고 출력도 가능하다.
outer 클래스 오브젝트에서 outer클래스 오브젝트.inner클래스 오브젝트 멤버 형대로 접근할 수 없음
outer 클래스 오브젝트에서 inner 클래스의 멤버에 접근하기 위해서는 inner클래스의 오브젝트를 생성함
inner 클래스 오브젝트에서 outer 클래스의 어떤 멤버도 접근할 수 없음 (클래스 상에서는 메서드와 멤버에 접근 가능하지만 오브젝트에서는 outer 클래스의 멤버에 접근이 불가능하다는 뜻)
컴파일하면 outer class.class 와 outer class$inner class.class 파일이 생성됨

해당 방법을 사용하면 outer class 에서 inner class 의 메서드에 접근 가능하다.
static 중첩 클래스
중첩 클래스에서 내포된 inner 클래스에 static을을 붙인것
static inner 클래스는 outer 클래스의 오브젝트가 없어도 inner 클래스의 오브젝트를 생성할 수 있음
static inner 클래스에서 outer 클래스의 멤버에 접근하기 위해서는 outer 클래스의 멤버들도 static이어야 함
예제 1

methodia가 실행된다.
랩퍼 클래스(Wrapper Class)
랩퍼 클래스란?
변수를 감싸서 오브젝트로 취금함
자바는 기본 데이터형(정수형, 문자형, 논리형)에 대응하는 랩퍼 클래스가 있음
랩퍼 클래스의 오브젝트는 변수와 같이 사용할 수 있는데 여러 편리한 메소드를 갖고있음
기본 데이터 | byte | short | int | long | float | double | char | boolean |
랩퍼 클래스 | Byte | Short | Integer | Long | Float | Double | Character | Boolean |
수치형 랩퍼 클래스
수치형 랩퍼 클래스 Byte, Short, Integer, Long, Double에는 자료형을 반환할 수 있는 메소드를 갖고 있음

30인 Integer a를 double 형식으로 변경해줘 30.0이 출력된다. 이처럼 Wrapper Class를 활용하면 다양한 메소드를 활용할 수 있다.
램퍼 클래스의 오브젝트끼리 비교하기 위해서는 equals 메소드를 사용함
== 연산자를 사용하지 않는 이유
==
연산자는 두 개의 객체가 메모리 상에서 동일한 위치를 참조하는지를 확인하는 데 사용됩니다. 즉,==
연산자는 두 객체의 레퍼런스(참조)를 비교합니다.반면에
equals()
메서드는 두 개의 객체가 논리적으로 동등한지를 확인하는 데 사용됩니다. 객체의 내용을 기준으로 비교하며,equals()
메서드는Object
클래스에서 기본 구현되어 있으며, 이를 재정의하여 객체의 동등성을 비교하는 방식을 변경할 수 있습니다.래퍼 클래스의 경우,
==
연산자를 사용하여 두 객체를 비교하면 두 객체가 동일한 메모리 위치를 참조하는지를 확인합니다. 즉, 두 래퍼 클래스 객체의 레퍼런스(참조)가 같은지를 비교합니다.하지만 래퍼 클래스의 값을 비교하기 위해서는
equals()
메서드를 사용해야 합니다.equals()
메서드는 해당 래퍼 클래스의 값들을 비교하여 동등한지를 판단합니다. 예를 들어,Integer
클래스의 경우에는equals()
메서드가 두Integer
객체의 값을 비교합니다.따라서, 래퍼 클래스의 객체를 값의 비교를 위해 사용할 때는
equals()
메서드를 사용하는 것이 올바른 방법입니다.==
연산자는 두 객체의 레퍼런스를 비교하기 때문에 값의 비교에는 적합하지 않습니다.
문자열 반환
정수형 랩퍼 클래스에는 각각 문자열을 정수형으로 변환하는 메소드가 있음
영어 parse는 “문자 어구의 품사 및 문법적 관계를 분석한다.” 는 뜻을 말함
예시)

Auto boxing/Auto-unboxing
기본 데이터에서 랩퍼 클래스로 자동 변환되는 것을 오토박싱 이라고 함
랩퍼 클래스의 여러 멤버와 static 메소드를 활용할 수 있음
랩퍼 클래스에서 기본 데이터로 자동 변환되는 것을 오토 언박싱이라고 함
이 기능을 이용하면 형변환을 할 필요가 없음

문자열 처리 메소드
String 클래스의 메소드
문자열을 다루는 클래스
자바 컴파일러는 디폴트 패키지 java.lang.* 를 import
프로그램 상단에 import java.lang.String; 을 기술해도 되고 생략해도 됨
- 문자열의 길이를 구하는 length 메서드

result = 3
- 문자열의 일부를 추출하는 substring 메서드 (파이썬의 슬라이싱과 같다.)

result = CDE
- 문자열을 비교하는 compareTo 메서드(사전적으로 비교한다. a가 b보다 앞이면 음수, 같으면 0, 뒤면 양수를 반환한다.)

result = 3

result = -3 (유니코드로 비교했을때 첫번째로 다른 값을 return한다)
StringTokenizer 클래스의 메소드
문자열을 분할하는 클래스
토큰은 문법적으로 의미있는 최소의 문자열을 말함
프로그램 상단에 import java.util.StringTokenizer;를 기술함
- StringTokenizer 생성자
- 토큰을 확인하는 hasMoreTokens()
- 토큰을 차례대로 가져오는 nextToken()

StringTokenizer 생성자로 인해 토큰이 나눠져서 출력되는 모습. 파이썬 split 함수와 비슷하지만 List 형식으로 반환하는 것이 아닌 임시적으로 토큰 형식을 반환한다는 점에서 다르다
반복문에서 hasMoreTokens 메서드를 사용해서 토큰의 유무를 확인하고 String token에 a에 임시로 할당되어 있는 토큰을 대입해주고 출력한다. 여기서 사용된 토큰은 사라진다
Scanner 클래스
해당 클래스는 키보드로 부터 데이터를 입력받을 때 사용
서로 다른 데이터 형식을 지원하며 일련의 데이터를 리스트 형태로 입력받음
Scanner 클래스의 주요 메소드
메소드 명 | 동작 | 사용방법 |
close | 닫는다. | Scanner sc = new Scanner(System.in); sc.close() |
next | 입력값을 String형으로 가져온다. | Scanner sc = new Scanner(System.in); String text = sc.next(); |
nextInt | 입력값은 int 형으로 가져온다. | Scanner sc = new Scanner(System.in); int num = sc.nextInt(); |
hasNext | 다음에 가져올 수 있는 String이 있는지 조사한다. | Scanner sc = new Scanner(System.in); boolean b = sc.hasNext(); |
hasNextInt | 다음에 가져올 수 있는 int 가 있는지 조사한다. | Scanner sc = new Scanner(System.in); boolean b = sc.hasNextInt(); |

시간에 관련된 메소드
현재 일시는 System 클래스의 메서드를 사용함
date 클래스, Calendar 클래스를 사용하면 연 월 일 요일 시 분 초 를 구할 수 있음
표준시로부터 현재 시각을 구하는 currentTimeMillis() 메서드
시작 시점으로부터 밀리초 단위로 값을 구함
시차가 고려되지 않음
그리니치 표준시로 1970년부터 현재까지 경과한 시간을 long 형으로 반환
Date 클래스를 사용해서 표준시를 현재 시각으로 변환
인수가 없는 경우 현재의 시각을 구함
Calendar 클래스
일반 달력으로 변환하기 위해서는 Calendar 클래스의 서브 클래스의 GregorianCaalendar 클래스를 사용
GregorianCaalendar 클래스의 주요 필드

GregorianCaalendar 클래스의 주요 메서드

예시

수학에 관련된 메소드
Math 클래스는 기본적인 수치연산과 지수 로그 제곱근 삼각함수 등을 포함하고 있음
static 메소드로 이루어짐
abs max min 메소드의 인수와 반환값의 자료형을 동일함

sin cos tan 삼각함수는 각도를 라디안 값으로 사용함
각도 변환은 다음 메소드를 사용함

난수 생성
난수를 생성하기 위해서는 random 메서드를 사용함
Math 클래스의 필드

