01. 패키지
02. import와 클래스 경로
03. 패키지 만들기
04. 자바 JDK에서 제공하는 패키지
05. Object 쿨래스
06. Wrapper 클래스
07. String 클래스
08. StringBuffer 클래스
09. StringTokenizer 클래스
10. Math 클래스
# 자바의 패키지 (package)
º 패키지
- 서로 관련된 클래스와 인터페이스의 컴파일된 파일들을 하나의 폴더에 묶어 놓은 것을 말한다.
º 패키지 선언 : 해당 클래스가 어떤 패키기에 속할 것인지를 선언
- package 상위 패키지.하위패키지로 표현
- 패키지의 이름은 숫자로 시작해서는 안 되고, _(밑줄), $만 사용
º 하나의 응용 프로그램(프로젝트)은 하나의 패키지로 구성될 수도 있고, 여러 개의 패키지로 구성될 수도 있다.
# 패키지 사용하기, import문
º 다른 패키지 가져다 쓰기
- import를 이용하지 않는 경우
public class ImportExample {
public static void main(String[] args) {
java.util.Scanner scanner = new java.util.Scanner(System.in);
}
}
- import 키워드를 이용하는 경우
→ 소스의 시작 부분에 패키지를 명시하고, 소스 내에서는 클래스 명만 명시
import java.util.Scanner;
public class ImportExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
}
}
º import 사용
- 특정 클래스의 경로명만 포함하는 경우
→ import.java.util.Scanner;
- 패키지 내의 모든 클래스를 포함시키는 경우
→ import java.util.*;
→ *는 현재 패키지 내의 클래스만을 의미하며 하위 패키지의 클래스까지 포함하지 않는다.
import java.util.*;
public class ImportExample {
public static void main(String[] args) {
Scanner scanner = new SCanner(System.in);
}
}
# 패키지의 특징
º 패키지 계층 구조
- 클래스나 인터페이스가 너무 많아지면 관리의 어려움
- 관련된 클래스 파일들을 하나의 패키지로 계층화하여 관리
º 패키지별 접근 제한
- default로 선언된 클래스나 멤버는 동일 패키지 내의 클래스들이 자유롭게 접근하도록 허용
º 동일한 이름의 클래스와 인터페이스의 사용 가능
- 서로 다른 패키지에 "이름이 같은" 클래스와 인터페스 존재 가능
º 높은 소프트웨어 재사용성
- 오라클에서 제공하는 자바 API는 패키지로 구성되어 있음
- java.lang, java.io 등의 패키지 사용으로 입출력을 간단히 작성할 수 있음
# 자바 JDK의 패키지 구조
º JDK 패키지
- 자바에서는 관련된 클래스들을 표준 패키지로 묶어 사용자에게 제공
- 자바에서 제공하는 패키지는 C언어의 표준 라이브러리와 유사
- JDK의 표준 패키지는 rt.iar에 담겨 있다.
# 주요 패키지
º java.lang : 자바 language 패키지
- 스트링, 수학 함수, 입출력 등 기본적인 클래스와 인터페이스
- 자동으로 import 됨 - import문이 필요 없음
º java.util : 자바 유틸리티 패키지
- 날짜, 시간, 벡터, 해시 테이블 등과 같은 다양한 유틸리티 클래스와 인터페이스
º java.io : 자바 입출력 관련 패키지
- 키보드, 모니터, 프린터, 디스크 등에 입출력을 할 수 있는 클래스와 인터페이스
# Object 클래스와 주요 메소드
- java.lang 패키지에 포함, 자바 클래스 계층 구조의 최상위에 위치
- 모든 클래스의 수퍼 클래스
메소드 | 설명 |
protected Object clone() | 현 객체와 똑같은 객체를 만들어 반환. 오버라이딩 필요 |
boolean equals(Object obj) | obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true 반환 |
Class getClass() | 현 객체의 런타임 클래스를 반환 |
int hashCode() | 현 객체에 대한 해쉬 코드 값 반환 |
String toString() | 현 객체에 대한 스트링 표현을 반환 |
void notify() | 현 객체에 대해 대기하고 있는 하나의 스레드를 깨운다. |
void notifyAll() | 현 객체에 대해 대기하고 있는 모든 스레드를 깨운다. |
void wait() | 현 객체의 다른 스레드가 notify() 또는 notifyAll() 메소드를 호출할 때까지 현 스레드를 대기하게 한다. |
# 객체를 문자열로 반환
º String toString()
- 객체를 텍스트 형태로 표현한 문자열로 반환
- 반환되는 문자열 : 클래스 이름@객체의 hash code
- 객체와 문자열이 + 연산이 되는 경우 객체의 toString() 메소드를 호출
# 객체 비교
º 개체 레퍼런스의 동일성 비교 : == 연산자 이용
º 객체 내용의 동일성 비교 : boolean equals(Object obj) 이용
Class Point {
int x, y;
public Point(int x, int y) {
this.x = x; this.y = y;
}
}
public class ObjectProperty {
public static void main(String[] args) {
Point a = new Ppint(2,3);
Point b = new Point(2,3);
Point c = a;
if(a == b) // false
System.out.println("a==b");
if(a == c) //true
System.out.println("a==c");
}
}
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 ObjectProperty {
public static void main(String[] args) {
Point a = new Point(2,3);
Point b = new Ppint(2,3);
Point c = new Point(3,4);
if(a == b) //false
System.out.println("a==b");
if(a.equals(b)) //true
System.out.println("a is equal to b");
if(a.equals(c)) //false
System.out.println("a is equal to c");
}
}
# Wrapper 클래스
º 자바 기본 데이터 타입을 클래스화한 8개 클래스
기본데이터 타입 | byte | short | int | long | char | float | double | boolean |
Wrapper 클래스 | Byte | Short | Integer | Long | Character | Float | Double | Boolean |
º 용도
- 기본 데이터 타입을 사용할 수 없고 객체만 사용하는 컬렉션에 기본 데이터 타입을 Wrapper 클래스로 만들어 사용
# Integer 클래스의 주요 메소드
메소드 | 설명 |
static int bitCount(int i) | 이진수 표현에서 1의 개수를 반환 |
float floatValue() | float 타입으로 변환된 값 반환 |
int intValue() | int 타입으로 변환된 값 반환 |
long longValue() | long 타입으로 변환된 값 반환 |
short shortValue() | short 타입으로 변환된 값 반환 |
static int parseInt(String s) | 스트링을 10진 정수로 변환된 값 반환 |
static int parseInt(String s, int radix) | 스트링을 지정된 진법의 정수로 변환된 값 반환 |
static String toBinaryString(int i) | 이진수 표현으로 변환된 스트링 반환 |
static String toHexString(int i) | 16진수 표현으로 변환된 스트링 반환 |
static String toOctalString(int i) | 8진수 표현으로 변환된 스트링 반환 |
static String toString(int i) | 정수를 스트링으로 변환하여 반환 |
º Wrapper 객체로부터 기본 데이터 타입 알아내기
pupblic class WrapperClassDemo1 {
public static void main(String[] args) {
Integer i = Integer.valueOf(10);
int ii = i.intValue();
Character c = Character.valueOf('c');
char cc = c.charValue();
Float f = Float.valueOf("3.14");
float ff = f.floatValue();
Boolean b = Boolean.valueOf(true);
boolean bb = b.booleanValue();
System.out.println(ii);
System.out.println(cc);
System.out.println(ff);
System.out.println(bb);
}
}
º 문자열과 기본 데이터 타입 사이의 변환
public class WrapperClassDemo1 {
public static void main(String[] args) {
int i = Integer.parseInt("123");
boolean b = Boolean.parseBooLean("true");
float f = Float.parseFloat("3.14");
System.out.println(i); System.out.println(f);
System.out.println(b); System.out.println();
String s1 = Integer.toString(123);
String s2 = Integer.toHexString(123);
String s3 = Float.toString(3.14f);
String s4 = Character.toString('a');
String s5 = Boolean.toString(true);
System.out.println(s1); System.out.println(s2);
System.out.println(s3); System.out.println(s4);
System.out.println(s5);
}
}
# 박싱과 언박싱
º 박싱(boxing)
- 기본 데이터 타입을 Wrapper 클래스로 변환하는 것
º 언박싱(unboxing)
- Wrappe 클래스 타입의 값을 기본 데이터 타입으로 변환하는 것
- 박싱의 반대의 경우를 언박싱이라고 함.
박싱 : Integer ten = new Integer(10);
언박싱 : int i = ten.Value();
# Auto boxing & unboxing
º JDK 5.0 이상부터 지원
º Auto boxing
- 기본 데이터 타입을 자동으로 Wrapper 클래스로 변환
º Auto unboxing
- Wrapper 클래스를 자동으로 기본 데이터 타입으로 변환
// JDK5.0 이상에서
Integer ten = 10; //자동 박싱
int i = ten; //자동 언박싱
º 박싱 언박싱의 예
public class AutoBoxingUnboxingDemo {
public static void main(String[] args) {
int i = 10;
Integer intObject = i; //auto boxing
System.out.println("intObject = " + intObject);
i = intObject + 10; //auto unboxing
System.out.println("i = " + i);
}
}
# String의 생성과 특징
º String 생성자
생성자 | 설명 |
String() | 빈 스트링 객체 생성 |
String(byte[] bytes) | 플랫폼의 기본 문자 집합을 이용하여 바이트 배열을 디코딩하여 스트링 객체 생성 |
String(String original) | 인자로 주어진 스트링과 똑같은 스트링 객체를 생성 |
String(StringBuffer buffer) | 스트링 버퍼에 포함된 일련의 문자들을 나타내는 스트링 객체 생성 |
# 스트링 리터럴과 new String()
º 스트링 생성
- 단순 리터럴로 생성, String s = "Hello";
→ JVM이 리터럴 관리, 응용프로그램 내에서 공유됨
- String 객체로 생성, String t = new String("Hello");
→ 힙(heap)에 String 객체 생성
# 스트링 객체의 주요 특징
º 스트링 객체는 수정할 수 없음
º == 과 equals()
- 두 스트링을 비교할 때 반드시 equals()를 사용하여야 함
→ equals()는 내용을 비교하기 때문
메소드 | 설명 |
char charAt(int index) | 지정된 인덱스에 있는 문자값을 반환 |
int indexOf(int ch) | ch 문자가 있는 인덱스 리턴. 없으면 -1리턴 |
int indexOf(int ch, int fromIndex) | fromIndex 위치부터 끝까지 문자 ch 탐색 인덱스 리턴. 없으면 -1리턴 |
String concat(String str) | 지정된 스트링을 현재 스트링 뒤에 덧붙인 스트링 반환 |
boolean contains(CharSequence s) | 지정된 일련의 문자들을 포함하고 있으면 true 반환 |
int length() | 스트링의 길이 반환 |
String replace(Charsequence target, Charsequence replacement) | target 지정하는 일련의 문자들을 replacement가 지정하는 문자들로 변경한 스트링 반환 |
String[] split(String regex) | 정규식에 일치하는 부분을 중심으로 스트링 분리하여 스트링 배열로 반환 |
String subString(int beginIndex) | 지정된 인덱스부터 시작하는 서브 스트링 반환 |
String toLowerCase() | 스트링을 소문자로 변경한 스트링 반환 |
String toUpperCase() | 스트링을 대문자로 변경한 스트링 반환 |
String trim() | 스트링 앞뒤의 공백문자들을 제거한 스트링 반환 |
# 문자열 비교
º int compareTo(String anotherString)
# 문자열 연결
º 자바에서 스트링 연결 연산자 + 지원
- + 연산에서 문자열이 인자로 포함되어 있으면 산술 연산이 아닌 문자열 연결 연산으로 간주
º 객체가 문자열 연결 연산에 포함되어 있는 경우
- toString() 메소드를 호출하여 객체를 문자열로 변환한 후 문자열 연결
º 기본 데이터 타입
- 그대로 문자열로 변환된 후에 문자열 연결
º String 클래스의 concat() 메소드를 이용하여 스트링 연결
문법 : String concat(String str)
public class StringDemo1 {
public static void main(String[] args) {
String s1 = "abcd".concat("-efg");
String s2 = s1.concat("-opqr);
System.out.println(s1);
System.out.println(s2);
}
}
# 문자열 내의 공백 제거, 문자열의 각 문자 접근
º 공백 제거 : String trim()
- 스트링 앞 뒤 공백 문자(tab, enter, space) 제거한 스트링 리턴
String a = " abcd def ";
String b = "\txyz\t";
String c = a.trim(); // c = "abcd def"
String d = b.trim(); // d = "xyz"
º 문자열의 문자 : char charAt(int index)
- 스트링에 포함된 각 문자 접근
// "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츨력
# StringBuffer 클래스
º java.lang.StringBuffer
- String클래스 객체와는 달리 객체 생성 후 스트링 값 변경 가능
- append와 insert 메소드를 통해 스트링 조작
- StringBuffer 객체의 크기는 스트링 길이에 따라 가변적
StringBuffer sb = new StringBuffer("java");
생성자 | 설명 |
StringBuffer() | 문자를 포함하고 있지 않고, 초기 크기가 16인 스트링 버퍼 생성 |
StringBuffer(charSequence seq) | seq가 지정하는 일련의 문자들을 포함하는 스트링 버퍼 생성 |
StringBuffer(int capacity) | 문자를 포함하고 있지 않고 지정된 초기 크기를 갖는 스트링 버퍼 생성 |
StringBffer(String str) | 지정된 스트링으로 초기화된 스트링 버퍼 생성 |
º 주요 메소드
StringBuffer append(String str) | 지정된 스트링을 스트링 버퍼에 덧붙인다 |
StringBuffer append(StringBuffer sb) | 지정된 스트링 버퍼를 스트링 버퍼에 덧붙인다 |
int capacity() | 현재 스트링 버퍼의 크기 반환 |
StringBuffer delete(int start, int end) | 지정된 서브 스트링을 스트링 버퍼에서 제거 |
StringBuffer insert(int offset, String str) | 지정된 스트링을 스트링 버퍼의 특정 위치에 삽입 |
StringBuffer replace(int start, int end String str) | 스트링 버퍼 내의 서브 스트링을 지정된 스트으로 대치ㅇ |
StringBuffer reverse() | 스트링 버퍼 내의 문자들을 반대 순서로 변경 |
void setLength() | 스트링 버퍼 내 저장된 문자열 길이를 설정. 현재 길이보다 큰 경우 널 문자로 채우며 작은 경우는 문자열이 잘린다. |
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("This");
System.out.println(Sb.hashCode());
sb.append(" is pencil"); //문자열 덧붙이기
System.out.println(Sb);
sb.insert(7, " my"); //문자열 삽입
System.out.println(sb);
sb.replace(8, 10, "your"); //문자열 대치
System.out.println(sb);
sb.setLength(5); //스트링 버퍼 내 문자열 길이 설정
System.out.println(Sb);
System.out.println(sb.hashCode());
}
}
# StringTokenizer 클래스
º java.util.StringTokenizer
- 하나의 스트링을 구분자로 분리하여 토큰 형태로 파싱
→ 스트링을 구분할 때 사용되는 문자들을 구분 문자(delimeter)라고 함
º 토큰(token)
- 구분 문자로 분리된 스트링
º String 클래스의 split 메소드를 이용하여 동일한 구현 가능
# 생성자와 주요 메소드
생성자 | 설명 |
StringTokenizer(String str) | 지정된 스트링으로 초기화된 스트링 토크나이저 |
StringTokenizer(String str, String delim) | 지정된 스트링과 구분 문자로 초기화된 스트링 토크나이저 생성 |
StringTokenizer(String str, String delim, boolean returnDelims) | 지정된 스트링과 구분 문자로 초기화된 스트링 토크나이저 생성. returnDelims가 true이면 구분 문자로 지정된 문자도 분리된 토큰에 포함됨. |
# Math 클래스
º java.lang.Math
- 기본적인 산술 연산을 수행하는 메소드 제공
- 모든 멤버 메소드는 static으로 정의됨
- 객체를 만들어서 사용할 필요 없음
# 주요 메소드
메소드 | 설명 |
static double abs(double a) | 절대값 반환 |
static double cos(double a) | cosine 값 반환 |
static double sin(double a) | sine 값 반환 |
static double tan(double a) | tangent 값 반환 |
static double exp(double a) | e^a 값 반환 |
static double ceil(double a) | 지정된 실수보다 크거나 같은 수 주에서 가장 작은 정수를 실수 타입으로 반환 |
static double floor(double a) | 지정된 실수보다 작거나 같은 수 중에서 가장 큰 정수를 실수 타입으로 반환 |
static double max(double a, dpuble b) | 두 수 중에서 큰 수 반환 |
static double min(double a, double b) | 두 수 중에서 작은 수 반환 |
static double random(double a) | 0.0보다 크거나 같고 1.0보다 작은 임의의 수 반환 |
static double rint(double a) | 지정된 실수와 가장 근접한 정수를 실수 타입으로 반환 |
static double round(double a) | 지정된 실수를 소수 첫째 자리에서 반올림한 정수를 실수 타입으로 반환 |
static double sqrt(double a) | 제곱근을 반환 |
# 요약
- 패키지란 클래스 또는 인터페이스들을 서로 관련 있는 것들끼리 묶어 놓은 것임.
- 패키지 간의 접근에 제한을 두어 패키지 간 무단 접근을 방지할 수 있음.
- 패키지를 활용하여 불필요한 코딩 작업을 줄여 소프트웨어의 재사용성을 높여줌.
- 자바 소스 파일의 맨 첫줄에 package 키워드를 이용하여 클래스가 패키지에 속함을 선언함.
- 패키지 선언문이 없는 경우 클래스는 기본 패키지에 속하며, 현재 디렉토리 저장
- 사용할 클래스가 속한 패키지 이름을 클래스 이름 앞에 붙여서 사용함.
- import 문에서 클래스 이름 대신 패키지 이름 다음에 '*'를 적으면 패키지의 모든 클래스를 포함
- import 문을 이용하여 다른 패키지의 클래스를 지정하면 패키지 이름을 클래스 이름 앞에 붙이지 않고 사용 가능
- 자바는 기본적 기능을 제공하는 클래스들을 표준 패키지로 묶은 Java API를 제공
- JDK의 표준 패키지에는 lang, util, awt, io 등 많은 패키지들이 포함되어 있음
- Object 클래스는 java.lang 패키지에 포함되어 있으며 개발자가 작성하는 모든 클래스는 묵시적으로 Object를 상속받음.
- Object 클래스에는 toString() 메소드가 있으며, 개발자는 클래스에 이를 오버라이딩하여 객체를 문자열로 리턴할 수 있음
- == 연산자는 두 레퍼런스가 같은지 비교하며, 각 레퍼런스가 가리키는 객체의 내용이 같은지 비교하려면 클래스 내에 equals() 메소드를 작성해야 함
- .자바는 int, char 등 기본 타입의 값을 객체로 다룰 수 있도록 Wrapper 클래스를 제공함
- Wrapper 클래스에는 Byte, Short, Integer, Long, Character, Float, Double, Boolean이 있음. 기본 타입의 Wrapper 객체로 바꾸는 것은 박싱, 그 반대를 언박싱이라고 부름.
- String 클래스, StringBuffer 클래스, StringTokenizer 클래스를 이용하여 문자열을 조작할 수 있음. String 클래스는 문자열을 쉽게 다루도록 지원하는 클래스이지만, 한 번 만들어진 문자열(String 객체)은 변경할 수 없음. StringBuffer 클래스는 변경 가능한 문자열을 다루는데 이용되며, StringTokenizer 클래스는 문자열을 분할하는데 매우 유용함
- Math 클래스는 자바의 다양한 산술 연산 메소드를 제공
'JAVA > 자바 이론' 카테고리의 다른 글
Java | Lab7-2 제네릭과 컬렉션 (0) | 2021.06.12 |
---|---|
Java | 7-1 제네릭과 컬렉션 (0) | 2021.06.10 |
Java | 5-2 상속과 다형성 (0) | 2021.05.25 |
Java | 5-1 상속과 다형성 (0) | 2021.05.25 |
Java | 4-3 클래스와 객체 (0) | 2021.04.15 |