CHAPTER 06 모듈과 패키지 개념, 자바 기본 패키지
6.1 패키지(Package)
6.2 import와 클래스 경로
6.3 패키지 만들기
6.4 모듈 개념
6.5 자바 JDK에서 제공하는 패키지
6.6 Object 클래스
6.7 Wrapper 클래스
6.8 String 클래스
6.9 StringBuffer 클래스
6.10 StringTokenizer 클래스
6.11 Math 클래스
6.12 Calendar 클래스
java.util.Scanner scanner = new java.util.Scanner(System.in);import java.util.Scanner;import java.util.*;* 는 현재 패키지 내의 클래스만을 의미하며 하위 패키지의 클래스까지 포함하지 않는다package 패키지명;package UI; // Tools 이라는 클래스를 컴파일 하여, UI 패키지에 저장힐 것을 지시
public class Tools { //이제 이 클래스의 경로명은 UI.Tools 가 된다.
...
} //Tools 클래스는 패키지 UI에 속하게 된다.import UI.Toolspackage Graphic; //Line 클래스를 Graphic 패키지에 저장
import UI.Tools; //UI 패키지에 있는 Tools 클래스를 사용하기 위하여, Tools 클래스의 경로명 포함 시킴
public class Line {
public void draw() {
Tools t = new Tools();
}
} // Line 클래스는 패키지 Graphic 에 속하게 된다.package lib; //패키지 lib 에 소속됨을 알려주는 코드, 이클립스에서는 자동 추가됨
//반드시 public 이여야 함 : 다른 패키지(app 패키지 클래스)에서 접근할 수 있도록 하기 위해서
//생략되어 있으면 같은 패키지에서만 접근 가능
public abstract class Calculator {
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int [] a);
}
package app; //패키지 app에 소속됨을 알려주는 코드
import lib.Calculator; //lib 패키지의 Calculator 클래스를 사용하기 위해
//패키지를 포함하는 정확한 경로명을 컴파일러에게 알려줘야 함.
public class GoodCalc extends Calculator { //public 설정 확인
@Override
public int add(int a, int b) { //추상 메소드 구현
return a+b;
}
@Override
public int subtract(int a, int b) { //추상 메소드 구현
return a-b;
}
@Override
public double average(int[] a) { //추상 메소드 구현
double sum = 0;
for (int i=0; i<a.length; i++)
sum += a[i];
return sum/a.length;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
GoodCalc c = new GoodCalc();
System.out.println(c.add(2, 3));
System.out.println(c.subtract(2, 3));
System.out.println(c.average(new int [] {2, 3, 4}));
}
}
// 프로젝트 PackageEx 실행 결과
5
-1
3.0

jmod extract "C:\Program Files\Java\jdk-11.0.6\jmods\java.base.jmod "

