패키지
자바 패키지
패키지
3명이 분담하여 자바 응용프로그램을 개발하는 경우, 동일한 이름의 클래스가 존재할 가능성 있음
- 합칠때오류발생가능성
- 개발자가 서로 다른 디렉터리로 코드 관리하여 해결 (이름은 같지만 경로가 다르면 다른파일로 취급)
자바패키지
패키지(package)
- 서로 관련된 클래스와 인터페이스를 컴파일한 클래스 파일들을 묶어 놓은 디렉터리
- 하나의 응용프로그램은 한 개 이상의 패키지로 작성
- 패키지는 jar 파일로 압축할 수 있음: JDK에서 제공하는 표준 패키지는 rt.jar에 압축
자바 모듈
- 모듈(module)
- 여러패키지와이미지등의자원을모아놓은컨테이너
- 하나의 모듈을 하나의 .jmod 파일에 저장
-
Java 9부터 자바 API를 여러 모듈(99개)로 분할
- Java 8까지는 rt.jar의 한 파일에 모든 API 저장
-
Java 9부터 모듈화 도입
- 플랫폼의 모듈화 : Java 9부터 자바 API의 모든 클래스들(자바 실행 환경)을 패키지 기반에서 모듈들로 완전히 재구성
- 응용프로그램의 모듈화 : 클래스들은 패키지로 만들고, 다시 패키지를 모듈로 만듦
-
응용프로그램이 실행할 때 꼭 필요한 모듈들로만 실행 환경 구축
- 메모리자원이 열악한 작은 소형기기에 꼭 필요한 모듈로 구성된 작은 크기의 실행 이미지를 만들기 위함
자바 JDK에 제공하는 모듈 파일들
- jmods 디렉터리 구성 요소
- .jmod 확장자를 가진 파일
- jdk10의 경우 99개 모듈파일
- 모듈 파일은 ZIP포맷으로 압축된 파일
- 모듈 파일에는 자바 API의 패키지와 클래스들이 들어 있음
- jmod 명령을 이용하여 모듈 파일에 들어 있는 패키지를 풀어 낼 수 있음
java.base.jmode 파일
java.base.jmode 파일을 풀면 다음과 같이 java.base 모듈에 있는 패키지 와 클래스를 볼 수 있다.
패키지 사용하기, import문
다른 패키지에 작성된 클래스 사용
- import를 이용하지 않는 경우, 소스에 클래스 이름의 완전 경로명 사용
public class ImportExample {
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
}
}
필요한 클래스만 import
- 소스 시작 부분에 클래스의 경로명 import
- import 패키지.클래스
- 소스에는 클래스 명만 명시하면 됨
import java.util.Scanner;
public class ImportExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
패키지 전체를 import
- 소스 시작 부분에 패키지의 경로명.* import
- 소스에는 클래스 명만 명시하면 됨
- java.util 패키지 내의 모든 클래스만을 지정, 하위 패키지의 클래스는 포함하지 않음
import java.util.*;
public class ImportExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
패키지 만들기
- 클래스 파일(.class)이 저장되는 위치는?
- 클래스나 인터페이스가 컴파일되면 클래스 파일(.class) 생성
- 클래스 파일은 패키지로 선언된 디렉터리에 저장
- 패키지 선언
- 소스파일의맨앞에컴파일후저장될패키지지정
- package 패키지명;
package Graphic; // 아래 Line 클래스를 Graphic 패키지에 저장
import UI.Tools; // UI.Tools 클래스의 경로명 임포트
public class Line extends Shape {
public void draw() {
Tools = new Tools();
}
}
디폴트 패키지
package 선언문이 없는 자바 소스 파일의 경우
- 컴파일러는 클래스나 인터페이스를 디폴트 패키지에 소속시킴
- 디폴트 패키지 : 현재 디렉터리
이클립스로 쉽게 패키지 만들기
abstract class Calculator { //lib 패키지에
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
class GoodCalc extends Calculator { //app 패키지에
public int add(int a, int b) {
return a+b;
}
public int subtract(int a, int b) { return a - b;
}
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) {
Calculator 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 }));
}
}
Calculator 클래스는 lib 패키지에 GoodCalc 클래스는 app 패키지에 나누어 저장하는 응용프로그램을 이클립스를 이용하여 만들기
프로젝트 작성(프로젝트 이름 : PackageEx)
New Java Project -> Project Name: PackageEx
패키지 lib 작성
Name: lib
패키지 app 작성
Name: app
패키지 작성이 완료된 결과
- 캐키지 탐색 창에 app 패키지와 lib 패키지가 보인다.
lib 패키지에 클래스 Calculator 만들기
Calculator 클 래스를 public abstract 속성 으로 생성한다.
Package Selection: lib
Calculator 소스 작성 후 수정
다른 패키지, 즉 app 패키지의 클래스에서 접근할 수 있도록 하기 위해 클래스의 접근 지정 자 public을 반드시 삽입.
app 패키지에 GoodCalc.java 작성 후 수정
실행을 위한 Run Configurations 작성
Run Configurations -> Main class: appGoodCalc (main() 메소드를 가진 클래스를 지정한다.)
JDK의 주요 패키지
java.lang
‐ 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스 ‐ 자동으로 import 됨 - import 문 필요 없음
java.util
- 날짜, 시간, 벡터, 해시맵 등과 같은 다양한 유틸리티 클래스와 인터페이스 제공
java.io
- 키보드,모니터,프린터,디스크등에입출력을할수있는클래스와인 터페이스 제공
java.awt
- GUI 프로그램을 작성하기 위한 AWT 패키지
javax.swing
- GUI 프로그래밍을 작성하기 위한 스윙 패키지
Object 클래스와 Wrapper 클래스
Object 클래스
모든 자바 클래스는 반드시 Object를 상속받도록 자동 컴파일
- 모든 클래스의 슈퍼 클래스
- 모든 클래스가 상속받는 공통 메소드 포함
주요 메소드
메소드 | 설명 |
---|---|
boolean equal(Objec obj) | obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true 리턴 |
Class getClass() | 현 객체의 런타임 클래스를 리턴 |
int hashCode() | 현 객체에 대한 해시 코드 값 리턴 |
string toString() | 현 객체에 대한 문자열 표현을 리턴 |
void notify() | 현 객체에 대해 대기하고 있는 하나의 스레드를 깨운다. |
void notifyAll() | 현 객체에 대해 대기하고 있는 모든 스레드를 깨운다. |
void wait() | 다른 스레드가 깨울 때까지 현재 스레드를 대기하게 한다. |
-객체의 속성을 나타내는 메소드 제공
- hashCode() 메소드
- 객체의해시코드값을리턴하며,객체마다다름
- getClass() 메소드
- 객체의 클래스 정보를 담은 Class 객체 리턴
- Class 객체의 getName() 메소드는 객체의 클래스 이름 리턴
- toString() 메소드
- 객체를 문자열로 리턴
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class ObjectPropertyEx {
public static void main(String [] args) {
Point p = new Point(2,3);
System.out.println(p.getClass().getName()); // 클래스 이름
System.out.println(p.hashCode()); // 해시 코드 값
System.out.println(p.toString()); // 객체의 문자열
}
}
output
Point
22279806 // 해시코드의 16진수 값. 이 값은 실행때마다 달라질수 있음.
Point@153f67e
toString() 메소드
- 각 클래스는 toString()을 오버라이딩하여 자신만의 문자열 리턴 가능
- 객체를 문자열로 반환
- public String toString(); //원형
- 객체를 문자열로 반환
- 컴파일러에 의한 toString() 자동 변환
- ‘객체 + 문자열’ -> ‘객체.toString() + 문자열’로 자동 변환
- 객체를 단독으로 사용 하는 경우 -> 객체.toString()으로 자동변환
Point a = new Point(2,3);
String s = a + "점";
System.out.println(s);
Point a = new Point(2,3);
String s = a.toString()+ "점";
System.out.println(s.toString());
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public String toString() {
return "Point(" + x + "," + y + ")";
}
}
public class ToStringEx {
public static void main(String [] args) {
Point a = new Point(2,3);
System.out.println(a.toString());
System.out.println(a); // a는 a.toString()으로 자동 변환됨
}
}
output
Point(2,3)
Point(2,3)
객체 비교(==)와 equals() 메소드
-
== 연산자
-
boolean equals(Object obj)
- 두객체의내용물비교
- 객체의 내용물을 비교하기 위해 클래스의 멤버로 작성
class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public boolean equals(Point p) {
if(x == p.x && y == p.y)
return true; //이 Point 객체와 객체 p가 같은지 비교
else
return false;
}
}
public class EqualsEx {
public static void main(String[] args) {
Point a = new Point(2,3);
Point b = new Point(2,3);
Point c = new Point(3,4);
if(a == b)
System.out.println("a==b");
if(a.equals(b))
System.out.println("a is equal to b");
if(a.equals(c))
System.out.println("a is equal to c");
}
}
output
a is equal to b
class Rect {
int width, height;
public Rect(int width, int height) {
this.width = width;
this.height = height;
}
public boolean equals(Rect p) { //이 사각형과 객체 p의 면적 비교
if (width * height == p.width * p.height)
return true;
else
return false;
}
}
public class RectEx {
public static void main(String[] args) {
Rect a = new Rect(2,3); // 면적 6
Rect b = new Rect(3,2); // 면적 6
Rect c = new Rect(3,4); // 면적 12
if(a.equals(b))
System.out.println("a is equal to b");
if(a.equals(c))
System.out.println("a is equal to c");
if(b.equals(c))
System.out.println("b is equal to c");
}
}
output
a is equal to b
Wrapper 클래스
- 자바의 기본 타입을 클래스화한 8개 클래스를 통칭
- 객체만 사용할 수 있는 컬렉션 등에 기본 타입의 값을 사용하기 위해 -> Wrapper 객체로 만들어 사용
기본타입 | byte | short | int | long | char | float | double | boolean |
---|---|---|---|---|---|---|---|---|
Wrapper 클래스 |
Byte | Short | Integer | Long | Ccharacter | Float | Double | Boolean |
Wrapper 클래스의 객체 생성
기본 타입의 값을 인자로 Wrapper 객체 생성
Integer i = Integer.valueOf(10);
Character c = Character.valueOf(‘c’);
Double d = Double.valueOf(3.14);
Boolean b = Boolean.valueOf(true);
// Java 9부터 생성자를 이용한
// Wrapper객체 생성 폐기
Integer i = n̶e̶w̶ ̶I̶n̶t̶e̶g̶e̶r̶(̶1̶0̶)̶;̶
Character c = n̶e̶w̶ ̶C̶h̶a̶r̶a̶c̶t̶e̶r̶(̶‘̶c̶’̶)̶;
Double d = n̶e̶w̶ ̶D̶o̶u̶b̶l̶e̶(̶3̶.̶1̶4̶)̶;
Boolean b = n̶e̶w̶ ̶B̶o̶o̶l̶e̶a̶n̶(̶t̶r̶u̶e̶)̶;
문자열로 Wrapper 객체 생성
Integer i = Integer.valueOf(“10”);
Double d = Double.valueOf(“3.14”);
Boolean b = Boolean.valueOf(“false”);
// Java 9부터 생성자를 이용한
// Wrapper객체 생성 폐기
Integer i = n̶e̶w̶ ̶I̶n̶t̶e̶g̶e̶r̶(̶"̶1̶0̶"̶)̶;
Double d = n̶e̶w̶ ̶D̶o̶u̶b̶l̶e̶(̶"̶3̶.̶1̶4̶"̶)̶;
Boolean b = n̶e̶w̶ ̶B̶o̶o̶l̶e̶a̶n̶(̶"̶f̶a̶l̶s̶e̶"̶)̶;
Float객체는 double타입의 값으로 생성 가능
Integer 클래스의 주요 메소드
메소드 | 설명 |
---|---|
static int bitCount(int i) | 정수1의 이진수 표현에서 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를 스트링으로 변환하여 리턴 |
Wrapper 클래스의 활용
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
double d = Double.parseDouble("3.14"); // d = 3.14
기본 타입 값을 문자열로 변환
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 = Charater.toString('a'); // 문자 ‘a’를 문자열 "a"로 변환
String s5 = Boolean.toString(true); // 불린 값 true를 문자열 "true"로 변환
public class WrapperEx {
public static void main(String[] args) {
// Character 사용
System.out.println(Character.toLowerCase('A')); // 'A'를 소문자로 변환 char c1='4', c2='F';
if(Character.isDigit(c1)) // 문자 c1이 숫자이면 true
System.out.println(c1 + "는 숫자");
if(Character.isAlphabetic(c2)) // 문자 c2가 영문자이면 true
System.out.println(c2 + "는 영문자");
// Integer 사용
System.out.println(Integer.parseInt("28")); // 문자열 "28"을 10진수로 변환
System.out.println(Integer.toString(28)); // 정수 28을 2진수 문자열로 변환
System.out.println(Integer.toBinaryString(28)); // 28을 16진수 문자열로 변환
System.out.println(Integer.bitCount(28)); // 28에 대한 2진수의 1의 개수
Integer i = Integer.valueOf(28);
System.out.println(i.doubleValue()); // 정수를 double 값으로 변환. 28.0
// Double 사용
Double d = Double.valueOf(3.14);
System.out.println(d.toString()); // Double을 문자열 "3.14"로 변환
System.out.println(Double.parseDouble("3.14")); // 문자열을 실수 3.14로 변환
// Boolean 사용
boolean b = (4>3); // b는 true
System.out.println(Boolean.toString(b)); // true를 문자열 "true"로 변환
System.out.println(Boolean.parseBoolean("false")); // 문자열을 false로 변환
}
}
output
a
4는 숫자 F는 영문자 28
28
11100
3
28.0
3.14
3.14
true
false
박싱과 언박싱
- 박싱(boxing) : 기본 타입의 값을 Wrapper 객체로 변환하는 것
-
언박싱(unboxing) : Wrapper 객체에 들어 있는 기본 타입의 값을 빼내는 것
-
자동 박싱과 자동 언박싱
- JDK 1.5부터 박싱과 언박싱은 자동으로 이루어지도록 컴파일됨
String 클래스
- String 클래스는 문자열을 나타냄
- 스트링 리터럴(문자열 리터럴)은 String 객체로 처리됨
- 스트링 객체의 생성 사례
- 스트링 리터럴
- 자바 가상 기계 내부에서 리터럴 테이블에 저장되고 관리됨
- 응용프로그램에서 공유됨 (예, String s = “Hello”;)
- new String()으로 생성된 스트링
- 스트링 객체는 힙에 생성
- 스트링은 공유되지 않음
- 스트링 객체는 수정 불가능
- 스트링 리터럴과 new String()을 생성한 객체의 문자열 수정 불가능
- 스트링 비교
- 두 스트링을 비교할 때 반드시 equals()를 사용하여야 함
- equals()는 내용을 비교하기 때문
String 클래스 주요 메소드
메소드 | 설명 |
---|---|
char charAt(int index) | index 인덱스에 있는 문자값 리턴 |
int codePointAt(int index) | index 인덱스에 있는 유니코드 값 리턴 |
int compareTo(String anotherString) | 두 스트링을 사전적 순서를 기준으로 비교, 두 스트리잉 같으면 9. 현 스트링이 anotherStrings보다 먼저 나오면 음수, 아니면 양수 리턴 |
String concat(String str) | str 스트링을 현재 스트링 뒤에 덧붙인 스트링 리턴 |
boolean contains(CharSequence s) | s에 지정된 문자들을 포함하고 있으면 true 리턴 |
int length() | 스트링의 길이(문자 개수) 리턴 |
String replace(Charsquence targe, Charsquence replacement) | target이 지정하는 일련의 문자들을 replacement가 지정하는 문자들로 변경한 스트링 리턴 |
String[] split(String regex) | 정규식 regx에 일치하는 부분을 중심으로 스트링을 분리하고 분리된 스트링을 배열에 저장하여 리턴 |
String subString(int beginIndex) | beginIndex 인덱스부터 시작하는 서브 스트링 리턴 |
String toLowerCase() | 소문자로 변경한 스트링 리턴 |
String toUpperCase() | 대문자로 변경한 스트링 리턴 |
String trim() | 스트링 앞뒤의 공백 문자들을 제거한 스트링 리턴 |
String 비교
비교연산자(==)
- String 레퍼런스의 주소 비교
- 스트링비교사용금지
equals()
- 스트링이 같으면 true, 같지 않으면 false 리턴
compareTo(String anotherString)
- 문자열이 같으면 0 리턴
- 이 문자열이 anotherString 보다 사전에 먼저 나오면 음수 리턴
- 이 문자열이 anotherString 보다 사전에 나중에 나오면 양수 리턴
String java= "Java";
String cpp = "C++";
int res = java.compareTo(cpp); // J : 아스키코드(74), C : 아스키코드(67)
if(res == 0) System.out.println("the same");
else if(res < 0) System.out.println(java + " < " + cpp);
else System.out.println(java + " > " + cpp);
String 공백 제거
String trim()
- 키보드나파일로부터스트링을입력시,스트링앞뒤공백이끼는경우
- trim()을 이용하면 스트링 앞 뒤에 있는 공백 제거
public class StringEx {
public static void main(String[] args) {
String a = new String(" C#");
String b = new String(",C++ ");
System.out.println(a + "의 길이는 " + a.length()); // 문자열의 길이(문자 개수)
System.out.println(a.contains("#")); // 문자열의 포함 관계
a = a.concat(b); // 문자열 연결
System.out.println(a);
a = a.trim(); // 문자열 앞 뒤의 공백 제거
System.out.println(a);
a = a.replace("C#","Java"); // 문자열 대치
System.out.println(a);
String s[] = a.split(","); // 문자열 분리
for (int i=0; i<s.length; i++)
System.out.println("분리된 문자열" + i + ": " + s[i]);
a = a.substring(5); // 인덱스 5부터 끝까지 서브 스트링 리턴
System.out.println(a);
char c = a.charAt(2); // 인덱스 2의 문자 리턴
System.out.println(c); }
}
output
C#의 길이는 3
true
C#,C++
C#,C++
Java,C++
분리된 문자열0: Java
분리된 문자열1: C++
C++
StringBuffer 클래스
- 가변 스트링을 다루는 클래스
- StringBuffer 객체 생성
- String 클래스와 달리 문자열 변경 가능
- 가변크기의버퍼를가지고있어문자열수정가능
- 문자열의 수정이 많은 작업에 적합
StringBuffer sb = new StringBuffer("This");
sb.append(" is pencil."); // sb = "This is pencil."
sb.insert(7, " my"); // sb = "This is my pencil."
sb.replace(8, 10, "your"); // sb = "This is your pencil."
System.out.println(sb); // "This is your pencil." 출력
StringTokenizer 클래스
- 구분 문자를 기준으로 문자열을 분리하는 클래스
- 구분 문자(delimiter) : 문자열을 구분할 때 사용되는 문자
- 토큰(token) : 구분 문자로 분리된 문자열
String query = "name=joe&addr=seoul&age=21";
StringTokenizer st = new StringTokenizer(query, "&"); // 구분문자 '&'
int count = st.countTokens(); // 토큰 개수 알아내기. count = 3
String token = st.nextToken(); // 다음 토큰 얻어내기. st = "name=joe"
String query = "name=joe&addr=seoul&age=21";
StringTokenizer st = new StringTokenizer(query, "&="); // 구문 문자는 2개 ‘&’와 ‘=’
int count = st.countTokens(); //토큰 개수 알아내기. count = 6
String token = st.nextToken(); //다음 토큰 얻어내기. st = “name”
```java titile="[예제 6-7] StringTokenizer 클래스"
// "name=joe&addr=seoul&age=21"를 '&'문자를 기준으로 분리하는 코드를 작성하라.
import java.util.StringTokenizer; public class StringTokenizerEx { public static void main(String[] args) { String query = "name=joe&addr=seoul&age=21"; StringTokenizer st = new StringTokenizer(query, "&"); //스트링 토크나이저 생성 int n = st.countTokens(); // 스트링 토크나이저에 포함된 토큰의 개수 리턴 System.out.println("토큰 개수 = " + n); while(st.hasMoreTokens()) { //스트링 토크나이저에 다음 토큰이 있으면 true 리턴 String token = st.nextToken(); // 토큰 얻기 System.out.println(token); // 토큰 출력 } } } ```
!!!note "output"
토큰 개수 = 3<br>
name=joe<br>
addr=seoul<br>
age=21
Math 클래스
- 기본 산술 연산 메소드를 제공하는 클래스
- 모든 메소드는 static으로 선언
- 클래스 이름으로 호출 가능
- Math.random() 메소드로 난수 발생
- random()은 0보다 크거나 같고 1.0보다 작은 실수 난수 발생
- 1에서 100까지의 랜덤 정수 10개를 발생시키는 코드 사례
import java.util.Random; //java.util.Random 클래스를 이용하여 난수 발생 가능
...
Random r = new Random();
int n = r.nextInt(); // 음수, 양수, 0 포함, 자바의 정수 범위 난수 발생
int m = r.nextInt(100); // 0에서 99 사이(0과 99 포함)의 정수 난수 발생
public class MathEx {
public static void main(String[] args) {
System.out.println(Math.abs(-3.14)); // 절댓값 구하기
System.out.println(Math.sqrt(9.0)); // 9의 제곱근 = 3
System.out.println(Math.exp(2)); // e^2
System.out.println(Math.round(3.14)); // 반올림
// [1, 45] 사이의 정수형 난수 5개 발생
System.out.print("이번주 행운의 번호는 ");
for (int i=0; i<5; i++)
System.out.print((int)(Math.random()*45 + 1) + " "); // 난수 발생
}
}
output
3.14
3.0
7.38905609893065
3
이번주 행운의 번호는 14 44 21 36 17