패키지의 개념과 필요성
하나의 응용프로그램을 개발하기 위해 3명의 개발자가 작업을 분담할 시 각 분담한 부분의 개발자 클래스 중 동일한 이름의 클래스가 한 디렉터리에 합쳐지면 중복 문제가 발생한다. 이를 해결하기 위해 자바에서는 패키지로 디렉터리를 나눈다.
패키지와 클래스 경로명
패키지 – 서로 관련 있는 클래스나 인터페이스의 컴파일 된 클래스 파일들을 한 곳에 묶어 놓은 것을 말한다.
패키지는 디렉터리와 연관되어 있다. 하나의 패키지에는 하나의 디렉터리에 저장된 클래스 파일들을 지칭한다.
패키지 내의 클래스를 지칭할 때는 패키지명을 포함하는 경로명을 .을 이용하여 나타낸다.
java.awt.Color
패키지 사용하기, import 문
다른 패키지에 있는 클래스를 사용하고자 한다면, import 키워드를 이용하여 패키지를 호출하여 사용 가능 하다.
- 불러 쓰고자 하는 클래스마다 완전 경로명을 선언하여 컴파일러에게 알려주는 방법(ex, import 패키지.클래스)
- 한 패키지에 있는 많은 클래스를 불러 사용하는 경우(ex, import 패키지.*)
패키지 선언
클래스나 인터페이스가 컴파일 되면 클래스 파일이 생성되고, 반드시 하나의 패키지에 포함 되어야 한다.
소스 파일에는 다음과 같이 package 키워드를 이용하여 클래스가 소속된 패키지를 지정한다.
Package 패키지명;
패키지의 선언문은 반드시 소스 첫 번째 줄에 와야한다.
디폴트 패키지
Package 선언문이 없을 때, 자바 컴파일러는 클래스나 인터페이스를 디폴트 패키지에 소속시킨다. 디폴트 패키지의 디렉터리는 현재 디렉터리이다.
자바 JDK에서 제공하는 패키지
JDK는 화면 출력, 키 입력, 네트워킹 등 프로그램 개발에 필요한 기본적인 기능과 다양한 응용 기능을 구현한 많은 클래스와 인터페이스들을 포함한 표준 패키지, 자바 API를 제공한다. 이 패키지는 JDK 설치 디렉터리에 rt.jar 파일로 제공된다.
JDK 패키지 계층 구조는 다음과 같다.
사진 1 자바 패키지 계층 구조
JDK에서 비교적 많이 사용되는 패키지는 다음과 같다.
- java.lang – system을 비롯하여 문자열, 수학함수, 입출력 등과 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스를 제공. 이 패키지는 import 하지 않아도 됨.
- Java.util – 날짜, 시간, 벡터, 해시맵 등의 유틸리티 클래스와 인터페이스
- Java.io – 키보드, 모니터, 프린터 등의 입출력 클래스와 인터페이스
- Java.awt – GUI 프로그래밍에 필요한 AWT 클래스와 인터페이스
- Javax.swing – 스윙 GUI 프로그래밍에 필요한 클래스와 인터페이스
Object 클래스
Object는 java.lang 패키지에 속한 클래스이며, 모든 클래스는 Object를 상속받는다. 자바의 최상위 클래스이다.
사진 2 Object의 주요 메소드
Object 클래스의 객체의 속성, 클래스명, 해시 코드 값, 객체 문자열을 알아낼 수 있다.
class Point1 {
int x, y;
public Point1(int x, int y) {
this.x = x;
this.y = y;
}
}
public class ObjectPropertyEx {
public static void main(String[] args) {
Point1 p = new Point1(2, 3);
System.out.println(p.getClass().getName()); // 클래스 이름 Point1
System.out.println(p.hashCode()); // 해시 코드 값 1607460018(객체 생성 시 할당 받는 랜덤한 정수 값)
System.out.println(p.toString()); // 객체의 문자열 Point1@5fcfe4b2
}
}
toString() 메소드, 객체를 문자열로 반환
객체를 문자열로 변환하는 toString() 메소드는 반드시 public 으로 선언하여야 하며 우리가 쓰고 있었던 객체+문자열 연산이나 객체를 출력하는 경우 자동으로 출력된다.
System.out.println(p.toString()); // 생략 안함
System.out.println(p); //생략
객체 비교와 equals() 메소드
==연산자는 객체의 레퍼런스를 비교하는 연산자이다. 객체안의 내용은 equals()메소드를 이용하여 비교한다.
Equals() 메소드는 객체의 내용을 비교하여 Boolean 형으로 true, false 중의 하나를 리턴한다. 하지만 equals() 메소드는 재작성 해야한다.
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;
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는 b와 같다.");
if(b.equals(c)) System.out.println("b는 c와 같다.");
}
}
Wrapper 클래스
이름이 Wrapper인 클래스는 존재 하지 않는다. 8개의 기본 타입을 객체로 다루기 위해 다음과 같은 8개의 클래스를 통칭 Wrapper 클래스라고 한다.
사진 3 Wrapper 클래스
자바는 객체 지향 언어이며, 기본적으로 객체를 대상으로 처리하는 경우가 많은데 이들 클래스를 사용할 때 기본 타입은 사용할 수 없는 문제점을 해결하기 위하여 기본 타입의 값을 객체로 만들어 사용할 수 있도록 Wrapper 클래스를 사용한다.
Wrapper 클래스의 객체 생성
클래스들의 사용법은 일반적인 객체 생성과 거의 비슷하다.
nteger i = new Integer(10);
Character c = new Character('c');
Boolean b = new Boolean(true);
Character를 제외한 나머지 Wrapper 클래스의 경우, 다음과 같이 문자열로 Wrapper객체를 생성 할 수도 있다.
Integer i = new Integer("10");
Double d = new Double("3.14");
Boolean b = new Boolean("false");
Wrapper 클래스의 활용
Wrapper 클래스는 많은 메소드를 제공하지만, 기본타입 -> 문자열로 변환하거나 문자열 -> 기본 타입 값으로 변환하는 것이 대부분이다. 또한 많은 메소드가 static 타입으로 구성되어 있다.
사진 4 Wrapper 클래스의 메소드
public class WrapperEx {
public static void main(String[] args) {
// Character 사용
System.out.println(Character.toLowerCase('A')); // '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 = new Integer(28);
System.out.println(i.doubleValue()); // 정수를 double 값으로 변환. 28.0
// Double 사용
Double d = new Double(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로 변환
}
}
박싱과 언박싱
박싱 - 기본 타입의 값을 wrapper 객체로 변환하는 것
언박싱 – wrapper 객체를 기본 타입으로 변환 하는 것
JDK 1.5부터 박싱과 언박싱은 자동으로 이루어지며, 이를 자동 박싱, 자동 언박싱이라 부른다.
Integer ten = 10;
int n = ten;
String의 생성과 특징
String 클래스는 문자열을 나타내며, 스트링 리터럴은 String 객체로 처리된다.
String str1 = "abcd"
char data[] = {'a','b','c','d'};
String str2 = new String(data);
String str3 = enw String("abcd"); // str2와 str3는 모두 "abcd" 문자열
String 리터럴과 new String()
스트링 리터럴과 new String으로 생성된 스트링은 서로 다르게 관리된다. 스트링 리터럴은 JVM 스트링 리터럴 테이블이란 곳에서 동일한 리터럴은 공유 시킨다. 이는 스트링 생성에 대한 실행 시간을 줄이기 위함이다.
사진 5 스트링 리터럴과 스트링 객체의 차이점
스트링 객체는 수정이 불가능하다. 만일 concat()로 문자열을 변경하러면 변수 하나를 더 정의하여 붙여야 한다.
public class WrapperEx {
public static void main(String[] args) {
String a = new String("안녕");
String b = a.concat("하세요");
System.out.println(b);
}
}
String 비교, int compareTo(String anotherString)
compareTo() 메소드는 두 스트링을 사전 순서로 비교하여 같으면 0, 현재 스트링이 anotherString보다 먼저 나오면 음수를,
뒤애 나오면 양수를 리턴한다.
public class WrapperEx {
public static void main(String[] args) {
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);
if (res>0) System.out.println(java + ">" + cpp);
}
}
공백 제거, String trim()
키보드나 파일로부터 스트링을 입력 받을 때, 스트링 앞뒤에 공백이 끼는 경우 이를 제거해 주는 메소드는 trim()이다.
이 메소드는 스트링 앞뒤의 공백 문자를 제거한 뒤 스트링을 반환한다.
String a = " xyz\t";
String b = a.trim(); // b="xyz"
String 클래스의 주요 메소드
사진 6 String 클래스의 주요 메소드
package PackageEx;
import java.util.StringTokenizer;
public class WrapperEx {
public static void main(String[] args) {
String query = "name&addr=seoul&age=21";
StringTokenizer st = new StringTokenizer(query, "&");
int n = st.countTokens();
System.out.println("토큰 개수 = " + n);
while (st.hasMoreElements()) {
String token = st.nextToken();
System.out.println(token);
}
}
}