🟩 함수 오버로드(overload)

 

동일한 기능, 동일한 이름의 메소드에 여러가지 매개 변수를 추가하여

 

(하나의 함수 이름에 매개 변수를 과적하여) 기능을 확장시킨 함수 (옵션이 있는 함수)

(EX) print 메소드, print라는 함수의 의미는 살리면서 선택해서 사용할 수 있어졌다.

 

 

이때 과적된 내용을 가지고 있는 녀석이 기본 함수 안에 들어가는 방법으로, 중복된 내용을 반복시키지 않고 구현해 줄 수 있다.

 

→  과적된 애는 인자가 더 많아서 품을 수 있는 애가 많기 때문에 과적함수(오버로딩)가 기본 함수(과적된 내용이 없이 기본값을 가진 함수) 안으로 들어감


기존 함수가 있는데 동일한 함수에 일정 기능을 추가해서 사용하고 싶을 때 사용한다.

 

//성적 출력
examPrint(list);
System.out.println();
examPrint(list,3);//Overload(과적) 함수

기존 메서드를 이용하면 전체내용을 출력하는데, 3개만 출력하고 싶을 때 위처럼 만듦.


//성적 출력
examPrint(list);
System.out.println();
examPrint(list,3);//Overload(과적) 함수

 private static void examPrint(ExamList list, int limit) {
        Exam[] exams= list.exams;

        int size = limit;

        int num=1;//성적 등수 확인용 숫자.

        for (int i = 0; i < size; i++) {
            Exam exam = exams[i];
            int kor = exam.kor;
            int eng = exam.eng;
            int math = exam.math;

            int total = exam.total;
            float avg = exam.avg;

//                    if (avg >= 80)//성적 80이상
            System.out.printf("%d등 %3d, %3d, %3d, 총점 %3d 평균 %.2f\n", num, kor, eng, math, total, avg);
            num++;
        }

    }
    private static void examPrint(ExamList list) {
        Exam[] exams= list.exams;

        int size = list.index;

        int num=1;//성적 등수 확인용 숫자.

        for (int i = 0; i < size; i++) {
            Exam exam = exams[i];
            int kor = exam.kor;
            int eng = exam.eng;
            int math = exam.math;

            int total = exam.total;
            float avg = exam.avg;

//                    if (avg >= 80)//성적 80이상
            System.out.printf("%d등 %3d, %3d, %3d, 총점 %3d 평균 %.2f\n", num, kor, eng, math, total, avg);
            num++;
        }

    }

위에처럼 짜면 코드가 길어져서 아래와 같이 작성할 수 있다.

 private static void examPrint(ExamList list) {//오버로드 함수
        int size = list.index;
        examPrint(list, size);
    }

    private static void examPrint(ExamList list, int limit) {
        Exam[] exams = list.exams;

        int size = limit;

        int num = 1;//성적 등수 확인용 숫자.

        for (int i = 0; i < size; i++) {
            Exam exam = exams[i];
            int kor = exam.kor;
            int eng = exam.eng;
            int math = exam.math;

            int total = exam.total;
            float avg = exam.avg;

//                    if (avg >= 80)//성적 80이상
            System.out.printf("%d등 %3d, %3d, %3d, 총점 %3d 평균 %.2f\n", num, kor, eng, math, total, avg);
            num++;
        }

    }

아래 코드는 혼자서 오버로드 함수를 구현해 본 것이다.

//overloading
	{
        aaprint();
        aaprint(3);
    }

    private static void aaprint() {
        int defaultNum = 10;//기본 값 10
        aaprint(defaultNum);
    }

    private static void aaprint(int limit) {
        int size = limit;
        for (int i = 0; i < limit; i++)
            System.out.println("출력");
    }

'IT > JAVA' 카테고리의 다른 글

