ToBe끝판왕

[ JAVA ] java.util 패키지( Date 클래스 / Calendar 클래스 / Random 클래스 / StringTokenizer 클래스 / Scanner 클래스 / Stringjoiner 클래스 ) , 추상클래스 , 인터페이스 본문

■ 프로그래밍 SKILLS/JAVA

[ JAVA ] java.util 패키지( Date 클래스 / Calendar 클래스 / Random 클래스 / StringTokenizer 클래스 / Scanner 클래스 / Stringjoiner 클래스 ) , 추상클래스 , 인터페이스

업그레이드중 2022. 5. 26. 18:50
반응형

 


 

java.util 패키지

 

•  프로그램을 개발하는데 사용할 수 있는 유용한 유틸리티 클래스가 다수 포함되어 있다.

•  java.lang 패키지 다음으로 가장 많이 사용된다.

•  import문으로 패키지를 불러와야 클래스를 사용가능하다.

 

•  참고페이지

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/package-summary.html

 

java.util (Java SE 11 & JDK 11 )

 

docs.oracle.com

 

※ 유틸리티 클래스란 ?

•  여러 클래스에서 공통적으로 사용되는 메서드 중, 관련있는 메서드들끼리 모아서 클래스로 만든것

•  중복된 코드가 발생하지 않고 관리가 용이하다.

•  모든 메서드들이 static 이다.

•  인스턴스화가 필요없다.

•  private 접근제한자를 이용한다.

 


 

Date 클래스

 

•  날짜 및 시각정보를 관리하는 클래스이다.

•  대부분의 메서드가 deprecated로 처리되어 있어, 현재는 사용되지 않지만

   기존 API의 대다수가 Date 타입을 사용하고 있다.

 

 

▶  Date 클래스 예

import java.util.Date;

public class Date {

	public static void main( String[] args ) {
    	
        // 현재시간을 가져온다.
        // java.util.Date d = new java.util.Date() 와 같다.
    	Date d = new Date();
        
		// Overriding
		System.out.println( d );
		System.out.println( d.toString() );
		
		System.out.println( d.toLocaleString() );
		
		String strDate = d.toLocaleString();
		System.out.println( strDate.substring(0, 4) );
		System.out.println( strDate.substring(6, 8) );
		
        	// Method
        	// 1900 부터 해주어야 한다.
		System.out.println( d.getYear() + 1900 );
        	// 0부터 시작해서 +1 해주어야 한다.
		System.out.println( d.getMonth() + 1 );
		System.out.println( d.getDate() );
		System.out.println( d.getDay() );
    }
}

결과값

 

 

▶  Date 클래스 예

import java.util.Date;

public class Date {

	public static void main( String[] args ) {
    
		Date d = new Date( 2021-1900, 12-1, 25 );
		System.out.println( d.toLocaleString() );
		
		//2021년 2월 마지막 날
		Date d1 = new Date(2021 - 1900, 3-1, 0);
		System.out.println( d1.toLocaleString() );
		
		// timestamp
		System.out.println( d1.getTime() );
		Date d2 = new Date( d1.getTime() );
		System.out.println( d2.toLocaleString() );
    }
}

결과값

 


 

Calendar 클래스

 

•  날짜와 시간을 다루는 클래스이다.

•  Calendar 클래스가 추가되면서 Date클래스가 deprecated 되어 잘 사용하지 않게 되었다.

•  추상클래스이기 때문에 직접 new 하여 객체 생성이 불가능하다.

 

 

▶  Calendar 클래스 주요 상수

 

 

▶ Calendar 클래스 예

import java.util.Calendar;

publc class Calendar {

	public static void main( String[] args ) [
    
		Calendar c = Calendar.getInstance();
		
		System.out.println( c );
		
		System.out.println( c.get(Calendar.YEAR) );
		System.out.println( c.get(Calendar.MONTH) + 1 );
		System.out.println( c.get(Calendar.DATE) );
		System.out.println( c.get(Calendar.DAY_OF_WEEK) );
    }
}