특징
주요 메소드
| 메소드 | 설명 |
|---|---|
boolean equals(Object obj) | obj가 가리키는 객체와 현재 객체를 비교하여 같은 true 리턴 |
Class getClass() | 현 객체의 런타임 클래스를 리턴 |
int hashCode() | 현 객체에 대한 해시 코드 값 리턴 |
String toString() | 현 객체에 대한 문자열 표현을 리턴 (매우 중요) 객체를 문자열로 반환 |
class Point {
int x, y;
public Point(int x, int y) {
this.x = x; //지역 변수 x 값을 필드 변수 this.x 에 할당
this.y = y;
}
}
public class ObjectPropertyEx {
public static void print(Object obj) { //print 메소드
System.out.println(obj.getClass().getName()); // obj로 관리하는 클래스의 이름
System.out.println(obj.hashCode()); //obj로 관리하는 해시 코드 값을 10진수로 리턴
System.out.println(obj.toString()); // obj로 관리하는 객체를 문자열로 만들어 출력
//반환되는 문자열 : 클래스이름@객체의 해시코드값
System.out.println(obj); //클래스 객체 출력 -> obj 만 쓰면 obj.toString() 으로 자동 변환된다.
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Point p = new Point(2,3);
print(p); //p 는 눈에 보이지 않게 Object 를 상속 받은 상태 이므로
// print 가 호출되면서 print(Object obj) 에서 Object 클래스의 참조변수 obj 업캐스팅?
// -> Object obj = p 로 해석하면 된다. (업캐스팅 발생)
System.out.println();
print(p.toString());
}
}
//result
Point
1940447180
Point@73a8dfcc
Point@73a8dfcc
// -> object 만 쓴것과 toStirng 을 쓴것의 결과는 동일
java.lang.String
1756111749
Point@73a8dfcc
Point@73a8dfcc
클래스 이름 @ 객체의 hash codepublic String toString {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
} Point p = new Point(2,3);
System.out.println(p);
String s = p + "점";
//----> 자동 변환
System.out.println(p.toString());
String s = p.toString() + "점";
//----> 결과 : Point@c17164점 개발자는 자신만의 toString() 작성 필요 : Object 의 toString() 오버라이딩
class Point {
int x, y;
public Point(int x, int y) {
this.x= x;
this.y= y;
}
//Poin 객체 정보를 문자열로 리턴하는 toString() 오버로딩 코드 작성
public String toString() {
return "Point(" + x + "," + y + ")";
} //toString() 오버로딩 함!!
}
public class ToStringEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
Point p = new Point(2,3);
System.out.println(p.toString());
System.out.println(p); // p 는 p.toString() 으로 자동 변환
System.out.println("This is " + p + ". "); //"This is" + p.toString() 로 자동 변환
}
}
//result
Point(2,3)
Point(2,3)
This is Point(2,3).
a == b
a.eqauls(b) 
class Rect {
int width;
int height;
public Rect(int width, int height) {
this.width = width;
this.height = height;
}
public boolean equals(Object obj) { //첫번쨰 실행에서 Object obj = b 가 됨. (업캐스팅 발생)
Rect p = (Rect)obj; //밑에 영역도 사용하기위해 (다운 캐스팅) -> 즉 p 가 자식 영역을 접근할 수 있게 됨.
//(실제 b로 관리하는 영역에 접근할 수 있는것임)
if(width*height == p.width*p.height) { //a 소속 width, height , b의 소속 p.width p.height
return true;
}
else
return false;
}
}
public class EqualsExTwo {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 객체 a, b, c 가 각각 관리하는 width, height
Rect a = new Rect(2,3);
Rect b = new Rect(3,2);
Rect c = new Rect(3,4);
//해시코드 값을 비교하는것이 아니라 equals 로 width, height 값을 비교
if(a.equals(b)) //a 로 접근할 수 있는 공간에 eqauls 메소드 호출 -> a의 this 활성화
System.out.println("a is equals to b");
if(a.equals(c))
System.out.println("a is equals to c");
if(b.equals(c))
System.out.println("b is equals to c");
}
}
//result
a is equals to b
int, double 등의 기본 데이터 타입은 클래스가 아니다.
자바 기본 데이터 타입을 클래스화한 8개 클래스 - 스트링은 자체가 클래스 타입이니까 포함 x
| 기본 타입 | byte | short | int | long | char | float | double |
|---|---|---|---|---|---|---|---|
| Wrapper 클래스 | Byte | Short | Integer | Long | Character | Float | Double |
용도
// 기본 타입의 값으로 Wrapper 객체 생성
Integer i = Integer.valueOf(10); 1
Character c = Character.valueOf('c');
Double f = Double.valueOf(3.14);
Boolean b = Boolean.valueOf(true);
// 문자열로 Wrapper 객체 생성
Integer i = Integer.valueOf("10");
Double d = Double.valueOf("3.14");
Boolean b = Boolean.valueOf("false");
// Float 객체는 double 타입의 값으로 생성 가능
Float f = Float.valueOf((double)3.14);
Wrapper 객체들은 거의 유사, 많은 메소드가 static 타입
static 으로 선언된 메소드는 객체를 생성하지 않아도 바로 호출 가능
Integer 클래스의 주요 메소드
| 메소드 | 설명 |
|---|---|
| static int bitCount(int i) | 정수 i의 이진수 표현에서 1의 개수 리턴 |
| float floatValue() | float 타입으로 값 리턴 |
| int intValue() | int 타입으로 값 리턴 |
| long longValue() | long 타입으로 값 리턴 |
| short shortValue() | short 타입으로 값 리턴 |
| static int parseInt(String s) | 문자열 s를 10진 정수로 변환한 값 리턴 |
| static int parseInt(String s, int radix) | 문자열 s를 지정된 진법의 정수로 변환한 값 리턴 |
| static String toBinaryString(int i) | 정수 i를 이진수 표현으로 변환한 문자열 리턴 |
| static String toHexString(int i) | 정수 i를 16진수 표현으로 변환한 문자열 리턴 |
| static String toOctalString(int i) | 정수 i를 8진수 표현으로 변환한 문자열 리턴 |
| static String toString(int i) | 정수 i를 문자열로 변환하여 리턴 |
| static Integer valueOf(int i) | 정수 i를 담은 Integer 객체 리턴 |
| static Integer valueOf(Strinbg s) | 문자열 s를 정수로 변환하여 담고 있는 Integer 객체 리턴 |
//Wrapper 객체로부터 기본 데이터 타입 알아내기
Integer i = Integer.valueOf(10);
int ii = i.intValue(); //ii = 10;
Character c = Character.valueOf('c');
char cc = c.charValue(); //cc = 'c'
Double d = Double.valueOf(3.14);
double dd = d.doubleValue(); //dd = 3.14
Boolean b = Boolean.valueOf(true);
boolean bb = b.booleanValue(); //bb = true
//믄자열을 기본 데이터 타입으로 변환
int i = Integer.parseInt("123"); //i = 123, 객체 생성하지 않고 메소드 호출하여 사용 함
boolean b = Boolean.parseBoolean("true"); //b = true
float f = Float.parseFloat("3.141592"); //f = 3.141592
//기본 데이터 타입을 문자열로 변환
String s1 = Integer.toString(123); //정수 123을 문자열 객체 "123" 으로 변환
String s2 = Integer.toHexString(123); //정수 123을 16진수의 문자열 객체 "7b"로 변환
String s3 = Double.toString(3.14); //실수 3.14를 문자열 객체"3.14"로 변환
String s4 = Character.toString('a'); //문자 'a' 를 문자열 객체 "a"로 변환
String s5 = Boolean.toString(true); //불린 값 true 를 문자열 객체 "true"로 변환
public class WrapperEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Character.toLowerCase('A')); //A 를 소문자로 변환
char c1='4', c2='F';
if(Character.isDigit(c1)) //문자 c1 이 숫자이면 true
System.out.println(c1 + "is a number. ");
if(Character.isAlphabetic(c2)) //문자 c2 가 영문자이면 true
System.out.println(c2 + "is an alphabetical letter. ");
System.out.println(Integer.parseInt("-123")); //"-123" 을 10진수로 변환
System.out.println(Integer.toHexString(28)); //정수 28을 16진수 문자열로 변환
System.out.println(Integer.toBinaryString(28)); //정수 28을 2진수 문자열로 변환
System.out.println(Integer.bitCount(28)); //정수 28을 2진수 표현에서 1의 개수 : 3개
Double d = Double.valueOf(3.14);
System.out.println(d.toString()); // Double을 문자열 "3.14" 로 변환
System.out.println(Double.parseDouble("3.14")); // 문자열을 실수 3.14 로 변환
boolean b = (4>3); // b 는 true
System.out.println(Boolean.toString(b)); // true 를 문자열 "true" 로 변환
System.out.println(Boolean.parseBoolean("false")); //문자열을 false 불린 값으로 변환
}
}
//result
a
4is a number.
Fis an alphabetical letter.
-123
1c
11100
3
3.14
3.14
true
false