[JAVA] ✏️ Boxing과 Unboxing  (1) 2023.07.09
[Java] 컬렉션(Collection) ?  (1) 2023.07.09
[Java]구조적인 프로그래밍(메서드)  (2) 2023.06.28
[JAVA] 변수와 상수변수  (0) 2023.06.26
[Java] 배열(Array)  (0) 2023.06.21

🟩 문제


🟩 해결방법

  • split 메서드를 이용해서 하나씩 문자열 배열에 담아준 후 정수형 배열에 넣어서 계산!


🟩 코드

public static int solution(int n) {
        int answer = 0;

        String loadN = new String(String.valueOf(n));
        String[] separationN = loadN.split("");

        for (int i = 0; i < separationN.length; i++) {
            int[] numN = new int[separationN.length];
            numN[i] = Integer.parseInt(separationN[i]);

            answer = answer + numN[i];
        }

        return answer;
    }

🟩 문제


🟩 해결방법

  • 숫자를 더하면 숫자의 합이 나오니 문자열로 변환 후 합친다.
  • 문자열로 합친 숫자를 정수로 비교해서 조건 연산을 한다.


🟩 코드

 

public static int solution(int a, int b) {
        int answer = 0;

        //정수인 숫자를 문자로 변환
        String aa = String.valueOf(a);
        String bb = String.valueOf(b);

        //문자열인 두 숫자를 합쳐서 정수로 변환
        int aabb = Integer.valueOf(aa + bb);
        int aabb2 = 2 * a * b;

        //조건 판별식
        if (aabb > aabb2 || aabb == aabb2)
            answer = aabb;

        if (aabb < aabb2)
            answer = aabb2;

        return answer;
    }

✅ 문제

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Ex_0629_02 {
    public static void main(String[] args) throws IOException {
        //문제 7 : 다음 각 절차를 따라 작성하시오.
        //// 1. res/map.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
        //
        //00010
        //01010
        //00000
        //// 2. map이라는 이름으로 5x3 크기의 정수를 담을 수 있는 이차원 배열과 board라는 이름의 10X6크기의 문자를 담을 수 있는 이차원 배열을 생성하시오.
        //
        //[           ]  map = [                                      ];
        //[           ]  board = [                                      ];

        int[][] map = new int[3][5];
        char[][] board = new char[6][10];

        {
            FileInputStream fis = new FileInputStream("afterschool/res/map.txt");
            Scanner fscan = new Scanner(fis);

            for (int i = 0; i < map.length; i++) {
                String str = fscan.nextLine();
                for (int j = 0; j < map[i].length; j++) {
                    String[] tokens = str.split("");
                    map[i][j] = Integer.parseInt(tokens[j]);
                }
            }
        }
        System.out.println("map 데이터 로드 완료");
        //// 3. res/map.txt에서 읽은 데이터로 map 배열을 채우시오.
        //
        //{
        //    // 코드를 작성하는 공간
        //
        //    System.out.println(“map 데이터 로드 완료”);
        //}



        //// 4. map 데이터 하나는 board 배열의 4칸과 대응되며 다음과 같은 모양으로 대응된다.
        //// map에서 0은 다음 모양과 같다.
        //// ┌ ┐
        //// └ ┘
        //// map에서 1은 다음 모양과 같다.
        //// ▩▩
        //// ▩▩
        //// map에서 읽은 데이터를 이용해서 board 배열을 채우시오.  다음은 board 배열에 채워진
        //// 모습니다.
        //// ┌ ┐┌ ┐┌ ┐▩▩┌ ┐
        //// └ ┘└ ┘└ ┘▩▩└ ┘
        //// ┌ ┐▩▩┌ ┐▩▩┌ ┐
        //// └ ┘▩▩└ ┘▩▩└ ┘
        //// ┌ ┐┌ ┐┌ ┐┌ ┐┌ ┐
        //// └ ┘└ ┘└ ┘└ ┘└ ┘
        //
        //{
        //     // 코드를 작성하는 공간
        //
        //
        //
        //    System.out.println(“board 그리기 완료”);
        //}

        //보드 윤곽 넣기
        {
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 10; j++) {
                    if ((i % 2 == 0))
                        if (j % 2 == 0)
                            board[i][j] = '┌';
                        else
                            board[i][j] = '┐';
                    else if (j % 2 == 0)
                        board[i][j] = '└';
                    else
                        board[i][j] = '┘';
                }
                System.out.println();
            }
        }

        //이상한 네모 입력
        {
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 5; j++) {
                    if (map[i][j] == 1) {
                        int row = i * 2;
                        int col = j * 2;
                        board[row][col] = '▩';
                        board[row][col + 1] = '▩';
                        board[row + 1][col] = '▩';
                        board[row + 1][col + 1] = '▩';
                    }
                }
        }

        //출력
        {
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 10; j++) {

                    System.out.printf("%c", board[i][j]);
                }
                System.out.println();
            }
        }


        //// 5. board 배열을 화면에 출력하는 코드를 작성하시오.
        //
        //{
        //     // 코드를 작성하는 공간
        //
        //
        //
        //    System.out.println(“board 출력 완료”);
        //}
    }
}