결과값

 

 

▶ Calendar 클래스 예

 

import java.util.Calendar;
import java.util.Date;

public class Calnedar {

	public static void main( String[] args ) {
    
	Calendar c = Calendar.getInstance();
        
        c.set(2020, 11-1, 1);
        System.out.println(c.toString() );

        //위에서 설정한 날짜값을 출력하기
        System.out.println(c.getTime() );

        //위에서 설정한 날짜값을 보기 쉽게 출력하기
        Date d = c.getTime();
        System.out.println(d.toLocaleString() );

        //2020년 12월 31일의 요일을 알아내는 방법
        c.set(2021, 1-1, 1-1);
        System.out.println(c.get(Calendar.DAY_OF_WEEK ));

        String[] weeks = {"일", "월", "화", "수", "목", "금", "토"};
        System.out.println(weeks[c.get(Calendar.DAY_OF_WEEK )-1] );
        
    }
}

결과값

 

 

▶ Calendar 클래스 활용( 달력만들기 )

•  1일의 요일부터 계산

•  1일의 요일과 마지막 날짜를 알면 달력을 만들 수 있다.

•  1을 기준점으로 7번씩 회전한다. ( 마지막날까지 )

import java.util.Calendar;

public class CalendarEx {

	public static void main( String[] args ) {
    
     	int year = 2022;
        int month = 05;
        
        int startDayofWeek = 0;
        int endDay = 0;
        
        Calendar sDay = Calendar.getInstance();
        Calendar eDay = Calendar.getInstance();
        
        sDay.set( year, month-1, 1 );
        eDay.set( year, month, 1-1 );
        
        // 0 - 일요일( Date 클래스 )
        // 1 - 일요일( Calendar클래스 )
        startDayofWeek = sDay.get( Calendar.DAY_OF_WEEK );
        endDay = eDay.get( Calendar.DATE );
        
        System.out.println( startDayofWeek );
        System.out.println( endDay );
        
        // 세칸이 하나
        System.out.println(" SU MO TU ME TH FR SA");
        
        // 1일 이전 공백
        // 일요일부터 시작
        // 일요일이 1이기때문에 1부터
        for( int i=1; i<startDayofWeek; i++ ) {
        	System.out.print("   ");
        }
        
        // 달력 출력
        for( int i=1, n=startDayofWeek; i<=endDay; i++, n++ ) {
        
        	// 한자리수 두자리수 차이가 있어서 칸수 맞춰주기 위함이다.
            System.out.print( (i<10) ? "  "+i : " "+i);
        	
            // 7로 나누어 떨어지면 즉 토요일이면 enter
            if( n % 7 == 0 ) {
            	System.out.println();
            }
        }
    }
}

결과값

 


 

Random 클래스

 

•  난수를 생성하는 클래스로 객체를 생성하여 사용한다.

•  Random( long seed ) 로 종자값( seed ) 을 설정할 수 있다.

•  종자값 없이 Random( ) 으로 하면 실행시마다 다른 값이 나온다.

•  종자값이 같으면 같은값이 나온다.

 

 

▶ Random 클래스 메서드

•  nextBoolean( ) : boolean 타입의 난수 리턴

•  nextDouble( ) : double 타입의 난수 리턴

•  nextInt( ) : int 타입의 난수 리턴

•  nextInt( int n ) : int타입의 난수를 리턴 ( 범위 : 0 <= 난수 < n )

 

 

▶ Random 클래스 예

import java.util.Random;

public class Random {

	public static void main( String[] args ) [
    
    	int [] selectNumber = new int[6];
        
        Random random = new Random(3);
        
        for( int i=0; i<6; i++ ) {
        	
            // 1 ~ 46 정수 난수
            selectNumber[i] = random.nextInt(45) + 1;
            System.out.println( selectNumber[i] + " " );
        }
        
        System.out.println();
    }
}

결과값

 


 

StringTokenizer 클래스

 

