6장_패키지 개념과 자바 기본 패키지

IkSun·2023년 5월 2일

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 클래스


6.1 ) 패키지(Package)

자바의 모듈과 패키지

  • 패키지
    • 서로 관련된 클래스와 인터페이스의 컴파일 된 클래스 파일들을 하나의 디렉토리에 묶어 놓은 것
    • 동일한 이름의 클래스가 생길 수 있기 때문에 구분하기 위한 디렉토리(폴더)라고 생각
  • 모듈
    • 여러 패키지와 이미지 등의 자원을 모아 놓은 컨테이너

6.2 ) import와 클래스 경로

패키지 사용, import 문

  • import 를 이용하지 않는 경우
    • 소스 내에서 매번 전체 패키지 이름과 클래스 이름을 써주어야 함
    • java.util.Scanner scanner = new java.util.Scanner(System.in);
  • import 키워드를 이용하는 경우
    • 소스의 시작 부분에 사용하려는 패키지 명시
      • 소스에는 클래스 명만 명시하면 됨
    • 특정 클래스의 경로명만 포함하는 경우
      • import java.util.Scanner;
    • 패키지 내의 모든 클래스를 포함시키는 경우
      • import java.util.*;
      • * 는 현재 패키지 내의 클래스만을 의미하며 하위 패키지의 클래스까지 포함하지 않는다

6.3 ) 패키지 만들기

패키지 만들기

  • 패키지 선언
    • package 패키지명;
      • 컴파일한 클래스 파일을 패키지명의 디렉토리에 저장하라는 지시
      • 소스 파일의 첫 줄에 선언
        package UI; // Tools 이라는 클래스를 컴파일 하여, UI 패키지에 저장힐 것을 지시  
         public class Tools { //이제 이 클래스의 경로명은 UI.Tools 가 된다.
         ...
         }  //Tools 클래스는 패키지 UI에 속하게 된다.
  • 사례
    • Tools 클래스의 경로명은 UI.Tools
    • 다른 클래스에서 Tools 클래스를 사용하기 위해서는 import UI.Tools
      package Graphic;  //Line 클래스를 Graphic 패키지에 저장
       import UI.Tools;  //UI 패키지에 있는 Tools 클래스를 사용하기 위하여, Tools 클래스의 경로명 포함 시킴   
       
       public class Line {
          public void draw() {
             Tools t = new Tools();
          }
       } // Line 클래스는 패키지 Graphic 에 속하게 된다.

Calculator.java

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);
}

GoodCalc.java

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


디폴트 패키지와 패키지의 특징

  • 디폴트 패키지
    • package 선언문이 없이 만들어진 클래스의 패키지
    • 디폴트 패키지는 현재 디렉토리
  • 패키지의 특징
    • 패키지 계층 구조
      • 관련된 클래스 파일을 하나의 패키지로 계층화하여 관리 용이
    • 패키지별 접근 제한
      • 패키지 별로 접근 권한 가능
    • 동일한 이름의 클래스와 인터페이스의 사용 가능
      • 서로 다른 패키지에 이름이 같은 클래스와 인터페이스 존재 가능
    • 높은 소프트웨어 재사용성
      • 오라클에서 제공하는 자바 API는 패키지로 구성되어 있음
      • java.lnag, java.io 등의 패키지들 덕분에 일일히 코딩하지 않고 입출력 프로그램을 간단히 작성할 수 있음.

6.4 ) 모듈 개념

  • 모듈
    • 클래스들은 패키지로 만들고, 다시 패키지를 모듈로 만듦
    • 패키지와 이미지 등의 리소스를 담은 컨테이너
    • 모듈 파일(.jmod)로 저장.

자바 플랫폼의 모듈화

  • 자바 플랫폼
    • java.base 와 java.util 에 우리가 사용하는 것들이 많이 들어있음
  • 모듈 파일로부터 모듈을 푸는 명령
    jmod extract "C:\Program Files\Java\jdk-11.0.6\jmods\java.base.jmod "
    • 현재 리렉토리에 java.base 모듈이 풀림 \to '자바 환경설정 필요'
    • java.base 모듈에 들어있는 패키지들 : io, lang, math, util 등
    • java.util 패키지에 들어있는 자바 API 클래스들 : Scanner.class, ResorceBundle.class 등

모듈 기반의 자바 실행 환경

  • 자바 실행환경
    • JRE : 디폴트 자바 실행 환경 - 소스코드 작성
      • 자바 모듈(컴파일된 자바 API 클래스들), 자바 가상 기계 등으로 구성.
  • 자바 모듈화의 가장 큰 목적
    • 자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함
    • 컴퓨토 시스템의 불필요한 부담 감소
      • 세밀한 모듈화를 통해 필요 없는 모듈이 로드되지 않게 함
      • 소형 IoT 장체에도 자바 응용프로그램이 실행되고 성능을 유지하게 함