✅ 해결방법

  • for문으로 좌표를 뽑아두고 규칙을 찾으면 편하다.


✅ 코드

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Ex_0629_02 {
    public static void main(String[] args) throws IOException {
        //문제 7 : 다음 각 절차를 따라 작성하시오.
        //// 1. res/map.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
        //
        //00010
        //01010
        //00000
        //// 2. map이라는 이름으로 5x3 크기의 정수를 담을 수 있는 이차원 배열과 board라는 이름의 10X6크기의 문자를 담을 수 있는 이차원 배열을 생성하시오.
        //
        //[           ]  map = [                                      ];
        //[           ]  board = [                                      ];

        int[][] map = new int[3][5];
        char[][] board = new char[6][10];

        {
            FileInputStream fis = new FileInputStream("afterschool/res/map.txt");
            Scanner fscan = new Scanner(fis);

            for (int i = 0; i < map.length; i++) {
                String str = fscan.nextLine();
                for (int j = 0; j < map[i].length; j++) {
                    String[] tokens = str.split("");
                    map[i][j] = Integer.parseInt(tokens[j]);
                }
            }
        }
        System.out.println("map 데이터 로드 완료");
        //// 3. res/map.txt에서 읽은 데이터로 map 배열을 채우시오.
        //
        //{
        //    // 코드를 작성하는 공간
        //
        //    System.out.println(“map 데이터 로드 완료”);
        //}



        //// 4. map 데이터 하나는 board 배열의 4칸과 대응되며 다음과 같은 모양으로 대응된다.
        //// map에서 0은 다음 모양과 같다.
        //// ┌ ┐
        //// └ ┘
        //// map에서 1은 다음 모양과 같다.
        //// ▩▩
        //// ▩▩
        //// map에서 읽은 데이터를 이용해서 board 배열을 채우시오.  다음은 board 배열에 채워진
        //// 모습니다.
        //// ┌ ┐┌ ┐┌ ┐▩▩┌ ┐
        //// └ ┘└ ┘└ ┘▩▩└ ┘
        //// ┌ ┐▩▩┌ ┐▩▩┌ ┐
        //// └ ┘▩▩└ ┘▩▩└ ┘
        //// ┌ ┐┌ ┐┌ ┐┌ ┐┌ ┐
        //// └ ┘└ ┘└ ┘└ ┘└ ┘
        //
        //{
        //     // 코드를 작성하는 공간
        //
        //
        //
        //    System.out.println(“board 그리기 완료”);
        //}

        //보드 윤곽 넣기
        {
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 10; j++) {
                    if ((i % 2 == 0))
                        if (j % 2 == 0)
                            board[i][j] = '┌';
                        else
                            board[i][j] = '┐';
                    else if (j % 2 == 0)
                        board[i][j] = '└';
                    else
                        board[i][j] = '┘';
                }
                System.out.println();
            }
        }

        //이상한 네모 입력
        {
            for (int i = 0; i < 3; i++)
                for (int j = 0; j < 5; j++) {
                    if (map[i][j] == 1) {
                        int row = i * 2;
                        int col = j * 2;
                        board[row][col] = '▩';
                        board[row][col + 1] = '▩';
                        board[row + 1][col] = '▩';
                        board[row + 1][col + 1] = '▩';
                    }
                }
        }

        //출력
        {
            for (int i = 0; i < 6; i++) {
                for (int j = 0; j < 10; j++) {

                    System.out.printf("%c", board[i][j]);
                }
                System.out.println();
            }
        }


        //// 5. board 배열을 화면에 출력하는 코드를 작성하시오.
        //
        //{
        //     // 코드를 작성하는 공간
        //
        //
        //
        //    System.out.println(“board 출력 완료”);
        //}
    }
}

 


