반응형
*        보조스트림 : 다른 스트림과 연결되어 편리한 추가 기능을 제공해주는 객체
*        예) 문자 변환, 입출력속도향상, 객체 직렬화 등
*        기능 추가 방법 : new 보조스트림클래스(기본스트림클래스)
*        => 디자인패턴 : 데코레이션 패턴
*        => 예) new 보조스트림클래스2(보조스트림클래스(1기본스트림클래스))
*        1) 문자 변환 : 소스파일이 byte 기반 입출력 파일인데 문자 기능을 추가
*           => OutputStreamWriter, InputStreamReader
*        2) 성능 향상 : 기본적으로 제공하는 버퍼는 크기가 작음
*           => BufferedOutputStream/BufferedInputStream
*        3) 기본자료형 입출력 : InputStream/OutputStream => 1byte, char
*           => DataInputStream/DataOutputStream
*           => 기본자료형 int, double, String 자료형을 사용해서 입출력할 수 있음

 

// 파일 쓰기 함수
public class CharConvertApplication {
    public static void write(String str) throws Exception {
        // TODO : byte 파일 쓰기용 파일 생성
        FileOutputStream fos = new FileOutputStream("src/main/resources/test1.txt");

        // TODO : 보조 스트림 사용 : 문자 기반 객체로 변환 : new 보조스트림(기본스트림)
        Writer writer = new OutputStreamWriter(fos);
        // TODO : 파일에(버퍼) 쓰기
        writer.write(str);
        writer.flush();
        writer.close();
    }

    // 파일 읽기 함수
    public static String read() throws Exception {

        // TODO : 파일을 읽기용으로 접근(기본스트림)
        FileInputStream fileInputStream =
                new FileInputStream("src/main/resources/test1.txt");

        // TODO : 보조스트림 기능 더하기 : new 보조스트림(기본스트림)
        Reader reader = new InputStreamReader(fileInputStream);

        // TODO : 속도 향상 : 배열 만들기
        char[] buffer = new char[100];

        // TODO : 파일 읽기
        int readNum = reader.read(buffer);  // 한번에 100문자 읽기
        reader.close(); // 파일 닫기

        // TODO : char[] -> String 바꾸기
        String data = new String(buffer,0, readNum);

        return data;
    }

    public static void main(String[] args) throws Exception{

        // 파일 쓰기 함수 호출 : 파일 생성(문자 변환 스트림을 사용합니다.)
        write("문자 변환 스트림을 사용합니다.");
        // 파일 읽기 함수 호출
        String data = read();
        System.out.println(data);
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

보조스트림 : 기본 자료형으로 입출력하기  (0) 2023.10.02
파일 복사 성능 테스트(일반복사 vs 버퍼 사용복사)  (0) 2023.10.02
입출력 Stream  (0) 2023.09.27
Arrays 클래스  (0) 2023.09.27
Stream 클래스  (0) 2023.09.27
반응형
*      스트림 뜻 : 가상의 통로
*      입출력 스트림(InputStream/OutputStream) : 자바에서는 데이터는 스트림을
*      통해 입출력이 이루어짐, 읽기용(Input)/쓰기용(Output)에 따라 각자 클래스를
*      만듬
*      => 대표 4가지 부모 클래스 소개
*      InputStream : 1byte 기반 입력(==읽기용), 최상위 추상 클래스
*      OutputStream : 1byte 기반 출력(==쓰기용), 최상위 추상 클래스
*      Reader : 문자기반(char:2byte) 입력(==읽기용), 최상위 추상 클래스
*      Writer : 문자기반(char:2byte) 출력(==쓰기용), 최상위 추상 클래스
*      활용 : InputStream/OutputStream : 주로 멀티미디어 파일(동영상, 이미지등)
*            Reader/Writer            : 주로 텍스트 파일에 활용

1Byte 기반 입력/출력

package chap15.sec01.exam01;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class WriteApplication {
    public static void main(String[] args) throws Exception {
//      TODO: 파일 출력용(==쓰기용) 객체 생성
//        자식 클래스 : FileOutputStream
//        사용법: OutputStream outputStream = new FileOutputStream(경로);
//        gradle(빌드) 의 기본경로(root 경로) : build.gradle 파일이 있는 위치
        OutputStream outputStream
                = new FileOutputStream("src/main/resources/test1.db");

        byte a = 10;
        byte b = 20;
        byte c = 30;

//        TODO: 파일에 쓰기 : outputStream.write(값)
//         버퍼(buffer) : 임의의 메모리 배열공간 : 값을 저장
//         장점 : 파일입출력에 바로 접근하는 행위 : 속도가 굉장히 느림
//             => 임시배열(buffer)에 모아놓고 한번에 파일에 쓰기를 함
        outputStream.write(a);
        outputStream.write(b);
        outputStream.write(c);
//        TODO: 버퍼에 내용을 진짜 파일에 쓰기
        outputStream.flush();
//        TODO: 파일 닫기(무조건)
        outputStream.close();
    }
}
배열을 파일에 쓰기
package chap15.sec01.exam02;

import java.io.FileOutputStream;
import java.io.OutputStream;

/**
* packageName : chap15.sec02
* fileName : WriteApplication
* author : GGG
* date : 2023-09-27
* description : 1byte 배열을 파일에 쓰기(출력)
* 요약 :
*
* ===========================================================
* DATE            AUTHOR             NOTE
* —————————————————————————————
* 2023-09-27         GGG          최초 생성 */
public class WriteApplication {
    public static void main(String[] args) throws Exception {
//        TODO : 파일을 쓰기용(출력용)으로 열기
        OutputStream outputStream =
                new FileOutputStream("src/main/resources/test2.db");

//        TODO : 배열 준비
        byte[] array = {10, 20, 30};
//        TODO : 배열 -> 파일에(버퍼) 쓰기 :  outputStream.write(배열)
        outputStream.write(array);
//        TODO : 버퍼 내용 -> 진짜 파일 쓰기
        outputStream.flush();
//        TODO : 파일 닫기
        outputStream.close();
    }
}

 

배열 중 일부 데이터만 파일에 쓰기
package chap15.sec01.exam03;

import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * packageName : chap15.sec01.exam03
 * fileName : WriteApplication
 * author : GGG
 * date : 2023-09-27
 * description : 배열 중 일부 데이터만 파일에 쓰기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-27         GGG          최초 생성
 */
public class WriteApplication {
    public static void main(String[] args) throws Exception{
//      TODO: 파일을 쓰기용(출력용)으로 열기
        OutputStream outputStream =
                new FileOutputStream("src/main/resources/test3.txt");
//      TODO: 배열 일부만 쓰기
        byte[] array = {10,20,30,40,50};
//      TODO: outputStream.write(배열변수, 시작인덱스, 개수)
        outputStream.write(array, 1, 3); // 20,30,40
//      TODO: 버퍼 -> 파일
        outputStream.flush();
        outputStream.close(); // 파일 닫기
    }
}

 

파일 읽기
package chap15.sec01.exam04;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * packageName : chap15.sec01.exam04
 * fileName : ReadApplication
 * author : GGG
 * date : 2023-09-27
 * description : 1byte 씩 파일 읽기 (byte 파일 : 이진파일(binary file))
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-27         GGG          최초 생성
 */
public class ReadApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일읽기용(==입력용) 파일 접근
        InputStream inputStream =
                new FileInputStream("src/main/resources/test1.db");

        // TODO : 반복문으로 1byte 씩 읽고 화면에 출력하기
        while (true){
            // TODO : 파일 읽기(1byte) => 리턴 : 읽은 값이(1byte) 리턴됨(1byte씩 자동증가)
            //                             => 읽은 값이 파일의 끝이라면 -1이 리턴됨
            int data = inputStream.read();
            // TODO : 반복문 종료조건 : 파일의 끝
            if(data == -1) break;
            // TODO : 화면 출력
            System.out.println(data);
        }

        // TODO : 파일 닫기
        inputStream.close();

    }
}

 

배열의 크기 만큼 파일에서 읽기
package chap15.sec01.exam05;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * packageName : chap15.sec01.exam05
 * fileName : ReadApplication
 * author : GGG
 * date : 2023-09-27
 * description : 배열의 크기만큼 파일에서 읽기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-27         GGG          최초 생성
 */
