ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 기초] 5. 메소드, 오버로딩
    Dev/Java 2023. 3. 12. 03:25
    728x90

    유용한 정보

    ChatGPT API 최근 풀리게 돼서 파생 활용 서비스 생기고 있다.

    • chatGPT 이용 GitHub 요약 사이트
    GitHub Developer Summarizer
    Summarize a GitHub user using GPT 😎
    https://devmarizer.firebaseapp.com/
    • AskUp : 카카오톡 chatGPT 연계 챗봇
      • chatGPT는 사진 입력이 불가능하지만, 카카오톡을 통해 사진 업로드 시 OCR을 통해 사진 내부 글을 읽어 분석할 수 있다.


    💡4장 피드백 Tip

    💡
    String도 참조형 변수 (reference type)이다.
    • 그렇기에 주소를 비교하는 ‘==’가 아닌 값을 비교하는 equals()를 사용한다.
    • String 배열 선언 시 초기 값은 null이다. (primitive type 배열은 기본 값을 가진다.)

    💡
    반복문의 index는 가독성을 위해 최대한 간편하게 사용하자.


    📘 5장 메소드

    메소드를 정의함으로서, 코드 길어지거나, 같은 코드 반복해야 할 때, 코드를 부품(component)화하고 분리해 재사용 가능하도록 하는 코드로 만들 수 있다.

    함수(Function) 🆚 메소드(Method)

    프로그래밍에서 둘 다 코드를 재사용하기 위한 기본적인 요소이다. 하지만, 두 용어는 사용되는 문맥에 따라 차이가 있다.

    • 함수(function) : 객체와 무관하게 사용되는 입력에 대한 독립적인 기능 수행
    • 메소드(Method) : 객체 내에 정의된 함수로서, 객체의 특정 기능을 수행하거나 객체의 상태 변경

    • chatGPT 대화 내용

    💡
    따라서 Java에서는 메소드의 용어가 일반적이다.
    💡
    하지만, 메소드를 정의할 때 다른 코드의 참조 등 코드 의존성을 줄이고 순수한 입력에 대한 출력 만을 하도록 설계하는 것이 좋다. (코드의 재활용성 관점)

    메소드 정의

    package com.example;
    
    public class Main {
    		// 메소드의 정의
        public static void hello() {
            System.out.println("안녕하세요");
        }
    }

    메소드 호출

    package com.example;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println("메소드를 호출합니다");
            hello(); // 메소드 호출
            System.out.println("메소드 호출이 종료되었습니다");
        }
        
        public static void hello() {
            System.out.println("안녕하세요");
        }
    }

    인수(argument)와 인자(parameter)

    💡
    Parameter(매개변수)는 메소드를 선언할 때, 메소드 내에서 사용될 값을 전달하기 위해 메소드의 괄호 안에 정의하는 변수이다.
    💡
    Argument(인자)는 메소드를 호출할 때, 메소드에 전달되는 값을 의미합니다. 즉, 메소드를 호출할 때 전달되는 입력 값입니다.

    예시

    package com.example;
    
    public class Main {
        public static void main(String[] args) {
            add(100, 20);
            add(200, 50);
        }
    
        public static void add(int x, int y) {
            int result = x + y;
            System.out.println(x + " + " + y + " = " + result);
        }
    }

    👀 Eclipse 활용 Tip

    • ctrl + space : 메소드에 어떤 Argument를 넣어야 하는지 설명을 볼 수 있다.
    • F2 : 문서 보기
    • F3 : 해당 메소드 코드로 이동

    반환 값 (return)

    package com.example;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(add(add(10, 20), add(30, 40)));
        }
    
        public static int add(int x, int y) {
            int result = x + y;
            return result;
        }
    }
    💡
    결과를 저장할 변수를 처음에 정의하고, 마지막에 그 변수를 리턴하는 구조가 좋은 메소드 설계라 할 수 있다.

    오버로드(overload)

    💡
    메소드 오버로딩(Method Overloading)은 같은 이름을 가진 여러 개의 메소드를 정의하는 것을 말합니다.
    💡
    코드의 가독성을 높이고, 메소드의 사용 방법을 유연하게 제공할 수 있는 장점이 있다.

    💡
    println()에서도 범용적으로 사용될 수 있도록 메소드 오버로딩으로 구현되어 있다.

    오버로드 - 인수의 타입이 다른 경우

    public class Main {
        public static void main(String[] args) {
            System.out.println(add(10, 20));
            System.out.println(add(3.5, 2.7));
            System.out.println(add("Hello", "World"));
        }
    
        public static int add(int x, int y) {
            return x + y;
        }
    
        public static double add(double x, double y) {
            return x + y;
        }
    
        public static String add(String x, String y) {
            return x + y;
        }
    }

    오버로드 - 인수의 수가 다른 경우

    public class Main {
        public static void main(String[] args) {
            System.out.println(add(10, 20));
            System.out.println(add(10, 20, 30));
        }
    
        public static int add(int x, int y) {
            return x + y;
        }
        
        public static int add(int x, int y, int z) {
            return x + y +z;
        }
    }

    Call By Reference

    package com.example;
    
    public class Main {
        public static void main(String[] args) {
            int[] numbers = new int[] {1, 2, 3}; // 배열 생성
            printArray(numbers); // 배열 출력 메소드
            System.out.println("------------");
            incrementArray(numbers); // 배열 값 1씩 증가
            printArray(numbers); // 다시 출력
        }
    
        public static void printArray(int[] nums) {
            for (int num : nums) {
                System.out.println(num);
            }
        }
    
        public static void incrementArray(int[] nums) {
            for (int i = 0; i < nums.length; i++) {
                nums[i]++;
            }
        }
    }
    💡
    Call By Refference로 printArray(), incrementArray()가 매개변수로 배열을 받아 해당 같은 배열을 참조하고 있다는 것을 확인할 수 있다.

    리턴 값이 배열인 경우

    package com.example;
    
    public class Main {
        public static void main(String[] args) {
            int[] array = makeArray(3);
            for (int i : array) {
                System.out.println(i);
            }
        }
        
        public static int[] makeArray(int size) {
            int[] newArray = new int[size];
            for (int i = 0; i < newArray.length; i++) {
                newArray[i] = i;
            }
            return newArray;
        }
    }

    main 커맨드 라인 인수

    💡
    커멘드 프롬프트로 실행되는 명령어 프로그램을 Java로 만들었을 때, 뒤에 인자를 받는 용도로 String[] args가 있는 것이다. (잘 안쓰임)


    📝연습 문제

    5-1

    다음 사양을 참고하여 메소드 “introduceOneself”를 정의하시오.

    package com.example;
    
    public class Exam5_1 {
    
        public static void introduceOneself() {
            String name = "keydi";
            int age = 50;
            int height = 200;
            char gender = '남';
    
            System.out.printf("안녕하세요. %s입니다. 저는 %d살 %d %c자입니다.\n", name, age, height, gender);
        }
    
        public static void main(String[] args) {
            introduceOneself();
        }
    }
    

    5-2

    다음 사양을 참고하여 메소드 “email”를 정의하시오.

    package com.example;
    
    public class Exam5_2 {
    
        public static void email(String title, String address, String text) {
            System.out.println(address + " 에 아래의 메일을 송신한다.");
            System.out.println("제목 : " + title);
            System.out.println("본문 : " + text);
        }
    
        public static void main(String[] args) {
            email("안녕", "123@123.ac.kr", "반가워");
        }
    }

    5-3

    다음 사양을 참고하여 연습문제 5-2의 코드에 메소드 “email”를 오버로드 하여 main 메소드에서 호출하시오

    package com.example;
    
    public class Exam5_3 {
    
        public static void email(String title, String address, String text) {
            System.out.println(address + " 에 아래의 메일을 송신한다.");
            System.out.println("제목 : " + title);
            System.out.println("본문 : " + text);
        }
    
        // 메소드 오버로딩 (기존 코드의 재사용)
        public static void email(String address, String text) {
            email("제목 없음", address, text);
        }
    
        public static void main(String[] args) {
            email("123@123.ac.kr", "반가워");
            email("안녕", "123@123.ac.kr", "반가워");
        }
    }
    💡
    메소드 오버로딩시 기존 메소드를 재호출 함으로써 코드를 재사용하여 구현해야 변경에 강한 좋은 코드가 된다.
    💯
    단순 기존 메소드를 복사해서 오버로딩을 구현하지 말고, 코드의 재사용성을 고려하자!!!

    5-4

    다음 사양을 참고하여 메소드 “calcTriangleArea”와 “calcCircleArea”를 작성하시오.

    적당한 값을 인수로 넘겨 올바른 면적이 표시되는지 확인하시오.

    package com.example;
    
    public class Exam5_4 {
    
        public static double calcTriangleArea(double bottom, double height) {
            // 소수 점 둘째 자리 반올림
            return Math.round((bottom * height * 0.5) * 100) / 100.0;
        }
    
        public static double calcCircleArea(double radius) {
            // 소수 점 둘째 자리 반올림
            return Math.round((Math.PI * Math.pow(radius, 2.0)) * 100) / 100.0;
        }
    
        public static void main(String[] args) {
            System.out.println(calcTriangleArea(4, 2));
            System.out.println(calcCircleArea(5));
        }
    }


    퀴즈

    메소드를 활용하여 풀어보자.

    ⭐ 짝수 홀수

    당신은 회사를 대표하여 2개의 숫자를 골라야 합니다. 두 수가 모두 짝수이면 홀수파(홀수를 좋아하는 사람들의 모임)가 싫어합니다. 두 수가 모두 홀수이면 짝수파가 싫어합니다. 당신 은 짝수 하나 홀수 하나를 골라서 모두를 만족시켜야 합니다.

    /*
     * 홀수 짝수 쌍 판별
     */
    package com.example;
    
    import java.util.Scanner;
    
    public class Quiz02 {
        // 홀수 판별
        public static boolean isOdd(int num) {
            return (num % 2 == 0) ? true : false;
        }
    
        // 홀수 판변 후 같은지 비교
        public static String solution(int n, int m) {
            boolean nIsOdd = isOdd(n);
            boolean mIsOdd = isOdd(m);
    
            return nIsOdd == mIsOdd ? "YES" : "NO";
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int N = sc.nextInt();
            int M = sc.nextInt();
    
            System.out.println(solution(N, M));
        }
    }
    💡
    홀수인지 판별하는 부분과 두 수가 홀짝 쌍(pair)인지 비교하는 메소드를 나누어 구현했다.

    ⭐ 등차수열

    다음과 같은 수열을 출력하는 프로그램을 만들어 보자.

    💡
    5 8 11 14 17 20 23 26 29 32
    • 첫번째 숫자가 5에서 3 씩 증가 해가는 것을 알 수 있습니다.
    • 일반적으로 이것을 첫항이 5, 공차가 3인 등차수열이라고 합니다.
    • 이런 수열을 출력하는 프로그램을 만들어 보자.
    • 수열의 첫항 m과 공차 n이 주어지면 10 번째까지의 숫자를 공백으로 구분하여 출력하는 프 로그램을 작성하시오.

    /*
     * 등차수열 출력하기
     */
    package com.example;
    
    import java.util.Scanner;
    
    public class Quiz03 {
    
        public static String solution(int startNum, int difference) {
            StringBuilder sb = new StringBuilder();
    
            for (int i = 0; i < 10; i++) {
                sb.append((startNum + difference * i) + " ");
            }
            sb.deleteCharAt(sb.length() - 1);
            return sb.toString();
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int m = sc.nextInt();
            int n = sc.nextInt();
            System.out.println(solution(m, n));
        }
    }
    💡
    StringBuilder를 이용해서 해당 등차수열에 대한 값들을 넣어 풀었다.
    💡
    마지막 공백은 deleteCharAt()으로 삭제했다.

    문자열 String 붙이기

    문자열 붙이기는 4가지 방법이 있다.

    Concat, ‘+’ 연산자, StringBuilder, StringBuffer가 있으며, Concat과 ‘+’ 연산자를 이용한 String 붙이기는 매 번 문자열을 추가할 때마다 새로운 인스턴스가 생성되기 때문에 성능이 좋지 못하다.

    StringBuilder

    StringBuilder는 새로운 String 객체 인스턴스를 메모리에 할당하는 과정 없이도 수정이 가능한 장점이 있다.

    💡
    StringBuilder의 경우에는 반복문 안에서 문자열을 계속 추가해야 하는 경우에 사용하는 것이 좋다.

    사용 방법

    StringBuilder sb = new StringBuilder();
    sb.append("str1");
    sb.append("str2");
    String concat = sb.toString();

    StringBuffer

    StringBuffer는 StringBuilder와 호환 가능하기 때문에 사용법은 동일하다.

    StringBuffer와 StringBuilder의 차이점은 StringBuffer은 thread-safethread-safe 하다는 점이다. StringBuilder는 동기화를 보장하지 않는다.

    • StringBuffer 클래스는 동시에 이 객체에 접근했을 때, 동시성을 제어해주는 기능이 존재
    • StringBuilder 클래스는 동시성 제어 기능을 제외하여 상대적으로 동작속도가 빠르다.

    💡
    멀티스레드 환경에서 하나의 문자열을 수정할 때 StringBuffer 클래스를 사용하는 것이 좋다.
    💡
    멀티스레드 환경이 아니라면, StringBuilder를 사용하는 것이 속도 면에서 좋다.

    사용방법

    StringBuffer sbf = new StringBuffer();
    sbf.append("str1");
    sbf.append("str2");
    String concat = sbf.toString();

    StringBuilder, StringBuffer에서 마지막 문자 지우기

    setLength(), deleteCharAt()

    setLength(), deleteCharAt() 메소드를 활용해서 마지막 문자를 지울 수 있고, StringBuilder, StringBuffer 두 클래스 모두 동일한 API로 구현되어 있다.

    사용 방법

    StringBuilder sb = new StringBuilder("hello world.");
    //StringBuffer sb = new StringBuffer("hello world.");
    
    // 마지막 문자 제거 
    sb.setLength(sb.length()-1);    //1. setLength() 이용
    sb.deleteCharAt(sb.length()-1); //2. deleteCharAt() 이용
    // sb = "hello world"

    Uploaded by N2T

    728x90
    반응형

    댓글

Keydi's Tistory