👍좋았던 점👍

  • 연산자, 조건문과 반복문, 배열... 이전에 배운 모든 내용들이 다 들어가 있어서 복습 겸 실력을 다질 수 있어서 좋았음.

🔥어려웠던 점🔥

 

  • 위에 있는 좌표를 (x,y) -> (0, 1) 이런식으로 해석하며 풀어야 하는데....정수 23, 45 이런식으로 생각을 해버려서 Index 규칙찾는게 어려웠다.
  • 배열의 Index는 0부터 시작하는데...나도 모르게 1부터 카운트해서 규칙을 못 찾고 헤메고 있었다.

✅ 문제

// 1. res/bitmap.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.

11111111110000000000
11111111100000000000
11111111000000000000
11111110000000000000
11111100000000000000
11111000000000000000
11110000000000000000
11100000000000000000
11000000000000000000
10000000000000000000


2. bitmap이라는 이름으로 20X10크기의 정수를 담을 수 있는 이차원 배열을 생성하시오.

[           ]  bitmap = [                                      ];

3. 다음 그림과 같은 모양이 되도록 값의 위치를 변경하시오
00000000001111111111
00000000000111111111
00000000000011111111
00000000000001111111
00000000000000111111
00000000000000011111
00000000000000001111
00000000000000000111
00000000000000000011
00000000000000000001

{
     // 코드를 작성하는 공간



    System.out.println(“자리변경 완료”);
}