public class ReadApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 읽기용(입력)으로 접근
        InputStream inputStream =
                new FileInputStream("src/main/resources/test2.db");

        // TODO : 성능향상 : 1byte -> 여러 byte씩 한번에 읽기
        byte[] buffer = new byte[100];

        // TODO : 반복문
        while (true){
            // TODO : 파일 읽기 : buffer(배열크기 만큼)
            //   -> buffer : 파일에서 읽은 내용이 저장
            //   -> 리턴 : 파일에서 읽은 byte 수가 리턴됨, 파일의 끝 : -1
            int data = inputStream.read(buffer);
            if(data == -1) break;   // 종료 조건
            // TODO :  읽은 내용 화면 출력 : buffer 배열 출력, data(읽은 파일 byte 수)
            for (int i = 0; i < data; i++) {
                System.out.println(buffer[i]);
            }
        }
        // TODO : 파일 닫기
        inputStream.close();

    }
}
파일에서 지정된 크기 만큼 파일 읽기
package chap15.sec01.exam06;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * packageName : chap15.sec01.exam06
 * fileName : ReadApplication
 * author : GGG
 * date : 2023-09-27
 * description : 파일에서 지정된 길이 만큼만 읽기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-27         GGG          최초 생성
 */
public class ReadApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 읽기로(입력용) 열기
        InputStream inputStream =
                new FileInputStream("src/main/resources/test3.txt");

        // TODO : 읽기용 배열 크기 지정
        byte[] buffers = new byte[5];

        // TODO : 일부만 읽기 : (인덱스 2번부터 읽어서 3개 저장 : buffers)
        int data = inputStream.read(buffers, 2, 3);

        // TODO : 화면 출력
        if(data != -1) {
            for (int i = 0; i < buffers.length; i++) {
                System.out.println(buffers[i]);
            }
        }
        // TODO : 파일 닫기
        inputStream.close();
    }
}

 

문자기반 입력/출력

한 문자씩 파일에 쓰기(출력)
public class WriteApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 쓰기용(출력용) 생성(문자기반(char) : 2byte)
        //  사용법 : Writer 변수 = new FileWriter("파일생성경로");
        Writer writer = new FileWriter("src/main/resources/test7.txt");
        // TODO : 파일에 쓸 변수
        char a = 'A';
        char b = 'B';
        char c = 'C';
        // TODO : 파일(임시버퍼) 쓰기 : writer.write(변수명);
        writer.write(a);
        writer.write(b);
        writer.write(c);
        // TODO : 임시버퍼 -> 진짜 파일에 쓰기
        writer.flush();
        writer.close();
    }
}

 

배열 전체를 파일에 쓰기
public class WriteApplication {
    public static void main(String[] args) throws Exception {
//        TODO : 파일 열기(문자기반)
        Writer writer = new FileWriter("src/main/resources/test8.txt");

        // TODO : 배열 정의
        char[] array = {'A', 'B', 'C'};
        // TODO : 파일(임시버퍼) 쓰기
        writer.write(array);
        // TODO : 임시버퍼 -> 진짜파일에 쓰기
        writer.flush();
        writer.close();

    }
}

 

배열의 일부분만 파일에 쓰기
public class WriteApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 생성(문자기반)
        Writer writer = new FileWriter("src/main/resources/test9.txt");

        // TODO : 배열 정의
        char[] array = {'A','B','C','D','E'};

        // TODO : 일부만 파일에 쓰기
        writer.write(array, 1, 3);  // BCD
        // TODO : 임시 버퍼 -> 진짜파일에 쓰기
        writer.flush();
        writer.close();



    }
}

 

문자열을 파일에 쓰기
public class WriteApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 생성(문자기반)
        Writer writer = new FileWriter("src/main/resources/test10.txt");

        // TODO : 문자열 준비
        String str = "ABC";
        // TODO : 파일에 쓰기
        writer.write(str);
        // TODO : 임시버퍼 -> 진짜파일에 쓰기
        writer.flush();
        writer.close();
    }
}

 

한 문자씩 읽기
public class ReadApplication {
    public static void main(String[] args) throws Exception {
        // TODO: 파일 읽기용(입력용)으로 열기
        Reader reader = new FileReader("src/main/resources/test7.txt");

        // TODO: 무한 반복문 실행
        while (true){
            // TODO : 한 문자씩 읽기(자동증가) => 리턴 : 아스키코드값이 리턴됨
            int data = reader.read();
            // TODO : 반복문 종료조건 : 파일의 끝 -1
            if(data == -1) break;
            // TODO : 읽은 것을 화면 출력
            System.out.println((char)data);     // 아스키코드값이 문자로 변환
        }
        reader.close(); // 파일 닫기
    }
}

 

배열의 길이 만큼 읽기
public class ReadApplication {
    public static void main(String[] args) throws Exception {
        // TODO : 파일 읽기용으로 접근(문자기반)
        Reader reader =
                new FileReader("src/main/resources/test8.txt");

        // TODO : 버퍼 배열 준비 : 속도 향상 -> 배열 크기만큼 한번에 읽기
        char[] buffer = new char[100];

        // TODO : 무한 반복문
        while (true){
            // TODO : 파일 읽기(배열크기만큼) : buffer에 읽은 내용이 저장됨
            //            리턴 : 읽은 문자수, 파일의 끝은 -1
            int readNum = reader.read(buffer);
            // TODO : 종료 조건
            if(readNum == -1) break;
            // TODO : 화면 출력
            for (int i = 0; i < readNum; i++) {
                System.out.println(buffer[i]);
            }
        }
        reader.close();
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

파일 복사 성능 테스트(일반복사 vs 버퍼 사용복사)  (0) 2023.10.02
보조스트림  (0) 2023.09.27
Arrays 클래스  (0) 2023.09.27
Stream 클래스  (0) 2023.09.27
Optional 클래스  (0) 2023.09.27
반응형

Arrays 클래스의 유용한 함수들

 

public class ArraysApplication {
    public static void main(String[] args) {
        int[] arr = {0,1,2,3,4};
        int[][] arr2D = { {11,12,13}, {21,22,23}};

    }
}
배열을 문자열로 변환
//        TODO : 1) 배열 -> 문자열로 변환
        System.out.println(Arrays.toString(arr));   // 1차원 배열
        System.out.println(Arrays.deepToString(arr2D));   // 2차원 배열

 

배열 복사
int[] arr2 = Arrays.copyOf(arr, arr.length); // 전체 복사(깊은 복사)
int[] arr3 = Arrays.copyOfRange(arr, 2, 4);     // 2부터 (4-1) 인덱스까지 일부 복사
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr3));

 

배열 동등비교
System.out.println(Arrays.equals(arr, arr2));   // true (틀리면 false)

 

배열 오름차순 정렬
char[] chArr = {'A', 'D', 'C', 'B', 'E'};
Arrays.sort(chArr);
System.out.println(Arrays.toString(chArr)); // 결과 출력

 

이진탐색(결과, 조회) : 리턴값 -> 인덱스번호
// 사용시 미리 정렬해야함!!
System.out.println("B의 인덱스 번호 : " + Arrays.binarySearch(chArr, 'B'));

 

결과값

--- 배열 -> 문자열 변환 ---
[0, 1, 2, 3, 4]
[[11, 12, 13], [21, 22, 23]]


--- 배열 복사 ---
[0, 1, 2, 3, 4]
[2, 3]


--- 배열 동등 비교 ---
true


--- 배열 오름차순 정렬 ---
[A, B, C, D, E]


--- 이진탐색 ---
B의 인덱스 번호 : 1

반응형

'Java > Java 이론' 카테고리의 다른 글

보조스트림  (0) 2023.09.27
입출력 Stream  (0) 2023.09.27
Stream 클래스  (0) 2023.09.27
Optional 클래스  (0) 2023.09.27
제네릭  (0) 2023.09.27
반응형
*      1) Stream 은 함수형 프로그래밍에서 차용한 클래스로 내부적으로 반복문이 자동 실행됨
*      2) Stream 은 정렬된 결과를 자료구조(컬렉션프레임워크)으로 결과 내보내기가 가능함
*      3) Stream 은 함수(메소드) 체이닝을 이용 (jquery 사용)
*         예) 함수().함수2()....
*      4) Stream 원본을 조작하지 않고 복사본을 사용함
*      5) Stream 사용규칙 : (1) 정의 (2) 가공 (3) 결과 내보내기 : 3단계 규칙
package chap14.sec01.exam03;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * packageName : chap14.sec01.exam03
 * fileName : SteamApplication
 * author : GGG
 * date : 2023-09-27
 * description : Stream 클래스 : 함수형 프로그래밍 기법 받아들임
 * 요약 :
 *      1) Stream 은 함수형 프로그래밍에서 차용한 클래스로 내부적으로 반복문이 자동 실행됨
 *      2) Stream 은 정렬된 결과를 자료구조(컬렉션프레임워크)으로 결과 내보내기가 가능함
 *      3) Stream 은 함수(메소드) 체이닝을 이용 (jquery 사용)
 *         예) 함수().함수2()....
 *      4) Stream 원본을 조작하지 않고 복사본을 사용함
 *      5) Stream 사용규칙 : (1) 정의 (2) 가공 (3) 결과 내보내기 : 3단계 규칙
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-27         GGG          최초 생성
 */