// 자동 박싱, 기존 Integer ten = Integer.valueOf(10); 로 자동처리
Integer ten = 10;
// 자동 언박싱, 기존 int n = ten.intValue( ); 로 자동처리
int n = ten;
public class AutoBoxingUnBoxing {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 10;
Integer intObject = n; //자동 박싱 : Integer intObject = Integer.valueOf(n);
System.out.println("intObject = " + intObject); //value 인 10이 나왔음
int m = intObject + 10; // 자동 언박싱 : int m = intObject.intValue()
System.out.println("m = " + m);
}
}
//result
intObject = 10
m = 20
String 클래스는 하나의 문자열 표현
// 스트링 리터럴로 스트링 객체 생성
String str1 = "abcd";
// String 클래스의 생성자를 이용하여 스트링 생성
char data[] = {'a', 'b', 'c', 'd'}; //-> 원래는 문장의 끝을 알리는 null 이 있다.(이 교재는 x)
String str2 = new String(data);
String str3 = new String("abcd"); //실질적으로 이 형태로 변환됨
//str2와 str3은 모두 “abcd” 스트링{의미가 조금 다름→ 다음 페이지 확인!}
String 생성자
| 생성자 | 설명 |
|---|---|
| String() | 빈 스트링 객체 생성 |
| String(char[] value) | char 배열에 있는 문자들을 스트링 객체로 생성 |
| String(String original) | 매개변수로 주어진 문자열과 동일한 스트링 객체 생성 |
| String(StringBuffer buffer) | 매개변수로 주어진 스트링 버퍼의 문자열을 스트링 객체로 생성 |
//JVM 의 스트링 리터럴 테이블
String a = "Hello"; //리터럴로 생성 -> 응용프로그램 내에서 공유됨
String b = "Java";
String c = "Hello";
//힙 메모리
String d = new String("Hello") //String 객체로 생성
String e = new String("Java")
String f = new String("Java") 
String s = new String("Hello");
String t = s.concat("Java"); //스트링 s에 "Java"를 덧붙인 새로운 스트링 객체 리턴