6.5 ) 자바 JDK에서 제공하는 패키지

주요 패키지

  • java.lang
    • 자바 language 피키지
      • 스트링, 수학 함수, 입출력 등 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스
    • 자동 import 됨 -> 따라서, 코드 작성 시 import 문 필요 없다.
  • java.util
  • java.io
  • java.awt
  • javax.swing

6.6 ) Object 클래스

  • 특징

    • java.lang 패키지에 포함
    • 모든 클래스의 수퍼 클래스
      • 모든 클래스에 강제 상속
      • 모든 객체가 공통으로 가지는 객체의 속성을 나타내는 메소드 보유
  • 주요 메소드

    메소드설명
    boolean equals(Object obj)obj가 가리키는 객체와 현재 객체를 비교하여 같은 true 리턴
    Class getClass()현 객체의 런타임 클래스를 리턴
    int hashCode()현 객체에 대한 해시 코드 값 리턴
    String toString()현 객체에 대한 문자열 표현을 리턴 (매우 중요)
    객체를 문자열로 반환

예제 6-1 : Object 클래스로 객체 속성 알아내기

  • 객채 레퍼런스만으로 객체의 클래스명, 해시코드 값, 객체의 문자열을 출력해보자.
  • getClass() : 현 객체의 런타임 클래스를 반환
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

객체를 문자열로 반환

  • String toString()
    • 객체를 문자열로 반환
    • Object 클래스에 구현된 toString()이 반환하는 문자열
      • 반환되는 문자열 : 클래스 이름 @ 객체의 hash code
      • 각 클래스는 toString() 을 오버라이딩하여 자신만의 문자열이 리턴이 됨.
        public String toString {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
         } 
    • 컴파일러에 의한 자동 변환
      • '객체 + 문자열' -> '객체.toString() + 문자열' 로 자동 변환 :
        • 객체와 문자열이 + 연산이 되는 경우 객체의 toString() 메소드를 자동으로 호출
      • Hash code : 생성된 객체(인스턴스)를 구분하기 위해 할당된 고유의 정수값
        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() 오버라이딩

예제 6-2 : Point 클래스에 toString() 작성

  • object 클래스에서 제공하는 toString() 메소드를 오버로딩 했다.
  • 따라서, 다음과 같이 출력되지 않는다. Point@c17164
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와 c가 할당한 값이 같은가
      • \to 레퍼런스 a와 c가 같은 객체(인스턴스)를 참조하는가?
  • 객체 내용 비교 : 서로 다른 두 객체가 같은 내용물인지 비교
    • boolean eqauls(Object obj) 사용 권장
    • a.eqauls(b)
      • 레퍼런스 a와 b가 이용하는 인스턴스(메모리)의 필드값이 각각 모두 같은가?

예제 6-4 : Rect 클래스와 eqauls() 만들기 연습 : [eqauls() 오버라이딩 수행]

  • int 타입의 width(너비) 와 height(높이) 필드를 가지는 Rect 클래스를 작성하고,
  • 면적이 같으면 두 Rect 객체가 같은 것으로 판별하는 eqauls() 작성하라. 생성자에서 너비와 높이를 받아 width, height 필드를 초기화 하라.
  • [참조] 매개변수의 데이터 타입을 Object 로 하는 이유?
    • 어떤 객체의 인자값이 전달되더라도, 해당 객체(인스턴스)는 Object 를 상속 받았다.
    • 따라서, 최상위 클래스인 Object 의 obj 라는 매개변수로 헤당 객체에 대해 업캐스팅이 가능하다. - 이후 다운 캐스팅한것을 참조변수 p 로 관리 ->
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

6.7 ) Wrapper 클래스

Wrapper 클래스

  • int, double 등의 기본 데이터 타입은 클래스가 아니다.

    • 3, 2.5 'a', True 등도 변수이지 객체(인스턴스)가 아니다.
    • 자바에서 제공하는 JDK 클래스는 객체(인스턴스)만을 이용하는 경우가 상당하므로 기본 데이터 타입을 이용할 수 없다는 문제점이 발생
    • 이를 해결하기 위해서 기본 데이터 타입을 객체로 표현하는 방법을 제공함 -> Wrapper 클래스
  • 자바 기본 데이터 타입을 클래스화한 8개 클래스 - 스트링은 자체가 클래스 타입이니까 포함 x

    기본 타입byteshortintlongcharfloatdouble
    Wrapper 클래스ByteShortIntegerLongCharacterFloatDouble
  • 용도

    • 기본 데이터 타입을 사용할 수 없고 객체만 사용하는 컬렉션에 기본 데이터 타입을 Wrapper 클래스로 만들어 사용