public class StreamApplication {
    public static void main(String[] args) {
//        TODO : 샘플 ArrayList
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("ball");
        list.add("car");
        list.add("daddy");
        list.add("ear");
        list.add("fox");

//        TODO : 단순 출력 : forEach
//         list.forEach(System.out::println);
//         사용법 : 매개변수 -> 실행문(매개변수);     // 람다식(화살표함수)
        list.forEach(s -> System.out.println(s));

//        TODO : map 함수 ( 배열의 값을 조작 : 배열의 개수 동일 )
//         예제 : 리스트 값들을 모두 대문자로 변경
        System.out.println("---- map 함수 ----");
//        TODO : 스트림 사용
//            1) 정의 : list.stream()
//            2) 가공 : .map(s -> s.toUpperCase())
//            3) 결과내보내기 : .collect(Collectors.toList());
//             .collect(자료구조)
//             => Collectors.toList() : 리스트로 내보내기
        List<String> list2 = list.stream()
                .map(s -> s.toUpperCase())
                .collect(Collectors.toList());
//        결과 출력
        list2.forEach(s -> System.out.println(s));

        System.out.println("---- filter 함수 ----");

//        TODO : filter 함수 ( 배열의 값을 조작 : 배열의 개수 다름 )
//         예제 : 문자의 길이가 3자 이상만 뽑아내기
        List<String> list3 = list.stream()
                .filter(s -> s.length() > 3)
                .collect(Collectors.toList());
//        결과 출력
        list3.forEach(s -> System.out.println(s));

        System.out.println("---- array로 내보내기 ----");
//        TODO (참고) array 로 내보내기
        Object[] obj = list.stream()
                .filter(s -> s.length() > 3)
                .toArray(); // 배열로 내보내기
//        결과 출력
        for (Object o: obj) {
            System.out.println((String) o);
        }


    }
}

apple
ball
car
daddy
ear
fox
---- map 함수 ----
APPLE
BALL
CAR
DADDY
EAR
FOX
---- filter 함수 ----
apple
ball
daddy
---- array로 내보내기 ----
apple
ball
daddy

 

 

반응형

'Java > Java 이론' 카테고리의 다른 글

입출력 Stream  (0) 2023.09.27
Arrays 클래스  (0) 2023.09.27
Optional 클래스  (0) 2023.09.27
제네릭  (0) 2023.09.27
날짜 함수  (0) 2023.09.26
반응형

Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)입니다.

따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있습니다.

 

Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있습니다.

즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.

 

Optional 객체의 생성

of() 메소드나 ofNullable() 메소드를 사용하여 Optional 객체를 생성할 수 있습니다.

 