String java = "java";
String cpp = "C++";
int res = java.compareTo(cpp);
if(res == 0)
System.out.println("the same");
else if(res < 0)
System.out.println(java + "<" + cpp);
else
System.out.println(java + ">" + cpp);
//result
java>C++
[주의] 비교 연산자 == 는 문자열 비교에는 사용할 수 없음eqauls() vs compareTo() 차이점
- equals()
- 비교 대상 문자열이 동일하면 true, 다르면 false 리턴
- compareTo()
- 비교 대상 문자열이 동일하면 0 리턴,
- 문자열이 다르다면
- 사전에 먼저 나오면 음수 리턴
- 사전에 나중에 나오면 양수 리턴
System.out.print("abcd" + 1 + true + 3.13e-2 + 'E' + "fgh");
//abcd1true0.0313Efgh 출력"I love ".concat("Java"); //는 "I love Java." 리턴기존 String 객체에 연결되지 않고 새로운 스트링 객체 생성 리턴
String s1 = "abcd";
String s2 = "efgh";
s1 = s1.concat(s2);
문자열 리터럴은 그 자체의 변형이 있으면 안되기 때문에 새로운 문자열 리터럴이 만들어졌고 새롭게 만들어진 내용을 s1 이라는 참조 변수가 관리를 해주는것임 -> abcdefgh (문자열 스트링 영역)