Wrapper 객체 생성

  • 기본 데이터 타입 또는 primitive type 이라고 표현되는 정수, 실수 들은
    "데이터" 그 자체이기 때문에 다양한 메소드들을 사용할 수 없다.
  • 하지만, 클래스 타입으로 Wrapper 된 정수, 실수 들은 클래스 타입이기 떄문에 제공되는 다양한 메소드 사용 가능!
  • Integer 클래스로 Wrapper 클래스를 만들때, 정수형태로 줄 수도 있고 문자열 형태로도 줄 수 있다
  • [추가 설명]
    • 정수 좌표 x,y 는 정수 데이터 2개이다. 이것을 클래스 Point로 만든 후, 두 점 사이의 길이를 구하는 메소드 등을 제공한다면, 단순 정수 데이터 보다 클래스로 표현하여 다양한 역할을 수행할 수 있게 된다.
    • 따라서, 기본 데이터 타입에 대한 Wrapper 클래스를 생성한 것!
// 기본 타입의 값으로 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"로 변환

Wrapper 클래스 활용

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

박싱과 언박싱

  • 박싱
    • 기본 데이터 타입을 Wrapper 객체로 변환하는 것
  • 언박싱
    • Wrapper 객체에 들어 있던 기본 타입의 값을 뺴내는 것

자동 박싱, 자동 언박싱

  • 자동 박싱
    • 기본 타입의 값을 자동으로 Wrapper 객체로 변환
  • 자동 언박싱
    • Wrapper 객체의 기본 타입 값을 자동으로 꺼내서 사용
// 자동 박싱, 기존 Integer ten = Integer.valueOf(10); 로 자동처리 
Integer ten = 10; 
// 자동 언박싱, 기존 int n = ten.intValue( ); 로 자동처리
int n = ten;

예제 6-6 : 박싱 언박싱

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

6.8 ) String 클래스

String의 생성과 특징

  • String - java.lang.String
    • 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)매개변수로 주어진 스트링 버퍼의 문자열을 스트링 객체로 생성

스트링 리터럴과 new String()

  • 스트링 생성
    //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"를 덧붙인 새로운 스트링 객체 리턴
  • 두 스트링을 비교할 때 반드시 equals() 를 사용해야함
    • eqauls() 는 내용을 비교하기 떄문
    • == 는 같은 레퍼런스인지 여부 비교 -> 현재 관리하고 있는 인스턴스(객체)가 동일한 것인지 확인할 때 사용

주요 메소드


문자열 비교

  • int compareTo(String anotherString)
    • 문자열이 같으면 0을 리턴
    • 이 문자열이 anotherString 보다 사전에 먼저 나오면 음수 리턴
    • 이 문자열이 anotherString 보다 사전에 나중에 나오면 양수 리턴
      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 리턴,
        • 문자열이 다르다면
          • 사전에 먼저 나오면 음수 리턴
          • 사전에 나중에 나오면 양수 리턴

문자열 연결

  • ++ 연산자로 문자열 연결
    • ++ 연산에 문자열이 포함되어 있으면 문자열 연결 연산으로 처리
    • ++ 연산에 객체가 포함되어 있는 경우
      • 객체.toString() 을 호출하여 객체를 문자열로 변환 후 문자열 연결
    • 기본 데이터 타입
      • 문자열로 변환된 후에 문자열 연결
        System.out.print("abcd" + 1 + true + 3.13e-2 + 'E' + "fgh");
        //abcd1true0.0313Efgh 출력
  • String concat(String str) 를 이용한 문자열 연결
    "I love ".concat("Java");  //는 "I love Java." 리턴
    • 기존 String 객체에 연결되지 않고 새로운 스트링 객체 생성 리턴

      String s1 = "abcd";
       String s2 = "efgh";
      
       s1 = s1.concat(s2);
    • 문자열 리터럴은 그 자체의 변형이 있으면 안되기 때문에 새로운 문자열 리터럴이 만들어졌고 새롭게 만들어진 내용을 s1 이라는 참조 변수가 관리를 해주는것임 -> abcdefgh (문자열 스트링 영역)

문자열 내의 공백 제거, 문자열의 각 문자 접근

  • 공백 제거 : String trim()
    • 스트링 앞 뒤 공백 문자(tab, enter, space) 제거한 스트링 리턴
      String a = "    abcd def    ";  //tab 키를 활용하여, 공백을 표현함
       String b = "    xyz\t";  
       String c = a.trim();  //c = "abcd def". 문자열 중간에 있는 공백은 제거되지 않음
       string d = b.trim();   //d = "xyz". 스페이스와 '\t' (탭키를 정확히 표현) 제거됨
  • 문자열의 문자 : 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 출력

예제 6-7 : String 클래스 메소드 활용

//기말고사 나올 확률 매우 높은 코드
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++
+