•  우리가 지정한 구분자로 문자열을 쪼개주는 클래스

•  쪼개어진 문자열을 토큰( Token ) 이라고 부른다.

 

•  참고페이지

https://baby9235.tistory.com/43?category=1021977 

 

[ JAVA - 문자열 분리 ] StringTokenizer 클래스 / Split( ) 메서드

자바( JAVA ) 에서 문자열 구분을 위해 자주 사용되는 Split( ) 메서드와 StringTokenizer 클래스에 대해 정리해보려 한다. StringTokenizer 클래스 • java.util 패키지에 포함되어 있는 클래스 •  java.util..

baby9235.tistory.com

 

 

▶ StringTokenizer 클래스 사용방법

// 공백 기준( 기본 )
String data1 = "사과 딸기 수박";
StringTokenizer st1 = new StringTokenizer( data1 );

// 구분자 기준
String data2 = "사과&딸기&수박";
StringTokenizer st2 = new StringTokenizer( data2, "&" );

// 여러개 구분자 기준
String data3 = "X=100*(100+200)/3";
StringTokenizer st3 = new StringTokenizer( data3, "=*+/()" );

 

▶  StringTokenizer 메서드

•  countTokens( ) : 토큰의 개수

•  nextToken( ) : 다음 토큰을 가리킨다( 각 노큰의 값을 출력 )

•  hasMoreTokens( ) : 다음 토큰이 있으면 true, 없으면 false

 

 

▶  StringTokenizer 클래스 예

import java.util.StringTokenizer;

public class StringTokenizer {

	public static void main(String[] args) {
        
        String data1 = "사과&배&복숭아";
        StringTokenizer st1 = new StringTokenizer( data1, "&" );

        String data2 = "x=100*(200+300)/2";
        StringTokenizer st2 = new StringTokenizer( data2, "=*+/()" );

        //토큰의 개수 출력
        System.out.println( st2.countTokens() );

        while ( st2.hasMoreTokens() ) {
            System.out.println( st2.nextToken() );
        }
    }
}

결과값

 

 

▶ Split( ) 와의 차이

split( ) 는 있는 그대로 출력하고 StringTokenizer는 공백을 없앤다.

 

ex)

import java.util.StringTokneizer;

public class StringTokenizer {

	public static void main( String[] args ) {
    
    	String data = "사과&수박&&&딸기";
        
        StringTokenizer st = new StringTokenizer( data, "&" );
        String[] datas = data.split( "&" );
        
        System.out.println( st.countTokens() );
        System.out.println( datas.length );
        
        int i=1;
        while( st.hasMoreTokens() ) {
        	System.out.println( i + " : " + st.nextToken() );
        	i++;
        }
        
        i=1;
        for( String d : datas ) {
        	System.out.println( i + " : " + d ) ;
            i++;
        }
    }
}

결과값

 


 

Scanner 클래스

 

•  기본적인 데이터 타입들 ( 정수 / 실수 / 문자열 )을 Scanner 클래스의 메서드를 사용하여 입력받을 수 있다.

•  실제 입력은 System.in 에서 한다. ( Scanner 클래스와 짝궁이라고 할 수 있다. )

•  공백( 띄어쓰기 ) 또는 개행( 줄바꿈 ) 을 기준으로 읽는다.

 

•  참고페이지

https://baby9235.tistory.com/34?category=1021977

 

[ JAVA - 입출력 ] Scanner / BufferedReader / InputStream

알고리즘 문제를 풀때 시간제한이 걸려있는 문제들 관련해서 입출력 문제에 있어서 자주 언급되는 Scanner와 BufferedReader에 대해 정리해보려 한다. Scanner 클래스 •  java.util.Scanner ; ( import ) • ..

baby9235.tistory.com

 

 

▶  Scanner클래스 예

import java.util.Scanner;

public class Scanner {