String a = " abcd def "; //tab 키를 활용하여, 공백을 표현함
String b = " xyz\t";
String c = a.trim(); //c = "abcd def". 문자열 중간에 있는 공백은 제거되지 않음
string d = b.trim(); //d = "xyz". 스페이스와 '\t' (탭키를 정확히 표현) 제거됨// "class" 에 포함된 's' 의 개수를 세는 코드
int count = 0
String a = "class";
for(int i=0; i<a.length(); i++){ //a.length() 는 5
if(a.charAt(i) == 's')
count++;
}
System.out.println(count); //2 출력//기말고사 나올 확률 매우 높은 코드
public class StringEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = new String(" C#"); // c# 앞의 빈공간 있음
String b = new String(",C++");
System.out.println("The length of" + a + "is: " + a.length()); //문자열 길이(문자개수) 3이 화면에 네보내짐.
System.out.println(a.contains("#")); //문자열의 포함 관계 (# 기호가 a 에 포함되어 있는지 -> true)
a = a.concat(b); //문자열 연결 (a 에 소속되어있는 concat 메소드 사용 - a 뒤에 b 내용 추가)
//a.concat(b); 이렇게 하고 a 를 출력하면 어떻게 나오는지 꼭 검증
System.out.println(a); // 다음과 같이 빈공간이 잘 출력됨
a = a.trim(); //문자열 앞 뒤의 공백 제거 -> 메모리가 새로 생성이 됨 그리고 그 주소를 해시값을 참조변수 a 에 줌, a는 이전정보는 관리를 못하고 새로운 공간 관리
System.out.println(a); .
a = a.replace("C#", "Java"); //문자열 대치 (이것 역시 새로운 메모리가 만들어지고 참조변수 할당)
System.out.println(a);
//엄청많이쓰는것
String s[] = a.split(","); //문자열 분리 - 쉼표(,)를 통해 쪼개어 문자열로 관리 그래서 배열 표현 s[] 이 온것
//그럼 쉼표로 인해 s[0], s[1] 로 관리가 됨
for(int i=0; i<s.length; i++) //분리된 문자열0 : java, 분리된 문자열1 : C++
System.out.println("Separated strings_" + i + ":" + s[i]);
a = a.substring(5); //인덱스 5 부터 끝까지 서브스트링 리턴 (a 로 관리되는 문자열의 5번 인덱스부터 끝까지 잘라낸 문자열 생성
// 인자가 2개 올떄의 의미도 나중에 찾아서 공부해보자 substring( , )
System.out.println(a);
char c = a.charAt(2); //인덱스 2의 문자 리턴 a(a로 관리되는 문자열의 인덱스 2번의 문자 상수를 리턴한다. 리턴된 문자륾 문자 상수 c 에 할당.
System.out.println(c);
}
}
//result
The length of C#is: 3
true
C#,C++
C#,C++
Java,C++
Separated strings_0:Java
Separated strings_1:C++
C++
+
가변 크기의 문자열 저장 클래스
생성 : StringBuffer sb = new StringBuffer("Java");

주요 메소드

StringBuffer의 메소드 활용 예
public class StringBufferEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer("This"); //디폴트 16칸 공간에 초깃값 This 정보를 참조변수 sb 가 관리
//(기존에는 this 라는 pencil 이라는 메모리 영역이만들어지고 붙여졌지고 새로운 메모리 공간으로 관리했는데-> 편리함)
sb.append(" is pencil"); //뒤에 문자열 덧붙이기
System.out.println(sb);
sb.insert(7, " my"); //"my" 문자열 삽입
System.out.println(sb);
sb.replace(8, 10, "your"); //"my"를 "your" 로 변경 (8번 위치부터 10번 까지x 10번 앞까지)
System.out.println(sb);
sb.delete(8, 13); //"your" 삭제 (13번 직전까지 삭제해라 : ,8~12 까지 삭제)
System.out.println(sb);
sb.setLength(4); //스트링 버퍼 내 문자열 길이 수정 (4칸까지만 메모리를 사용하겠다 -> 뒤에 내용 날라감)
System.out.println(sb); //sb.toString() 으로 자동 바뀜
}
}
//result
This is pencil
This is my pencil
This is your pencil
This is pencil
This
java.util.StringTokenizer
//배열표현으로 한다, 이 예시에서 '&' 가 구분 문자
String query = "name=kitae&addr=seoul&age=21";
//StringTokenizer 객체 생성과 문자열 파싱
StringTokenizer st = new StringTokenizer(query, "&"); // 구분 문자 '&'
StringTokenizer st = new StringTokenizer(query, "&="); // 구분 문자 '&' 와 '='토큰 : 구분 문자로 분리된 스트링
String 클래스의 splite() 메소드를 이용하여 동일한 구현 가능
생성자