public class OptionalApplication {
    public static void main(String[] args) {
//        TODO : Optional 객체
//         사용법 : Optional.of(값) : Optional 객체에 들어감
//        String str = "abcde";
        Optional<String> optional = Optional.of("abcde");

//        TODO : 가져오기(꺼내기) : 옵셔널객체변수.get()
        System.out.println(optional.get()); // abcde 출력

//        TODO : 정수 넣기
        Optional<Integer> optional2 = Optional.of(0);

//        TODO : 빈것 넣기
        Optional<Object> optional3 = Optional.empty(); // 빈 것

//        TODO : 현재 옵셔널 객체에 값이 있는지 확인 : isPresent() : 있으면 true / 없으면 false
        System.out.println(optional2.isPresent());  // true
        System.out.println(optional3.isPresent());  // false

//        TODO : 빈 것 또는 null 일 경우 아래와 같이 코딩
//          옵셔널객체변수.orElse("대체할 문자열");
        System.out.println(optional3.orElse("없음")); // null 일 경우 없음으로 출력


    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

Arrays 클래스  (0) 2023.09.27
Stream 클래스  (0) 2023.09.27
제네릭  (0) 2023.09.27
날짜 함수  (0) 2023.09.26
JAVA API 함수  (0) 2023.09.26
반응형

Generic


향상된 배열에서 자료를 추가할 때 자료형을 제한하는 것을 의미합니다.

자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미합니다.

제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다.

 

제네릭에 대한 예제를 살펴봅시다. ^o^

 

package chap14.sec01.exam01;

import java.util.ArrayList;
import java.util.Arrays;

public class GenericApplication {
    public static void main(String[] args) {
//        TODO: 여기부터 코딩
//    TODO : 제네릭 : 향상된 배열에서 자료를 추가할 때 자료형을 제한하는 것을 의미
//        사용법 : List<제한할자료형> list = new ArrayList<>();
//        부모클래스 : product, 자식 : Tv, Audio 클래스
        ArrayList<Product> productArrayList = new ArrayList<>();
        ArrayList<Tv> tvArrayList = new ArrayList<>();
//        TODO : 1) 아래 에러 사항
//        ArrayList<Product> tvArrayList = new ArrayList<Tv>(); // 이렇게 사용하면 안됨!

//        TODO : 2) productArrayList : 부모 클래스 배열에 자식 넣기 가능할까?
        productArrayList.add(new Tv());     // ok 가능
        productArrayList.add(new Audio());     // ok 가능

//        TODO : 3) tvArrayList : 당연히 Tv 객체만 배열에 추가 가능함
        tvArrayList.add(new Tv());

        System.out.println("---- 함수의 매개변수에 제네릭 사용 ----");
        printAll(productArrayList); // 매개변수의 제네릭으로 Product로 제한되어있기 때문
//        TODO : 에러발생 : 부모라도 자식 클래스는 사용안됨 : 대상 클래스(Product)만 가능
//        printAll(tvArrayList);  // 오류 발생 : Product의 자식들 사용불가

        System.out.println("---- 제네릭의 특수한 형태 ----");
        System.out.println("---- <? extend Tv> ----");
//        TODO : <? extend Tv> : Tv의 자식 클래스만 가능함(부모는 불가)
        printAll2(tvArrayList); // 가능
//        printAll2(productArrayList);    // 불가 

        System.out.println("---- <? super Product> ----");
//        TODO : <? super Product> : Product의 부모 클래스만 가능함(자식클래스는 불가)
        printAll3(productArrayList);    // 가능
//        printAll3(tvArrayList); // 불가, 자식클래스는 사용불가

        System.out.println("---- <?> ----");
//        TODO : <?> : 모든 자료형이 가능
        printAll4(productArrayList); // ok
        printAll4(tvArrayList); // ok

    }


    public static void printAll(ArrayList<Product> list) {      // 함수의 매개변수로 제네릭 사용
        for(Object p : list) {
            System.out.println(p);
        }
    }

    public static void printAll2(ArrayList<? extends Tv> list) {
        for(Object p : list) {
            System.out.println(p);
        }
    }

    public static void printAll3(ArrayList<? super Product> list) {
        for(Object p : list) {
            System.out.println(p);
        }
    }

    public static void printAll4(ArrayList<?> list) {
        for(Object p : list) {
            System.out.println(p);
        }
    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

Stream 클래스  (0) 2023.09.27
Optional 클래스  (0) 2023.09.27
날짜 함수  (0) 2023.09.26
JAVA API 함수  (0) 2023.09.26
예외처리  (0) 2023.09.26
반응형

Date

package chap11.sec02.exam01;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * packageName : chap11.sec02.exam01
 * fileName : DateApplication
 * author : ds
 * date : 2022-10-05
 * description : Date ( 날짜 함수 : 현재 날짜 ), 과거 코딩
 *               월 : 0 ~ 11까지
 *
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-05         ds          최초 생성
 */
public class DateApplication {
    public static void main(String[] args) {
//      TODO : 날짜함수
        Date now = new Date();              // 현재날짜 가져오기
        String strNow = now.toString();     // 현재날짜 문자열로 변환
        System.out.println(strNow);         // 출력하기

//      TODO : 날짜포맷(대소문자구분) : yyyy-MM-dd hh:mm:ss  (vs SQL : YYYY-MM-DD HH24:MI:SS)
        SimpleDateFormat simpleDateFormat
                = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
        String strNow2 = simpleDateFormat.format(now);  // 기본포맷 -> 사용자정의 포맷으로 변경
        System.out.println(strNow2);
    }
}

-------- 실행결과
Tue Sep 26 17:23:25 KST 2023
2023년 09월 26일 05시 23분 25초

Calendar

package chap11.sec02.exam02;

import java.util.Calendar;

/**
 * packageName : chap11.sec02.exam02
 * fileName : CalendarApplication
 * author : ds
 * date : 2022-10-05
 * description : Calendar ( (날짜객체 : Date -> Calendar(날짜연산기능) ), 과거 코딩
 *               월 : 0 ~ 11까지
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-05         ds          최초 생성
 */
public class CalendarApplication {
    public static void main(String[] args) {
//        TODO : 날짜 연산 객체
        Calendar now = Calendar.getInstance();  // 싱글톤(디자인패턴) : 공유(정적)객체
//        TODO : Calendar객체변수.get(날짜상수들) : 날짜 정보를 얻을 수 있음
        int year = now.get(Calendar.YEAR);          // 년도
        int month = now.get(Calendar.MONTH) + 1;    // 월(0 ~ 11)
        int week = now.get(Calendar.DAY_OF_WEEK);   // 요일(1(일요일) ~ 7(토요일))
        int day = now.get(Calendar.DAY_OF_MONTH);   // 일
//        TODO : 현재 날짜 정보 출력
        System.out.println(year + "년");
        System.out.println(month + "월");
        System.out.println(week + "요일");
        System.out.println(day+ "일");
//        TODO : 현재 시간 정보
        int hour = now.get(Calendar.HOUR);          // 시
        int minute = now.get(Calendar.MINUTE);      // 분
        int second = now.get(Calendar.SECOND);      // 초
//        TODO : 결과 출력
        System.out.println(hour + "시");
        System.out.println(minute + "분");
        System.out.println(second + "초");
    }
}

---- 실행결과
2023년
9월
3요일
26일
5시
32분
50초

 

LocalDate, LocalTime

package chap11.sec02.exam03;

import java.time.LocalDate;
import java.time.LocalTime;

/**
 * packageName : chap11.sec02.exam03
 * fileName : LocalDateApplication
 * author : GGG
 * date : 2023-09-26
 * description : 컴퓨터의 현재 날짜를 가져와서 출력, LocalDate, LocalTime
 *               JAVA 8 버전부터 지원(현재 많이 사용됨)
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class LocalDateApplication {
    public static void main(String[] args) {
//      TODO : 날짜 가져오기 객체
        LocalDate localDate = LocalDate.now();  // 현재날짜 가져오기
        System.out.println(localDate);  // 결과 출력

//      TODO : 시간 가져오기 객체
        LocalTime localTime = LocalTime.now();  // 현재시간 가져오기
        System.out.println(localTime);  // 결과 출력
    }
}

--- 결과
2023-09-26
17:40:17.860481900

 

반응형

'Java > Java 이론' 카테고리의 다른 글

Optional 클래스  (0) 2023.09.27
제네릭  (0) 2023.09.27
JAVA API 함수  (0) 2023.09.26
예외처리  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
반응형

프로그램 종료(System.exit( ))

package chap11.sec01.exam04;

/**
 * packageName : chap11.sec01.exam04
 * fileName : ExitApplication
 * author : GGG
 * date : 2023-09-26
 * description : System 클래스의 함수들 exit()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ExitApplication {
    public static void main(String[] args) {
        // TODO : 0 ~ 10까지 수 중에 값이 5일 때 프로그램을 강제 종료하세요
        for (int i = 0; i < 10; i++) {
            if(i == 5){
//                break;    // 반복문 종료
                System.exit(i); // 프로그램 강제 종료(kill), 밑에 코드가 실행안됨
            }
        }
        System.out.println("이 코드 실행?");     // 실행 안됨
    }
}

 

소요시간 체크함수 (.nanoTime())

package chap11.sec01.exam04;

/**
 * packageName : chap11.sec01.exam04
 * fileName : SystemTimeApplication
 * author : GGG
 * date : 2023-09-26
 * description : System 객체 : 소요시간 체크 함수 .nanoTime()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class SystemTimeApplication {
    public static void main(String[] args) {
//        1) 처음 시간 체크 (컴퓨터 설정된 현재시간)
        long time = System.nanoTime(); // 1/10^9 시간
//        2) 실행
        int sum = 0;
        for (int i = 1; i <= 1000000; i++) {
            sum += i; //누적합
        }
//        3) 마지막 시간 체크
        long time2 = System.nanoTime(); // 1/10^9 시간
//        4) 마지막 시간 - 처음 시간 = 소요시간
        System.out.println("1~백만까지 합 : " + sum);
        System.out.println("소요시간(ns) : " + (time2 - time));
    }
}

-------------- 실행결과
1~백만까지 합 : 1784293664
소요시간(ns) : 2100200

 

Class 클래스

package chap11.sec01.exam05;

/**
 * packageName : chap11.sec01.exam05
 * fileName : CarApplication
 * author : GGG
 * date : 2023-09-26
 * description : Class 클래스 소개 : 클래스의 정보보기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class CarApplication {
    public static void main(String[] args) {
        // TODO : Class => 자바에서 클래스의 정보(패키지명, 클래스명, 경로명 등)가 있는 객체
        //   java -> 컴파일(빌드) -> .class
        Class clazz = Car.class;

        // TODO : 정보 보기
        System.out.println(clazz.getPackage().getName());       // 패키지 정보보기
        System.out.println(clazz.getName());                    // 패키지 + 클래스명 정보가 출력(full 클래스명)
        System.out.println(clazz.getSimpleName());              // 패키지명 제외한 클래스명 정보보기
    }
}


------ 실행결과
chap11.sec01.exam05
chap11.sec01.exam05.Car
Car

 

ByteToString

byte 배열 -> 문자열(String)로 변환하기

package chap11.sec01.exam06;

/**
 * packageName : chap11.sec01.exam06
 * fileName : ByteToStringApplication
 * author : GGG
 * date : 2023-09-26
 * description :  byte 배열 -> 문자열(String)로 변환하기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ByteToStringApplication {
    public static void main(String[] args) {
        byte[] bytes = {72, 101, 108, 108, 111, 32, 74, 97, 118, 97};

        // TODO : byte 배열 -> 문자열 변환
        //  사용법 : new String(byte배열);
        String str1 = new String(bytes);
        System.out.println(str1);
        // TODO : 참고) 응용 : 사용법 : new String(byte배열, 인덱스번호, 문자열길이)
        String str2 = new String(bytes, 6, 4);
        System.out.println(str2);
        
    }
}

--------- 실행결과
Hello Java
Java

 

StringToByte

문자열 -> byte 배열로 변환

package chap11.sec01.exam08;

/**
 * packageName : chap11.sec01.exam08
 * fileName : StringToByteApplication
 * author : GGG
 * date : 2023-09-26
 * description : 문자열(String) => byte 배열 변환
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class StringToByteApplication {
    public static void main(String[] args) {
        String str = "안녕하세요";

        // TODO : 문자열 -> byte[] 변환
        //  사용법 : 문자열.getBytes() => byte[] 리턴
        byte[] bytes = str.getBytes();
        System.out.println("길이 : " + bytes.length);
    }

}

----- 실행결과
길이 : 15

 

String Char

charAt() 

문자열에서 어떤 인덱스 번호의 한 문자 조회하기

문자열.charAt(인덱스번호);
package chap11.sec01.exam07;

/**
 * packageName : chap11.sec01.exam07
 * fileName : StringCharApplication
 * author : GGG
 * date : 2023-09-26
 * description : 문자열에서 어떤 인덱스번호의 한문자 조회하기 : charAt(인덱스번호)
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class StringCharApplication {
    public static void main(String[] args) {
        // 주민번호
        String ssn = "123456-1234567";
        // TODO : 1문자 가져오기
        char gender = ssn.charAt(7);        // '1' 문자를 가져옴
        if(gender == '1' || gender == '3'){
            System.out.println("남자입니다.");
        } else if(gender == '2' || gender == '4'){
            System.out.println("여자입니다.");
        }
    }
}

-------- 실행결과
남자입니다.

 

String 클래스의 함수 : IndexOf()

package chap11.sec01.exam09;

/**
 * packageName : chap11.sec01.exam09
 * fileName : IndexOfApplication
 * author : GGG
 * date : 2023-09-26
 * description : String 클래스의 함수 : IndexOf()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class IndexOfApplication {
    public static void main(String[] args) {
        String subject = "자바 프로그래밍";

        // TODO : 전달된 문자열이 시작되는 인덱스번호를 리턴 : indexOf(문자열)
        int location = subject.indexOf("프로그래밍");
        System.out.println(location);

        // TODO : (참고) 찾는 문자열이 없으면 : -1 리턴
        int location2 = subject.indexOf("파이썬");
        System.out.println(location2);        
    }
}
----------- 실행결과
3
-1

 

String 클래스의 함수 : length()

문자열 길이를 리턴하는 함수

package chap11.sec01.exam10;

/**
 * packageName : chap11.sec01.exam10
 * fileName : LengthApplication
 * author : GGG
 * date : 2023-09-26
 * description : String 클래스 함수 : 문자열 길이 리턴하는 함수 : length()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class LengthApplication {
    public static void main(String[] args) {
        String ssn = "123456-1234567";
        // TODO : 문자열 길이 출력 : 문자열.length()
        System.out.println(ssn.length());
    }
}

---- 실행결과
14

 

String 클래스의 함수 : replace()

문자열 바꾸기 함수

package chap11.sec01.exam11;

/**
 * packageName : chap11.sec01.exam11
 * fileName : ReplaceApplication
 * author : GGG
 * date : 2023-09-26
 * description : String 클래스의 함수 : 문자열 바꾸기 함수 : replace()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ReplaceApplication {
    public static void main(String[] args) {
        // 자바 API : 자바의 유용한 함수 묶음
        String oldStr = "자바는 객체지향언어입니다. 자바는 풍부한 API도 지원합니다.";
        // TODO : 문자열 바꾸기 : 문자열.replace(이전문자, 바꿀문자);
        String newStr = oldStr.replace("자바","Java");
        System.out.println(newStr);
    }
}

--- 실행결과
Java는 객체지향언어입니다. Java는 풍부한 API도 지원합니다.

 

String 클래스의 함수 : substring()

문자열 자르기 함수

package chap11.sec01.exam12;

/**
 * packageName : chap11.sec01.exam12
 * fileName : SubStringApplication
 * author : GGG
 * date : 2023-09-26
 * description : String 클래스의 함수 : 문자열 자르기 함수 : substring()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class SubStringApplication {
    public static void main(String[] args) {
        String ssn = "123456-1234567";

        // TODO : 문자열 자르기 : 문자열.substring(시작인덱스위치, 마지막인덱스위치)
        //        ( 시작인덱스위치 ~ 마지막인덱스위치 - 1 )
        String firstNum = ssn.substring(0, 6);
        System.out.println(firstNum);       // 주민번호 앞자리 숫자 출력

        // TODO 응용) 문자열.substring(시작인덱스번호);
        //           (시작인덱스위치 ~ 끝까지 잘림)
        String lastNum = ssn.substring(7);
        System.out.println(lastNum);        // 주민번호 뒷자리 숫자


    }

}


----- 실행결과
123456
1234567

 

String 클래스의 함수 : trim()

문자열의 앞 뒤 공백을 제거 후 문자열을 리턴하는 함수

package chap11.sec01.exam13;

/**
 * packageName : chap11.sec01.exam13
 * fileName : TrimApplication
 * author : GGG
 * date : 2023-09-26
 * description : String 클래스 함수 : 문자열 앞/뒤 공백 없애기 함수 : trim()
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class TrimApplication {
    public static void main(String[] args) {
        String tel = " 12345 ";     // 앞/뒤 공백이 있는 문자열
        // TODO : 앞/뒤 공백없애기 함수 : 문자열.trim();
        System.out.println(tel.trim());
    }
}

------- 실행결과
12345

 

Wrapper 클래스의  boxing/unboxing

 *          기본 자료형     : byte, short, int, long, float, double, char, boolean
 *          Wrapper 클래스 : 위의 자료형을 객체형으로 제공하는 클래스 
 *                                   Byte, Short, Integer, Long, Float, Double, Character, Boolean
 *          과거 코딩 :
 *          int -> Integer 변환 : API 함수를 사용해서 변환했음(Boxing)
 *          Integer -> int 변환 : (Unboxing)
 *          현대 코딩 :
 *          자동 변환 (함수 사용없이 자동변환됨)

 

public class BoxingApplication {
    public static void main(String[] args) {
        // TODO : 기본자료형 -> Wrapper 클래스로 변환
        //  과거 방식 : boxing
        Integer obj1 = new Integer(100);
        //  현대 방식
        Integer obj2 = 100;     // 자동 변환

        // TODO : Unboxing
        //  과거 방식
        int value1 = obj1.intValue();       // 원복 (함수호출)
        // 현대 방식
        int value2 = obj2;                  // 자동 변환

        System.out.println(value1);
        System.out.println(value2);


    }
}

-------- 출력결과
100
100

 

Math객체의 함수들

package chap11.sec01.exam15;

/**
 * packageName : chap11.sec01.exam20
 * fileName : MathApplication
 * author : ds
 * date : 2022-10-05
 * description : 수학함수들 . Math 객체의 함수들
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2022-10-05         ds          최초 생성
 */
public class MathApplication {
    public static void main(String[] args) {

        // TODO : 랜덤 함수 : 0 <= x < 1 값
        //  Math 클래스 : random() (정적(공유)함수 : 클래스명.함수명())
        double v11 = Math.random();
        System.out.println("v11=" + v11);
        // TODO : Math.abs(숫자); : 절대값 함수
        int v1 = Math.abs(-5);
        System.out.println("v1= " + v1);
        // TODO : Math.max(숫자1, 숫자2); 최대값 구하는 함수
        int v7 = Math.max(5,9);
        System.out.println("v7=" + v7);
        // TODO : Math.min(숫자1, 숫자2); 최소값 구하는 함수
        int v9 = Math.min(5,9);
        System.out.println("v9=" + v9);
        // TODO : Math.ceil(숫자); 소수점 올림 구하기(무조건 첫째자리에서 올림)
        double v3 = Math.ceil(5.3);
        System.out.println("v3=" + v3);
        // TODO : Math.floor(숫자); 소수점 버림 구하기(무조건 첫째자리에서 버림)
        double v5 = Math.floor(5.3);
        System.out.println("v5=" + v5);
        // TODO: Math.round(숫자); 반올림(무조건 첫째자리에서 반올림)
        double v14 = Math.round(5.3); // 5
        System.out.println("v14=" + v14);

        // TODO (참고) 응용 : 셋째자리에서 반올림하기
        //   1) 100을 곱하고 2) 반올림 구하고 3) 100 나누기
        double value = 12.3456;     // 셋째자리에서 반올림
        double temp = value * 100;  // 1)
        long temp2 = Math.round(temp);  // 2)
        double v16 = temp2/100.0; // 3)
        System.out.println("v16=" + v16);

    }
}

--- 결과
v11=0.7381840307023227
v1= 5
v7=9
v9=5
v3=6.0
v5=5.0
v14=5.0
v16=12.35

 

반응형

'Java > Java 이론' 카테고리의 다른 글

제네릭  (0) 2023.09.27
날짜 함수  (0) 2023.09.26
예외처리  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
객체의 동등비교  (1) 2023.09.25
반응형

Null Pointer Exception

package chap10.sec01.exam01;

/**
 * packageName : chap10.sec01.exam01
 * fileName : NullApplication
 * author : GGG
 * date : 2023-09-26
 * description : 예외처리(에러처리), null pointer exception(널 에러)
 * 요약 :
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class NullApplication {
    public static void main(String[] args) {
//        TODO : null 발생시키는 코드
        String data = null;
        System.out.println(data.toString());        // null 에러 발생
    }

}

nullpointerexception 에러 발생

 

Out of Bound 에러

* description : 배열의 지정된 index 보다 큰 값을 조회할 때 발생하는 에러
*               Out of Bound 에러
*               예) 10개짜리인 배열 : 인덱스 번호 => 0 ~ 9
*               => 코딩에서 11인덱스를 조회하면 위의 에러가 발생
package chap10.sec01.exam02;

/**
 * packageName : chap10.sec01.exam02
 * fileName : OutOfBoundApplication
 * author : GGG
 * date : 2023-09-26
 * description : 배열의 지정된 index 보다 큰 값을 조회할 때 발생하는 에러
 *               Out of Bound 에러
 *               예) 10개짜리인 배열 : 인덱스 번호 => 0 ~ 9
 *               => 코딩에서 11인덱스를 조회하면 위의 에러가 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class OutOfBoundApplication {
    public static void main(String[] args) {
//        TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
        String data1 = args[0];
        String data2 = args[1];
        System.out.println(data1);
        System.out.println(data2);
    }
}
배열이 없는데 조회해서 에러가 발생함

 

NumberFormatException 에러

* description : Number Format 에러[예외](Exception) :
*                 문자열 -> 숫자로 변경하였는데 그 숫자 형태가 잘못되었을 경우 발생
package chap10.sec01.exam03;

/**
 * packageName : chap10.sec01.exam03
 * fileName : NumberFormatApplication
 * author : GGG
 * date : 2023-09-26
 * description : Number Format 에러[예외](Exception) :
 *                 문자열 -> 숫자로 변경하였는데 그 숫자 형태가 잘못되었을 경우 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class NumberFormatApplication {
    public static void main(String[] args) {
//        TODO : 강제로 Number Format 에러 발생
        String data1 = "100";
        String data2 = "a100";
//        TODO : 문자열 -> 숫자로 변경 : Integer.parseInt()
        int value1 = Integer.parseInt(data1);
        int value2 = Integer.parseInt(data2);       // a100은 숫자 변환 안됨
        System.out.println(data1 + " " + data2);

    }
}

 

ClassCastException 에러

* description :  Class Cast 에러[예외](Exception)
*              => 클래스 형변환시 적절한 클래스를 안넣으면 에러 발생
package chap10.sec01.exam04;

/**
 * packageName : chap10.sec01.exam04
 * fileName : ClassCastApplication
 * author : GGG
 * date : 2023-09-26
 * description :  Class Cast 에러[예외](Exception)
 *              => 클래스 형변환시 적절한 클래스를 안넣으면 에러 발생
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ClassCastApplication {
    public static void main(String[] args) {
//        강아지 객체 생성
        Dog dog = new Dog();
        changeDog(dog);     // 가능(매개변수의 다형성)
//        TODO : Class Cast 에러 발생 코드
//        고양이 객체 생성
        Cat cat = new Cat();
        changeDog(cat);     // 에러발생 => 고양이를 강아지로 강제 형변환 불가, 강아지 객체를 넣어야함

    }
//    공유 함수
    public static void changeDog(Animal animal){
//        강제 형변환 : Dog
        Dog dog = (Dog)animal;
    }
}

// 동물 클래스
class Animal{}
// 강아지
class Dog extends Animal{}
// 고양이
class Cat extends Animal{}

Exception in thread "main" java.lang.ClassCastException: class chap10.sec01.exam04.Cat cannot be cast to class chap10.sec01.exam04.Dog (chap10.sec01.exam04.Cat and chap10.sec01.exam04.Dog are in unnamed module of loader 'app')
at chap10.sec01.exam04.ClassCastApplication.changeDog(ClassCastApplication.java:31)
at chap10.sec01.exam04.ClassCastApplication.main(ClassCastApplication.java:25)

 

예외처리 - 에러처리를 하는 이유?

*        (참고) : 예외(개발자 에러) vs 시스템 에러(자바가상머신 에러)
*        에러처리를 왜 하는가? 에러(예외)가 발생하면 콘솔에 빨간줄의 에러코드가 나타남
*           => 사용자 입장에서 보기가 좋지 않음
*           => 목적) 에러처리를 이용해서 좀 더 품질 좋은 프로그램을 만들기 위함
*           (예) 에러발생 -> 관리자가 확인중입니다. 메시지 출력
try ~ catch 구문

try {
    <수행할 문장 1>;
    <수행할 문장 2>;
    ...
} catch(예외1) {
    <수행할 문장 A>;
    ...
} catch(예외2) {
    <수행할 문장 a>;
    ...
}

package chap10.sec02.exam01;

/**
 * packageName : chap10.sec02.exam01
 * fileName : TryCatchFinallyApplication
 * author : GGG
 * date : 2023-09-26
 * description : 일반 예외(에러) 처리
 * 요약 :
 *        (참고) : 예외(개발자 에러) vs 시스템 에러(자바가상머신 에러)
 *        에러처리를 왜 하는가? 에러(예외)가 발생하면 콘솔에 빨간줄의 에러코드가 나타남
 *           => 사용자 입장에서 보기가 좋지 않음
 *           => 목적) 에러처리를 이용해서 좀 더 품질 좋은 프로그램을 만들기 위함
 *           (예) 에러발생 -> 관리자가 확인중입니다. 메시지 출력
 *        
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class TryCatchFinallyApplication {
    public static void main(String[] args) {
//        TODO : 에러처리 : try ~ catch 구문
//         사용법 : try { 실행문; } catch(에러클래스 변수) {에러처리실행문;}
//          => (설명) try의 실행문이 실행될때 에러가 발생하면 catch 실행문이 실행됨
        try {
//            forName(클래스명) : 클래스명에 해당되는 자바클래스를 리턴
            Class clazz = Class.forName("String2");     // 에러 발생
        } catch (ClassNotFoundException e){
            System.out.println("클래스가 존재하지 않습니다.");
        }
    }
}

package chap10.sec02.exam02;

/**
 * packageName : chap10.sec02.exam02
 * fileName : TryCatch2Application
 * author : GGG
 * date : 2023-09-26
 * description : 예외처리(에러처리) 2
 * 요약 : try ~ catch 문은 여러 번 사용 가능
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class TryCatch2Application {
    public static void main(String[] args) {
//        TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
//         try ~ catch() {}
        String data1 = null;
        String data2 = null;

        try{
            data1 = args[0];
            data2 = args[1];

            System.out.println(data1);      // 에러발생 -> catch로 이동함
            System.out.println(data2);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("실행 매개변수값이 없습니다.");
        }

//        TODO : 강제로 Number Format 에러 발생
//        TODO : 문자열 -> 숫자로 변경 : Integer.parseInt()
        try {
            int value1 = Integer.parseInt(data1);
            int value2 = Integer.parseInt(data2);       // a100은 숫자 변환 안됨
            System.out.println(data1 + " " + data2);

        } catch (NumberFormatException e){
            System.out.println("숫자로 변환할 수 없습니다.");
        } finally {
            System.out.println("다시 실행하세요");
        }

    }
}

어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 finally를 사용한다.

finally 문은 try 문장 수행 중 예외 발생 여부에 상관없이 무조건 실행된다. 

 

Catch 2개 이상 있는 예외처리

package chap10.sec02.exam03;

/**
 * packageName : chap10.sec02.exam03
 * fileName : CatchByCatchApplication
 * author : GGG
 * date : 2023-09-26
 * description : Catch 2개 이상 있는 에러(예외) 처리
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class CatchByCatchApplication {
    public static void main(String[] args) {
        try {
//         TODO : Out of Bound 에러 발생시키는 코드
//         현재 main의 매개변수는 기본적으로 없음
            String data1 = args[0];
            String data2 = args[1];
            System.out.println(data1); // 에러 발생
            System.out.println(data2);

        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println("실행 매개변수 값이 부족합니다.");
        } catch (NumberFormatException e){
            System.out.println("숫자로 변환할 수 없습니다.");
        } catch (Exception e) {
            // TODO : Exception 개발자 에러의 최고 조상 클래스 : 기본에러로 설정하면 거의 탐지됨.
            System.out.println("그외의 다른 에러가 발생했습니다.");
        }

    }
}

 

예외 던지기

예외가 발생할 수 있는 코드를 작성할 때 try - catch 블록으로 처리하는 것이 기본이지만, 경우에 따라서는 다른 곳에서 예외를 처리하도록 호출한 곳으로 예외를 떠넘길 수도 있다.

package chap10.sec02.exam04;

/**
 * packageName : chap10.sec02.exam04
 * fileName : ThrowsApplication
 * author : GGG
 * date : 2023-09-26
 * description : Throws, 예외(에러) 처리 떠넘기기
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class ThrowsApplication {
    public static void main(String[] args) {
        
        try {
            findClass();        // 공유함수 호출    
        } catch (Exception e){
            System.out.println("클래스가 존재하지 않습니다.");
        }
        
    }

    // 공유 함수
    // TODO : 리턴자료형 함수명() throws 에러클래스
    //   => 함수 내에서 에러처리 안하고 이 함수를 호출하는 쪽에 에러처리를 떠넘기기
    public static void findClass() throws ClassNotFoundException{
        // TODO : Class 객체 : 자바의 환경을 접근하는 자바 API 함수
        //   Class.forName("클래스명") : 해당 클래스를 리턴
        Class clazz = Class.forName("String2");
    }
}

 

반응형

'Java > Java 이론' 카테고리의 다른 글

날짜 함수  (0) 2023.09.26
JAVA API 함수  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
객체의 동등비교  (1) 2023.09.25
자료구조  (0) 2023.09.25
반응형

Stack

한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료구조

package chap12.sec02.exam01;

import java.util.Stack;

/**
 * packageName : chap12.sec02.exam01
 * fileName : StackApplication
 * author : GGG
 * date : 2023-09-26
 * description : 스택(Stack)에 대한 소개 예제
 * 요약 :
 *         Stack(스택) : LIFO (Last In First Out)  -> 코딩 : Stack 클래스
 *         Queue(큐 : 인터페이스)  : FIFO (First in First out)  -> 코딩 : LinkedList 사용
 *
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class StackApplication {
    public static void main(String[] args) {

//        TODO : 스택 객체 정의
        Stack<Coin> coinStack = new Stack<>();
//        TODO : Coin 객체 추가 : .push(값)
        coinStack.push(new Coin(100));          // 100원  (1st)
        coinStack.push(new Coin(50));           // 50원
        coinStack.push(new Coin(500));          // 500원
        coinStack.push(new Coin(10));           // 10원   (last)     => 꺼낼때 먼저 나옴


//        TODO : Coin 객체 꺼내기 : .pop() (순차적으로 마지막 값을 꺼냄)
//         참고) 현재 마지막 값 조회하기 : .peek()
        while (coinStack.isEmpty() == false){
            Coin coin = coinStack.pop();        // 마지막 코인 꺼내기
            System.out.println("꺼낸 동전 : " + coin.getValue());
        }

        
    }
}

 

 

 

 

Queue

데이터를 일시적으로 쌓아두기 위한 형식, FIFO(First In First Out) 형식의 자료구조

package chap12.sec02.exam02;

import java.util.LinkedList;
import java.util.Queue;

/**
 * packageName : chap12.sec02.exam02
 * fileName : MessageApplication
 * author : GGG
 * date : 2023-09-26
 * description :    큐 소개 예제 : FIFO
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-26         GGG          최초 생성
 */
public class MessageApplication {
    public static void main(String[] args) {
//        TODO: 큐(인터페이스) 객체 생성 - LinkedList 사용
        Queue<Message> messageQueue = new LinkedList<>();

//        TODO: 큐에 자료저장 : .offer(값) 또는 .add(값)
        messageQueue.offer(new Message("sendMail", "홍길동"));
        messageQueue.offer(new Message("sendSMS", "신용권"));
        messageQueue.offer(new Message("sendKakao", "홍두깨"));

//        TODO: 꺼내기 : .poll()
        while (messageQueue.isEmpty() == false){
            Message message = messageQueue.poll();      // 1st 꺼내기
            System.out.println(message.to);             // 보낼 사람 이름
            
        }


    }
}

반응형

'Java > Java 이론' 카테고리의 다른 글

JAVA API 함수  (0) 2023.09.26
예외처리  (0) 2023.09.26
객체의 동등비교  (1) 2023.09.25
자료구조  (0) 2023.09.25
MVC 디자인 패턴  (0) 2023.09.22
반응형

.equals()

  • 두개의 객체가 같다라는 의미 ? => 속성이 같다는 의미로 해석
  • .equals() 함수 소스를 보면 두 개의 객체를 비교할 때 비교연산자(==)를 사용하여 비교를 함
  • == 연산자는 속성의 주소값(쉬운말로 방번호)을 비교를 함

String 객체에서 어떻게 비교를 해야할까?

.equals() 함수를 재정의하여 비교연산자(==) 대신 값을 비교하도록 재정의함

즉, 두 개의 객체를 비교할 때 속성을 비교할 수 있게 equals() 함수를 재정의하여 사용해야함!

 

JAVA 언어의 최고 조상 객체는 Object 객체이며 Object 객체의 메서드 종류는 .equals(), .hashCode(), .toString()등이 있음

 

JAVA에서 모든 객체(클래스)는 Object 를 상속받고 있음 (extends 라는 키워드는 생략)

 

예제1

public class Member {
//    TODO : 속성, 생성자함수, 메서드
//    속성
    public  String id;

//    생성자
    public Member(String id) {
        this.id = id;
    }

//    객체 동등 비교를 위해 .equals 함수 재정의 해야함 : alt + insert
//    TODO : 인텔리제이 자동코딩
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Member member = (Member) o;
//        return Objects.equals(id, member.id);       // 객체 속성 동등비교
//    }

//    TODO : 참고, 개발자 직접코딩
    @Override
    public boolean equals(Object o) {

//        1) 매개변수 o 객체가 Member 인가?
        if(o instanceof Member) {
//            강제 형변환
            Member member = (Member) o;
//        2) 속성의 값(id) 비교 같으면 true, 아니면 false
            if(this.id.equals(member.id)) {
                return true;
            }
        }
        return false;
    }

}

실행클래스

 

public class MemberApplication {
    public static void main(String[] args) {
//       Member 객체 2명 생성
        Member member = new Member("blue");
        Member member2 = new Member("blue");

//        객체 2명 비교
        if(member.equals(member2)){
            System.out.println("같습니다.");
        } else {
            System.out.println("다릅니다.");
        }


    }
}

결과

 

같습니다.

 

.hashCode()

*          해쉬코드(hashCode)? : 객체를 식별하는 유일한 정수값(번호 중복 없음)
*          1) 방번호(주소) : 메모리의 랜덤하고 유일한 방번호 만들때 사용
*          2) HashMap, HashSet 자료구조에서 내부적으로 해쉬코드를 사용함(객체들을 비교할때)
*          TODO => 기본 hashCode는 객체간 비교에서 오류를 일으키므로 재정의 해야함!
*            결론 ) .equals(), .hashCode() 재정의해야함 (추천 : 자동코딩 기능이용)

예제2

public class Member {
//    속성
    public String id;

//    생성자
    public Member(String id) {
        this.id = id;
    }

//    equals, hashCode 재정의
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return Objects.equals(id, member.id);
    }