// 4. res/bitmap-out.txt 파일로 bitmap 배열의 값들을 저장 
{
     // 코드를 작성하는 공간

    

    System.out.println(“저장 완료”);

✅ 해결방법

  • bitmap [10][20] 이 있으면 [20]에 해당하는 값들을 좌우 대칭하게 바꿔줘야 한다.
  • 좌표로 생각하고 접근하면 편하다!

✅ 코드

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.util.Scanner;

        //문제 6 : 다음 각 절차를 따라 작성하시오.
        //
        //// 1. res/bitmap.txt 파일을 생성하고 다음 데이터를 복사/붙여넣으시오.
        //
        //11111111110000000000
        //11111111100000000000
        //11111111000000000000
        //11111110000000000000
        //11111100000000000000
        //11111000000000000000
        //11110000000000000000
        //11100000000000000000
        //11000000000000000000
        //10000000000000000000
public class Ex_0629_01 {
    public static void main(String[] args) throws IOException {

        //2. bitmap이라는 이름으로 20X10크기의 정수를 담을 수 있는 이차원 배열을 생성하시오.
        // [           ]  bitmap = [                                      ];
        int[][] bitmap = new int[10][20];

        //파일 읽어오기 & 읽어온 파일 btimap 배열에 하나씩 담기.
        {
            FileInputStream fis = new FileInputStream("afterschool/res/bitmap.txt");
            Scanner fscan = new Scanner(fis);

            for (int i = 0; i < bitmap.length; i++) {
                String str = fscan.nextLine();
                for (int j = 0; j < bitmap[i].length; j++) {

                    String[] tokens = str.split("");
                    bitmap[i][j] = Integer.parseInt(tokens[j]);

                    System.out.print(bitmap[i][j]);
                }
                System.out.println();
            }

        //3. 다음 그림과 같은 모양이 되도록 값의 위치를 변경하시오
        //00000000001111111111
        //00000000000111111111
        //00000000000011111111
        //00000000000001111111
        //00000000000000111111
        //00000000000000011111
        //00000000000000001111
        //00000000000000000111
        //00000000000000000011
        //00000000000000000001

            //값 바꾸기 정렬
            //bitmap.length "10", bitmap.length[i][] "20"
            for (int i = 0; i < bitmap.length; i++)
                for (int j = 0; j < bitmap[i].length/2; j++) {
                    int temp = bitmap[i][(bitmap[i].length-1) - j];
                    bitmap[i][(bitmap[i].length-1) - j] = bitmap[i][j];
                    bitmap[i][j] = temp;
                }
            //i 0        |  1        |        2 |        3 | ....
            //j 0 <-> 19 |  1 <-> 18 | 2 <-> 17 | 3 <-> 16 | ....
        }

        System.out.println("자리변경 완료");

        //i=10 j=20
        for (int i = 0; i < bitmap.length; i++) {
            for (int j = 0; j < bitmap[i].length; j++) {
                System.out.print(bitmap[i][j]);
            }
            System.out.println();
        }

        // 4. res/bitmap-out.txt 파일로 bitmap 배열의 값들을 저장
        {
            FileOutputStream fos = new FileOutputStream("afterschool/res/bitmap_out.txt");
            PrintWriter fout = new PrintWriter(fos, true, Charset.forName("UTF-8"));

            for (int i = 0; i < bitmap.length; i++) {
                for (int j = 0; j < bitmap[i].length; j++) {
                    fout.print(bitmap[i][j]);
                }
                fout.println();
            }
                fout.close();
                fos.close();
        }
    }

    }

 


🔥어려웠던 점🔥

  • 아래 좌우 대칭하게 값을 바꾸는 방법을 생각하는데 어려웠었다.
  • 데이터의 값의 갯수는 20개이고, 좌우 대칭하게 바꿔주면 10번만 반복하면 된다.
  • 두 번째 for문안에 Index를 "나누기 2"를 안해줘서 못하고 있었지만... 옆에 착한 짝꿍 누나가 팁을 줘서 해결! 
//값 바꾸기 정렬
//bitmap.length "10", bitmap.length[i][] "20"
for (int i = 0; i < bitmap.length; i++)
    for (int j = 0; j < bitmap[i].length/2; j++) {
        int temp = bitmap[i][(bitmap[i].length-1) - j];
        bitmap[i][(bitmap[i].length-1) - j] = bitmap[i][j];
        bitmap[i][j] = temp;
    }
//i 0        |  1        |        2 |        3 | ....
//j 0 <-> 19 |  1 <-> 18 | 2 <-> 17 | 3 <-> 16 | ....

🟩 정의

 

응용 프로그램에서 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스

 

프로그램과 프로그램사이에 연결해주는 다리!


🟩 특징

  • 구현과 독립적으로 사양만 정의되어 있다.

 

  • API에 따라 접근 권한이 필요할 수 있다.

 

  • Java API, Kakao API 기타 등등 있다.

✅ 예시)

  • 사용자들끼리 맛집을 공유하고 싶은 서비스를 만들고 싶다!

 

  • 서비스를 만들기 위해서 지도가 필요한데 내가 만들기는 너무 어렵…

 

  • G사의 지도 서비스를 이용해서 만들고 싶다!!

 

 

  • G사의 지도를 사용하려면 위처럼 “/map/위도&경도” 를 요청하면 내가 원하는 지도와 관련된 정보를 받을 수 있다.

 

https://console.cloud.google.com/apis/library?hl=ko

 

Google Cloud console

 

console.cloud.google.com

 

 

구글 API가 궁금하면 위 사이트를 들어가서 구경해보자

+ Recent posts