주요 메소드

import java.util.StringTokenizer;
public class StringTokenizerEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 슬래시(/) 와 띄어쓰기( ) 를 하면 다음과 같이 출력
// 만역 그냥 슬래시만 구분 문자로 한다면
// Hong Gildong 으로 출력됨 (공백 문자로 자르지 않는다!)
StringTokenizer st = new StringTokenizer("Hong Gildong/Jianghua/Hongryeon/Kongji/Pattzzi", "/ ");
// st 로 관리하고 있는 공간에서 hasMoreTokens() 는 현재 st 로 관리하는 메모리 영역에서 토근이 있는지를 확인한다.
// st.nextToken() : 현재 내부 정보를 아직 사용한 적이 없으므로, nextToken 의 의미는
// st 로 관리하는 메모리 영역에 진입하여 첫번쨰 토근 값을 리턴하라는 의미이다. 따라서 문자열 홍길동이 리턴
// 현재 홍길동 토큰까지 이용했다는 내부적인 인덱스 정보가 보관되어있는 상태
// 이때 nextToken 의 의미는 홍길동 다음의 토근을 리턴하라는 이미
// 따라서 문자열 장화가 리턴되어 화면에 출력
// 그리고 두번재 토큰이 이용되었음을 알려주는 내부적인 인덱스가 "홍련"으로 이동
// 다시 while 문으로 이동
// 이 과정 반복 후 나를 기준으로 팥쥐 이후에도 토큰이 있는지 확인하고 없으면 false 리턴 후 탈출
while(st.hasMoreTokens())
System.out.println(st.nextToken());
}
//result
Hong
Gildong
Jianghua
Hongryeon
Kongji
Pattzzi
java.lang.Math기본적인 산술 연산을 수행하는 메소드 제공
모든 멤버 메소드는 static 으로 정의됨: 클래스 이름으로 바로 호출해서 사용 가능
| 메소드 | 설명 |
|---|---|
| static double abs(double a) | 실수 a의 절댓값 리턴 |
| static double cos(double a) | 실수 a의 cosine 리턴 |
| static double sin(double a) | 실수 a의 sin 리턴 |
| static double tan(double a) | 실수 a의 tan 리턴 |
| static double exp(double a) | 값 리턴 |
| static double ceil(double a) | 올림, 실수 a보다 크거나 같은 수 중에서 가장 작은 정수를 실수 타입으로 리턴 |
| static double floor(double a) | 내림, 실수 a보다 작거나 같은 수 중에서 가장 큰 정수를 실수 타입으로 리턴 |
| static double max(double a, double b) | 두 수 a,b 중에서 큰 수 리턴 |
| static double min(double a, double b) | 두 수 a,b 중에서 작은 수 리턴 |
| static double random() | 0.0 보다 크거나 같고 1.0 보다 작은 임의의 실수 리턴 |
| static long round(double a) | 반올림. 실수 a를 소수 첫째 자리에서 반올림한 정수를 long 타입으로 변환 |
| static double sqrt(double a) | 실수 a의 제곱근 리턴 |
static double random()for(int x=0; x<10; x++) {
int n = (int)(Math.random()*100 + 1); // n은 [1~100] 사이의 랜덤 정수
System.out.println(n);
}Math.random()*100 은 사이의 실수 리턴Math.random()*100+1 은 사이의 실수 값(int)(Math.random()*100 + 1) 는 소수점이하를 제거하여 사이의 정수 값public class MathEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(Math.PI); //원주율 상수 출력
System.out.println(Math.ceil(3.14)); //ceil(올림)
System.out.println(Math.floor(3.14)); //floor(내림)
System.out.println(Math.sqrt(9)); //제곱근
System.out.println(Math.exp(2)); //e의 2제곱
System.out.println(Math.round(3.14)); //반올림 -> 얘는 정수로 나오고 위에 것들은 실수가 나온다 (꼭 구별)
// [1, 45] 사이의 정수형 난수 5개 발생
System.out.print("This week's lucky number: ");
for(int i=0; i<5; i++)
System.out.print((int)(Math.random()*45 + 1)+ " ");
}
}
//result
3.141592653589793
4.0
3.0
3.0
7.38905609893065
3
This week's lucky number: 18 37 37 23 43
| 필드 | 의미 | 필드 | 의미 |
|---|---|---|---|
| YEAR | 년도 | DAY_OF_MONTH | 한 달의 날짜 |
| MONTH | 달(0~11) | DAY_OF_WEEK | 한 주의 요일 |
| HOUR | 시간(0~11) | AM_PM | 오전인지 오후인지 구분 |
| HOUR_OF_DAY | 24시간을 기준으로 한 시간 | MINUTE | 분 |
| SECOND | 초 | MULLISECOND | 밀리초 |
int year = now.get(Calendar.YEAR); //now 에 저장된 년도
int month = now.get(Calendar.MONTH)+1; //now 에 저장된 달Calendar 객체에 날짜와 시간을 설정한다고 해서 컴퓨터의 날짜와 시간을 바꾸진 못함
컴퓨터의 시간과 날짜를 바꾸는 다른 방법 이용 set
//이성 친구와 처음으로 데이트한 날짜와 시간 저장
Calendar firstDate = Calendar.getInstance();
firstDate.clear(); //현재 날짜와 시간 정보를 모두 지운다.
firstDate.set(2016, 11, 25) //2016년 12월 25일. 12월은 11로 설정
firstDate.set(Calendar.HOUR_OF_DAY, 20); //저녁 8시로 설정
firstDate.set(Calendar.MINUTE, 30); //30분으로 설정
시간 정보를 어떻게 사용하는지만 알아두고 이 코드를 외우지 않아도 됨
0~11로 표현하는것, 시간정보를 얻어오는것, 시간정보 클리어하는거
import java.util.Calendar;
public class CalendarEx {
public static void printCalendar(String msg, Calendar cal) {
int year = cal.get(Calendar.YEAR);
// month는 0~11값을 갖기 때문에 + 1을 수행함.
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
int hour = cal.get(Calendar.HOUR);
int hourOfDay = cal.get(Calendar.HOUR_OF_DAY);
int ampm = cal.get(Calendar.AM_PM);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
int millisecond = cal.get(Calendar.MILLISECOND);
System.out.print(msg + year + "/" + month + "/" + day + "/");
switch(dayOfWeek) {
case Calendar.SUNDAY : System.out.print("Sunday"); break;
case Calendar.MONDAY : System.out.print("Monday"); break;
case Calendar.TUESDAY : System.out.print("Tuesday"); break;
case Calendar.WEDNESDAY : System.out.print("Wednesday"); break; case Calendar.THURSDAY : System.out.print("Thursday"); break; case Calendar.FRIDAY: System.out.print("Friday"); break;
case Calendar.SATURDAY : System.out.print("Saturday"); break;
}
System.out.print("(" + hourOfDay + " o'clock)");
if(ampm == Calendar.AM)
System.out.print(" AM ");
else
System.out.print(" PM ");
System.out.println(hour + ":" + minute + ":" + second + " and " + millisecond +" milliseconds.");
}
// 다음 페이지에 main( ) 메소드
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
printCalendar("The current time: ", now);
Calendar firstDate = Calendar.getInstance();
firstDate.clear();
// 2016년 12월 25일. 12월을 표현하기 위해 month에 11로 설정
firstDate.set(2016, 11, 25);
firstDate.set(Calendar.HOUR_OF_DAY, 20); // 저녁 8시
firstDate.set(Calendar.MINUTE, 30); // 30분
printCalendar("The day of your first date: ", firstDate);
}
}
// 11 은 12 월. 달력은 0부터 11 로 표현한다.
//result
The current time: 2023/5/4/Thursday(19 o'clock) PM 7:8:37 and 469 milliseconds.
The day of your first date: 2016/12/25/Sunday(20 o'clock) PM 8:30:0 and 0 milliseconds.