	public static void main( String[] args ) {
    
    	Scanner sc = new Scanner( System.in );
        
        System.out.print( "입력 : " );
        
        // next()에서 입력이 될때까지 기다리다가 enter키가 입력되면 다음 진행
        // 만약 space바가 입력 값 사이에 입력되면 첫번째 값만 가져온다.
        // 여러개의 next() => 여러개 입력받을 수 있다.
        String msg1 = sc.next();
        String msg2 = sc.next();
        
       	System.out.println( "입력된 메시지 : " + msg1 );
        System.out.println( "입력된 메시지 : " + msg2 );
        
        
        // nextLine()은 문장을 입력할 수 있다.
        // space에서 안끊기고 다 저장이 된다.
    	String msg3 = sc.nextLine();
        int msg4 = sc.nextInt();
        
        System.out.println( "입력된 메시지 : " + msg3 );
        System.out.println( "입력된 메시지 : " + msg4 );
        
        sc.close();
    
    }
}

결과값

 

 

import java.util.Scanner;

public class Scanner {

	public static void main( String[] args ) {
    
    	Scanner sc = new Scanner( System.in );
        
        System.out.print( "입력 : " );
        
        // nextLine()은 문장을 입력할 수 있다.
        // space에서 안끊기고 다 저장이 된다.
    	String msg3 = sc.nextLine();
        int msg4 = sc.nextInt();
        
        System.out.println( "입력된 메시지 : " + msg3 );
        System.out.println( "입력된 메시지 : " + msg4 );
        
        sc.close();
    
    }
}

결과값

 

 

 

▶  Scanner클래스 활용문제( 구구단 )

 

•  입력값 검사

•  q 입력하면 구구단 종료

import java.util.Scanner;

public class Scanner {

	public static void main( String[] args ) {
    
    	while( true ) {
            Scanner sc = new Scanner( System.in );

            System.out.print( "단수를 입력하세요( 2~9 까지 입력 ) : " );
            String dansu = sc.next();

            // 입력값 검사
            if( dansu.equals( "q" ) ) {
                System.out.print( "프로그램을 종료합니다." );
                System.exit(0);
            }
        
            if( (int)dansu.toCharArray()[0] <= 49 || (int)dansu.toCharArray()[0] >57 ) {
                System.out.println( "틀린 단수입니다. 다시 입력해주세요." );
                continue;
            }
        
            // 계산
            int dansu1 = Integer.parseInt( dansu );
            System.out.println( dansu1 + "단 출력" );
            for( int i=1; i<=9; i++ ) {
                System.out.println( dansu1 + " X " + i + " = " + i*dansu1 );
            }
        }
    }
}

결과값

 


 

StringJoinner 클래스

 

▶  문자열 ( String ) 합치는 여러가지 방법

1) + 연산자 이용

2) format( ) 사용

3) join ( ) 사용

4) StringJoinner 클래스 사용

 

 

▶  String 합치는 예

import java.util.StringJoiner;

public class StringJoinner {

	public static void main( String[] args ) {
    
    	// 문자열 연걸 1번
        // + 연산자 사용
        String str1 = "apple" + ",banana" + ",strawberry";
        System.out.println( " +연산자 사용 : " + str1 );
        
        // 문자열 연결 2번
        // format() 사용
        String str2 = String.format( "%s,%s,%s", "apple", "banana", "strawberry" );
        System.out.println( " format() 사용 : " + str2 );
        
        // 문자열 연결 3번
        // 배열과 join()을 사용
        String[] arr = { "apple", "banana", "strawberry" };
        String str3 = String.join( ",", arr );
        System.out.println( " join() 사용 : " + str3 );
        
        // 문자열 연결 4번
       	// StringJoiner 클래스 , add 메서드 사용
        StringJoiner sj = new StringJoiner( "," );
        sj.add( "apple" ).add( "banana" ).add( "strawberry" );
        System.out.println( " StringJoiner사용 : " + sj );
    }
}

결과값

 


 

추상클래스

 

•  추상( abstract )는 공통되는 특성을 추출하는것을 의미한다.

•  객체를 직접 생성할 수 있는 실체클래스들의 공통적인 특성을 추출해서 선언한 것