    @Override
    public int hashCode() {
//        2개의 객체를 생성해서 비교시 id 속성의 해쉬코드가 2개 모두 같아짐
        return Objects.hash(id);    // 객체의 비교(속성을 비교)
    }
반응형

'Java > Java 이론' 카테고리의 다른 글

예외처리  (0) 2023.09.26
자료구조 - Stack / Queue  (0) 2023.09.26
자료구조  (0) 2023.09.25
MVC 디자인 패턴  (0) 2023.09.22
생성자  (0) 2023.09.20
반응형

ArrayList

package chap12.sec01.exam01;

import java.util.ArrayList;			// ArrayList를 사용하기 위한 유틸패키지 import
import java.util.List;				// List를 사용하기 위한 유틸패키지 import

/**
 * packageName : chap12.sec01.exam01
 * fileName : ArrayListApplication
 * author : GGG
 * date : 2023-09-25
 * description :
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-25         GGG          최초 생성
 */
public class ArrayListApplication {
    public static void main(String[] args) {
//        객체 생성 : 리스트 : 다형성(자식에 따라 결과가 달라짐)
        List<String> list = new ArrayList<>();
//      TODO: 리스트에 추가하기
//        사용법 : 리스트객체변수.add(값); // 최소 0 인덱스 번호에 추가됨
        list.add("Java");                           // 1st(0: 인덱스 번호)
        list.add("JDBC");                           // 2nd
        list.add("Servlet/JSP");                    // 4th
        list.add(2, "Database");       // 3rd
        list.add("myBATIS");                        // 5th

//        결과출력
        System.out.println(list);

//        TODO : 향상된 배열의 크기 가져오기    (vs. 일반배열.length)
        int size = list.size();
//        결과 출력
        System.out.println("총 객체 수"+ size);
    }
}
// 결과
[Java, JDBC, Database, Servlet/JSP, myBATIS]
*          List : 인터페이스, 배열을 개선한 자료구조
*                배열(고정길이) vs 향상된 배열(크기 자동증가) : 기본 10개
*                부모인터페이스를 상속받은 자식클래스들
*                리스트 : 다형성(자식에 따라 결과가 달라짐)
*                ArrayList(*)     : 순차적으로 추가/삭제시 속도 빠름
*                                   중간에 추가/삭제시 속도 저하
*                LinkedList       : 중간에 추가/삭제시 속도 향상, 순차적일때 속도 저하
*                Vector           : 멀티 쓰레드 환경에서 사용하는 자료구조
//        TODO : 향상된 배열의 크기 가져오기    (vs. 일반배열.length)
//          사용법 : 객체변수.size();
        int size = list.size();
//        결과 출력
        System.out.println("총 객체 수 : "+ size);

총 객체 수 : 5

//        TODO : 저장된 데이터 가져오기
//         예제 1) 3번째 자료 가져오기
//         사용법 : 객체변수.get(인덱스 번호)
        String skill = list.get(2);     // 0 ~ n : 0부터 시작
//        결과출력
        System.out.println("3번째 자료 : " + skill);

3번째 자료 : Database

//        TODO : 반복문을 이용해서 자료 모두 출력하기
for (int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    System.out.println(i + " : " + str);
}

0 : Java
1 : JDBC
2 : Database
3 : Servlet/JSP
4 : myBATIS

//        TODO : 자료 수정하기
//         사용법 : 객체변수.set(인덱스번호, 값);
list.set(0, "자바");
System.out.println("수정된 값 : " + list.get(0));

수정된 값 : 자바

//        TODO : 자료 삭제하기
//         사용법 :  객체변수.remove(인덱스번호)
//         사용법 :  객체변수.remove(값)
        list.remove(2);         // 2번 인덱스 위치의 값 삭제
        list.remove(2);
        list.remove("myBATIS");     // 값(myBATIS) 찾아서 삭제
        //        결과출력
        System.out.println(list);

[자바, JDBC]

//        TODO : 모든 자료 삭제하기
        list.clear();       // 모든 자료 삭제
//        결과출력
        System.out.println(list);

[]

 

Vector

*        Vector : 멀티쓰레드 환경에서 사용하는 자료구조, ArrayList 거의 유사
*                  (병렬처리 : 속도 향상(장점), 코딩 복잡도 증가(동기화 문제 등))
*          속도 : ArrayList > Vector

 

public class Board {
    String subject;     // 제목
    String content;     // 내용
    String writer;      // 작성자

//    매개변수 3개 생성자
    public Board(String subject, String content, String writer) {
        this.subject = subject;
        this.content = content;
        this.writer = writer;
    }

//    .equals(), .hashCode() 재정의
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Board board = (Board) o;
        return Objects.equals(subject, board.subject) && Objects.equals(content, board.content) && Objects.equals(writer, board.writer);
    }