6.9 ) StringBuffer 클래스

  • 가변 크기의 문자열 저장 클래스

    • java.lang.StringBuffer
    • String 스트링과 달리 문자열 변경 가능
    • append 와 insert 메소드를 통해 스트링 조작 가능
    • StringBuffer 객체의 크기는 스트링 길이에 따라 가변적
  • 생성 : StringBuffer sb = new StringBuffer("Java");

  • 주요 메소드

  • StringBuffer의 메소드 활용 예

    • String 클래스는 처음 힙 메모리에 생성된 문자열의 크기가 변동 안됨.
    • 하지만, StringBuffer 는 메모리 확장 가능함

예제 6-8 : 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
  • (오버리이딩) 출력문의 sb 는 sb.toString() 으로 자동 바뀜
    • String과 StringBuffer 클래스는 toString 을 overriding 함
    • 문자열의 toString() 은 해당 참조 변수로 관리하는 영역의 문자열을 출력하라는 의미

6.10 ) StringToKenizer 클래스

  • java.util.StringTokenizer

    • 하나의 스트링을 구분 문자로 분리하여 토근 형태로 파싱
      • 스트링을 구분할 때 사용되는 문자들을 구분 문자(delimeter)
        //배열표현으로 한다, 이 예시에서 '&' 가 구분 문자
        String query = "name=kitae&addr=seoul&age=21"; 
        
        //StringTokenizer 객체 생성과 문자열 파싱
        StringTokenizer st = new StringTokenizer(query, "&");  // 구분 문자 '&'
        
        StringTokenizer st = new StringTokenizer(query, "&="); // 구분 문자 '&' 와 '='
  • 토큰 : 구분 문자로 분리된 스트링

  • String 클래스의 splite() 메소드를 이용하여 동일한 구현 가능

  • 생성자

  • 주요 메소드

예제 6-9 : StringTokenizer 클래스 메소드 활용

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

6.11 ) Math 클래스

  • 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)eae^{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()
      • 0.0 이상 1.0 미만의 임의의 double 값을 반환
      • 1에서 100사이의 난수 10개 발생시키는 샘플 코드
        for(int x=0; x<10; x++) {
        	 int n = (int)(Math.random()*100 + 1); // n은 [1~100] 사이의 랜덤 정수 
             System.out.println(n);
         }
        • Math.random()*100(0.099.99..)(0.0 \sim 99.99..) 사이의 실수 리턴
        • Math.random()*100+1(1.0100.99..)(1.0 \sim 100.99..) 사이의 실수 값
        • (int)(Math.random()*100 + 1) 는 소수점이하를 제거하여 (1100)(1 \sim 100) 사이의 정수 값
  • java.util.Random 클래스
    • 다양한 형태로 난수 발생 가능

6-10 : Math 클래스 메소드 활용

  • 참조 변수를 사용하지 않고도 사용 가능
  • java.lang.* 가 눈에 보이지 않게 import 되어 있다. 따라서 Math 클래스의 메소드들을 바로 이용 가능.
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 

6.12 ) Calendar

  • Calendar 클래스의 특징
    • java.util 패키지
    • 시간과 날짜 정보 관리
      • 년, 월, 일, 요일, 시간, 분, 초, 밀리초, 오전 오후 등
      • Calendar 클래스의 각 요소들을 설정하거나 알아내기 위한 필드들
        필드의미필드의미
        YEAR년도DAY_OF_MONTH한 달의 날짜
        MONTH달(0~11)DAY_OF_WEEK한 주의 요일
        HOUR시간(0~11)AM_PM오전인지 오후인지 구분
        HOUR_OF_DAY24시간을 기준으로 한 시간MINUTE
        SECONDMULLISECOND밀리초
        : 외울필요 x

Calendar 객체 생성 및 날짜와 시간

  • Calendat 객체 생성
    • Calendar 는 추상 클래스이므로 new Calendar() 하지 않음 \to now 라는 참조 변수로 접근
      • Calendar now = Calendar.getInstance(); 이용
      • now 객체는 현재 날짜와 시간 정보를 가지고 생성됨
  • 현재 날짜와 시간
    int year = now.get(Calendar.YEAR);  //now 에 저장된 년도
    int month = now.get(Calendar.MONTH)+1;  //now 에 저장된 달
  • 날짜와 시간 설정하기
    • 내가 관리할 날짜와 시간을 Calendar 객체를 이용하여 저장
      • Calendar 객체에 날짜와 시간을 설정한다고 해서 컴퓨터의 날짜와 시간을 바꾸진 못함

      • 컴퓨터의 시간과 날짜를 바꾸는 다른 방법 이용 \to 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분으로 설정

6-8 : Calendar 를 이용하여 현재 날짜와 시간 출력 및 설정

시간 정보를 어떻게 사용하는지만 알아두고 이 코드를 외우지 않아도 됨
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.
profile
공부한 것 기록용

0개의 댓글