•  추상클래스가 부모이고 실체클래스가 자식이다.

•  객체를 직접 생성하지 못한다.

•  추상클래스는 new연산자를 사용해서 인스턴스를 생성하지 못한다.

 

 

 

▶  추상클래스의 용도

•  실체 클래스들의 공통된 필드와 메서드의 이름을 통일할 목적

-  추상클래스에서 메서드명을 고정하고 다른 클래스들이 상속받아서 override 하게 만든다.

 

•  실체 클래스를 작성할 때 시간 절약

-  상속받기만해서 사용하기 때문에

 

 

▶  추상클래스의 선언

•  class 앞에 abstract를 붙인다.

•  추상클래스를 객체화 하기 위해선, 상속을 통해서 실체클래스로부터 객체를 만들어야 한다.

class Parent1 {
	Parent1() {
    	System.out.println( "Parent1 생성" );
    }
}

// 추상클래스 만들기
abstract class Parent2 {
	Parent2() {
    	System.out.println( "Parent2 생성" );
    }
}

class Child extends Parent2 {
	Child() {
    	System.out.println( "Child 생성" );
    }
}

public class Abstract {
	
    public static void main( String[] args ) {
    	
        Parent1 p1 = new Parent1();
        // Parent2 p2 = new Parent2()  생성 불가능
        
        Child c1 = new Child();			// 추상클래스인 부모생성자와 실체클래스인
						// 자식생성자를 불러온다.
    }
}

 

 

▶  추상 메서드

•  일반 클래스는 추상메서드를 가질 수 없다.

•  추상클래스만 추상메서드를 가질 수 있다.

•  abstract 클래스는 상속받아야 인스턴스화 되어 쓸 수 있다.

•  abstract 메서드는 abstract 클래스 안에서 선언되어, abstract 클래스를 상속받은 클래스내에서 

   구현되어야 쓸 수 있다.

 

=> abstract 클래스 / abstract 메서드 모두 선언 후에, 상속을 통해 상속받은 클래스가

     인스턴스화 / 구현을 해줘야 사용이 가능하다는 것이다.

abstract class Animal {
    public String kind;

    public void breathe() {
        System.out.println( "숨을 쉽니다." );
    }
    
    //추상메소드
    public abstract void sound();
}

class Dog extends Animal {
    public Dog() {
        this.kind = "포유류";
    }
    
    // 추상메소드 재정의
    // Dog클래스에 맞게
    @Override
    public void sound() {
        System.out.println( "멍멍" );
    }
}

class Cat extends Animal {
    public Cat() {
        this.kind = "포유류";
    }
    
    // 추상메소드 재정의
    // Cat클래스에 맞게
    @Override
    public void sound() {
        System.out.println( "야옹" );
    }
}

public class Abstract {

    public static void main( String[] args ) { 
    
        Dog dog = new Dog();
        Cat cat = new Cat();
        
        dog.sound();
        cat.sound();
    }
}

 


 

인터페이스

 

•  객체의 사용방법을 정의한 타입

•  객체의 교환성을 높여주기 때문에 다형성을 구현하는데 매우 중요한 역할

•  개발코드와 객체가 서로 통신하는 접점역할을 한다.

   ( 개발코드가 인터페이스 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출한다. )

•  개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 만든다.

•  인터페이스는 여러 객체들과 사용이 가능하기 때문에, 코드 변경없이 실행 내용과 리턴값을 다양화 할 수 있다는

   장점을 가진다.

 

 

▶  인터페이스 선언

•  상수, 추상 메서드, 디폴트 메서드, 정적메서드 만 선언 가능

•  객체 생성이 불가능하기 때문에 생성자를 가질 수 없다.

•  접근제한이 생략되어 있다면 public 이 생략되어 있는 것

[public] interface 인터페이스명 { 내용 }

 

 

▶  인터페이스 사용

interface InterA {

    //상수
    public static final String STR1 = "홍길동";
    