    @Override
    public int hashCode() {
        return Objects.hash(subject, content, writer);
    }

//    TODO 편리성 증진 : 함수 재정의 toString() : 객체를 문자열로 변환하는 함수

    @Override
    public String toString() {
        return "["+ subject + "," + content + "," + writer +"]";
    }
public class BoardApplication {
    public static void main(String[] args) {
//        백터 객체 생성 : 다형성 이용
//        TODO : Vector의 부모 : List ( add(): [추가], get(): [조회), set(): [수정], remove(): [삭제] )
        List<Board> list = new Vector<>();
//        객체 추가
        list.add(new Board("제목1", "내용1", "글쓴이1"));
        list.add(new Board("제목2", "내용2", "글쓴이2"));
        list.add(new Board("제목3", "내용3", "글쓴이3"));
        list.add(new Board("제목4", "내용4", "글쓴이4"));
        list.add(new Board("제목5", "내용5", "글쓴이5"));

        System.out.println(list);   // 속성 : toString() : list에서 생략해도됨 (자동 실행)

//        삭제 2건
        list.remove(2);     // 2번 삭제 후 자동으로 자료가 당겨짐
        list.remove(3);
        System.out.println(list);

    }

실행결과

[[제목1,내용1,글쓴이1], [제목2,내용2,글쓴이2], [제목3,내용3,글쓴이3], [제목4,내용4,글쓴이4], [제목5,내용5,글쓴이5]]
[[제목1,내용1,글쓴이1], [제목2,내용2,글쓴이2], [제목4,내용4,글쓴이4]]

 

LinkedList

*    LinkedList  vs  ArrayList
*    구분       |  순차 추가/삭제      |  중간에 추가/삭제
*    ArrayList  |   빠름               | 느림
*    LinkedList |   느림               | 빠름
public class LinkedListApplication {
    public static void main(String[] args) {
//     TODO : 예제 1) 속도 비교 : ArrayList vs LinkedList
//        객체 생성 : 다형성을 이용
        List<String> list = new ArrayList<>();
        List<String> list2 = new LinkedList<>();

//       시간 변수 2개
        long startTime;
        long endTime;
//        TODO 1) 처음시간 : System 객체 : 시간을 재는 함수 : nanoTime()
        startTime = System.nanoTime();

//        TODO 2) 실행 : 반복문 ( 0 ~ 10000 까지 배열에 값을 추가 )
        for (int i = 0; i < 10000 ; i++) {
//            중간에 추가 : add(인덱스번호, 값)
            list.add(0, String.valueOf(i));     // 정수 -> 문자열 반환 추가

        }
//        TODO 3) 종료 시간 : System 객체 nanoTime()
        endTime = System.nanoTime();
        System.out.println("ArrayList 소요시간 : " + (endTime - startTime));

        System.out.println("---------------------------LinkedList----------------------------");

//        TODO 1) 처음시간 : System 객체 : 시간을 재는 함수 : nanoTime()
        startTime = System.nanoTime();

//        TODO 2) 실행 : 반복문 ( 0 ~ 10000 까지 배열에 값을 추가 )
        for (int i = 0; i < 10000 ; i++) {
//            중간에 추가 : add(인덱스번호, 값)
            list2.add(0, String.valueOf(i));     // 정수 -> 문자열 반환 추가

        }
//        TODO 3) 종료 시간 : System 객체 nanoTime()
        endTime = System.nanoTime();
        System.out.println("LinkedList 소요시간 : " + (endTime - startTime));
    }

Set

*      복습 : List : (ArrayList, LinkedList, Vector)
*            Set  : (HashSet, LinkedHashSet, TreeSet 등)
*      Set : 집합을 표현한 인터페이스, 자식클래스 (HashSet, LinkedHashSet, TreeSet 등)
*      특징 : 순서가 없음(인덱스번호가 없음), 중복이 허용되지 않음
*      vs List 특징(순서 있음(인덱스), 중복 허용됨)
public class HashSetApplication {
    public static void main(String[] args) {
//        객체 생성 : 다형성
        Set<String> set = new HashSet<>();

//      TODO : 자료 추가 / 사용법 : 객체변수.add(값)
        set.add("Java");
        set.add("JDBC");
        set.add("Servlet/JSP");
        set.add("Java");
        set.add("myBATIS");
        System.out.println(set);
//        set의 특징 : 중복을 허용하지 않음

//      TODO : 자료 크기 보기 / 사용법 : 객체변수.size();
        int size = set.size();
        System.out.println("총 객체수 : " + size);

//      TODO : 자료 삭제 / 사용법 : 객체변수.remove(값);
        set.remove("JDBC");
        System.out.println(set);

//      TODO 참고 : 모두 삭제 / 사용법 : 객체변수.clear()
        set.clear();
        System.out.println(set);
    }

HashSet 예제

package chap12.sec01.exam05;

import java.util.Objects;

/**
 * packageName : chap12.sec01.exam05
 * fileName : Member
 * author : GGG
 * date : 2023-09-25
 * description : 회원 객체
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * —————————————————————————————
 * 2023-09-25         GGG          최초 생성
 */
public class Member {
    public String name; // 이름
    public int age;     // 나이

    public Member(String name, int age) {
        this.name = name;
        this.age = age;
    }

//    객체 비교

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Member member = (Member) o;
        return age == member.age && Objects.equals(name, member.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "[" + name + "," + age +"]";
    }
}
public class HashSetApplication {
    public static void main(String[] args) {
//        객체 생성 : 다형성
        Set<Member> set = new HashSet<>();
//        객체 추가
        set.add(new Member("홍길동", 30));
        set.add(new Member("홍길동", 30));
//        TODO : 중복 제거되었는지 확인(.hashCode() 재정의)
        System.out.println(set);
    }
}

Map

*      복습 : List(**) : (ArrayList(*), LinkedList, Vector), 향상된 배열
*            Set  : (HashSet, LinkedHashSet 등), 집합 구현
*            Map(**)  : (HashMap(*), HashTable 등) (키, 값 : 엔트리) 이루어진 자료구조
*             (vs List (인덱스번호, 값)
*            특징 : 키 - 유일한 값 (중복 금지), 값 - 중복 허용
public class HashMapApplication {
    public static void main(String[] args) {
//        객체 생성 : 다형성
//        TODO : Map<키_자료형, 값_자료형> map = new HashMap<>();
//         Object : 자바 최고 조상 객체
        Map<String, Object> map = new HashMap<>();

//        TODO : 자료 추가 : 객체변수.put(키, 값);
        map.put("no", 1);
        map.put("name", "홍길동");
        System.out.println(map);

//        TODO : 자료크기 : 객체변수.size()
        System.out.println("총 객체 수 : " + map.size());

//        TODO : 키로 값을 조회하기 : 객체변수.get("키이름") => 결과 : 값이 출력
        System.out.println(map.get("no"));
        System.out.println(map.get("name"));

//        TODO : 수정하기 : 객체변수.put(키, 값)
        map.put("no", 2);   // no=1->2 값 수정
        System.out.println("1 -> 2 : " + map.get("no"));

//        TODO : 삭제하기 : 객체변수.remove(키이름);
        map.remove("no");
        System.out.println("키 삭제 : " + map.get("no"));


    }
}
반응형

'Java > Java 이론' 카테고리의 다른 글

자료구조 - Stack / Queue  (0) 2023.09.26
객체의 동등비교  (1) 2023.09.25
MVC 디자인 패턴  (0) 2023.09.22
생성자  (0) 2023.09.20
생성자 함수  (0) 2023.09.20

+ Recent posts