    //추상메소드
    public abstract void method1();
}

interface InterB {

    //상수
    public static final String STR1 = "이몽룡";
    
    //추상메소드
    public abstract void method3();
}

class ClassA implements InterA, InterB { //다중상속

    public void method1() {
        System.out.println( "method1 호출" );
    }
    
    public void method2() {
        System.out.println( "method2 호출" );
    }
    
    public void method3() {
        System.out.println( "method3 호출" );
    }
}

public class InterfaceEx {

    public static void main( String[] args ) { 
    
        ClassA a = new ClassA();
        a.method1();
        a.method2();
        a.method3();
        System.out.println(InterA.STR1);
        System.out.println(InterB.STR1);
    }
}

 

 

▶  인터페이스끼리 상속

interface InterA {

    String STR1 = "홍길동";
    void methodA();
}

//인터페이스끼리 상속
interface InterB extends InterA {

    String STR2 = "박문수";
    void methodB();
}

class Child implements InterB {

    public void methodA() {
        System.out.println( "methodA 호출" );
    }
    
    public void methodB() {
        System.out.println( "methodB 호출" );
    }
}


public class InterfaceEx {

    public static void main( String[] args ) { 
    
        Child c = new Child();
        c.methodA();
        c.methodB();
        System.out.println( c.STR1 );
        System.out.println( c.STR2 );
    }
}

 

 

▶  인터페이스 상속과 구현 동시에 받기

interface InterA {
    String STR1 = "홍길동";
    void methodA();
}
//인터페이스끼리 상속
interface InterB extends InterA {
    String STR2 = "박문수";
    void methodB();
}

class Parent {
    Parent() {
        System.out.println("Parent 생성자");
    }
}

//상속과 구현을 동시에 받는 클래스
class Child extends Parent implements InterB {

    Child() {
        System.out.println( "Child 생성자" );
    }
    
    public void methodA() {
        System.out.println( "methodA 호출" );
    }
    
    public void methodB() {
        System.out.println( "methodB 호출" );
    }
}

public class InterfaceEx {

    public static void main( String[] args ) { 
    
        Child c = new Child();
        c.methodA();
        c.methodB();
        System.out.println(c.STR1);
        System.out.println(c.STR2);
    }
}

 

 

▶  인터페이스 추상메서드 / 디폴트 메서드 / 정적메서드의 선언

//인터페이스 선언
interface RemoteControl {

    //상수
    int MAX_VOLUME = 10;
    int MIN_VOLUME = 10;

    //추상메소드
    void turnOn();
    void turnOff();
    void setVolmn(int volumn);

    //디폴트 메소드
    default void setMute(boolean mute) {
    
        if(mute) {
            System.out.println( "무음 처리합니다." );
        } else {
            System.out.println( "무음 해제합니다." );
        }
    }

    //정적 메소드
    static void changeBattery() {
        System.out.println( "건전지를 교체합니다." );
    }
}

//구현클래스
class Television implements RemoteControl {

    //필드
    private int volumn;

    //실체메소드 작성
    public void turnOn() {
        System.out.println( "TV를 켭니다." );
    }
    public void turnOff() {
        System.out.println( "TV를 끕니다." );
    }
    public void setVolmn( int volumn ) {
    
        if (volumn > RemoteControl.MAX_VOLUME) {
            this.volumn = RemoteControl.MAX_VOLUME;
        } else if (volumn < RemoteControl.MIN_VOLUME) {
            this.volumn = RemoteControl.MAX_VOLUME;
        } else {
            this.volumn = volumn;
        }
        System.out.println( "현재 TV 볼륨: " + this.volumn );
    }
}


public class RemoteControlEx {

    public static void main( String[] args ) { 
    
        RemoteControl rc;
        rc = new Television();
        rc.turnOn();
        rc.setVolmn(11);
        RemoteControl.changeBattery();
        rc.setMute(true);
        rc.setMute(false);
        rc.turnOff();
        
    }
}

 

반응형
Comments