제 5장. 메소드(method)

한동윤·2022년 4월 14일
0

java 기초다지기

목록 보기
6/15
post-thumbnail

5장 내용 정리하기 전 Tip

(break문의 유무)

package com.company.quiz;

import java.util.Scanner;

public class Quiz_4_4 {
    public static void main(String[] args) {
        int[] numbers = {3, 4, 9};

        System.out.print("1자리의 숫자를 입력해주세요 : >> ");
        int input = new Scanner(System.in).nextInt();

        for (int number : numbers) {
            if (input == number) {                         //★
                System.out.println("정답");
                break; 
            }
        }
    }
}

break가 있고 없고의 차이! ★위치에서 디버깅을 해보았을때
1. break가 없을 경우 : 입력해준 숫자가 정답이여도 남은 변수의 값들과 비교를 한다.
2. break가 있을 경우 : 입력해준 숫자가 정답이면 break문을 통해 프로그램이 바로 종료가된다.

예를 들어보면(for example)
위의 코드에서 입력한 숫자가 3이라고 가정하자.

break문이 없을 때 입력값 3과 변수의 값 3,4,9 총 3번 실행 루트를 돌리는데(3이라는 값이 정답이여도 numbers의 변수 하나하나 다 실행시켜본다)

□된 좌측 부분은 계속해서 프로그램을 실행시킨다는 의미
□된 상단 부분(step over)이 프로그램을 한줄씩 실행 시킨다는 의미


이렇게 값을 하나하나 비교 해준다.

break문을 있을 때 입력값 3과 변수의 값을 비교를 하는데 정답 3이 나오게 되면 프로그램 종료.
--> input값이랑 number이 같을 때 step over을 해주면 프로그램 종료.

--> break문이 없을 때와 있을 때의 차이점을 보면 있을 때가 최대 3배(변수의 개수에 따라 달라짐) 정도 효율이 좋다는것을 알 수 있다.
( 만약 입력해 준 숫자가 9이면 break문 없을 때와 break문 있을 때와 차이는 없지만 전체적으로 봤을 때 break문이 있을 때가 성능이 더 좋다는 장점을 가진다 )

<포인터 동작관련 TIP?>
주소값은 자바에서 찾아볼 수 없는데 주소를 보는듯한 느낌로는 볼 수 있다.

배열을 만들고 프린트를 해보면 의미불명의 숫자와 문자들이 섞여있는 문장 나오는데 이를 해시코드라고 부른다.

메모리상에 코드가 만들어지면 해시코드가 부여가되는데 이것을 가지고 같은 것이 아닌지 판별을 할 수는 있다 --> 바라보는 주소가 같다는 것을 의미!!

바라보는 주소 다르면 똑같이 변수를 만들어주면(안에 값이 같아도 )해시코드가 다르게 나온다.

package com.company.quiz;

public class Note {
    public static void main(String[] args) {
        int[] points = new int[4];
        double[] weights = new double[5];
        boolean[] answers = new boolean[3];
        String[] names = new String[3];

        System.out.println(points);
        System.out.println(weights);
        System.out.println(answers);
        System.out.println(names);
    }
}


이렇게 하지 않아도 디버그 모드를 해보면 알수 있다.
변수에 포인터를 올려둬보면 @번호가 나오는데 이를 통해서 번호가 같으면 서로 같은 것이다 라는것을 알 수 있다.

▶ 위의 사진과 같이 각각의 주소가 어디로 향하는지 같은 주소를 사용하고 있는지 다른 주소를 사용하고 있는지 이해하면 메소드를 사용하기에 편할것이다.

====================================================================

메소드란?

메소드는 코드가 길어지거나, 같은 코드를 반복해야 할 때, 코드를 부품화하여 분리해 보기 좋은 코드로 만들 수 있게 하는 함수역할을 해주는것이다.
즉, 가독성이 좋아지고 재사용하기에도 좋다

메소들의 역할

입력값 ---> 메소드 ---> 리턴값
(메소드를 선언해주고 호출하는 방식)

메소드의 구조

public class Note {
    public static int add(int x, int y) { 
    // 리턴자료형(int) 메소드명(add) (입력자료형1(int) 매개변수1(x), 입력자료형2(int) 매개변수2(y),...) 
        int ans = x + y;
        return ans; // return 리턴값(ans)
    }

}

리턴자료형 : 메소드 수행 후 돌려줄 값의 자료형을 의미

메소드에서의 리턴타입

리턴타입에는 int, String, boolean 등의 자료형이 들어간다. 리턴받는 자료형과 리턴 데이터는 동일해야한다.

이런 리턴타입에 void가 들어가는 경우는 return받는 데이터가 없다는것을 의미한다.

메소드의 입출력 유무의 분류 및 사용예제

1.입력과 출력이 모두 있는 메소드

int sum(int a, int b) {
    return a+b;
}

Sample sample = new Sample();
int result = sample.sum(3, 4);

2. 입력값이 없는 메소드

public class Sample {
    String say() {
        return "Hi";
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        String a = sample.say();
        System.out.println(a);  // "Hi" 출력
    }
}

입력 값 : x
리턴 값 : String 자료형

3. 리턴값이 없는 메소드

public class Sample {
    void sum(int a, int b) {
        System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.sum(3, 4);
    }
}

입력 값 - int 자료형 a, int 자료형 b
리턴 값 - void (없음)

4. 입력값도 리턴값도 없는 메소드

public class Sample {
    void say() {
        System.out.println("Hi");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.say();
    }
}

입력 값 - 없음
리턴 값 - void (없음)

                                   메소드의 입출력 유무의 분류 및 사용예제 출처)https://wikidocs.net/225

오버로드란

▶쉽게 말해서 같은 이름의 메소드를 여러개 정의 하는 것이다.

<오버로드의 조건>
1. 메소드의 이름이 같아야한다. (노란줄)
2. 매개변수의 개수 또는 타입이 달라야한다. (빨간줄)
3. 매개변수의 개수와 타입은 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다

--> 위의 코드에서는 main메소드를 void로 받아주었기 때문에 리턴값이 없지만 리턴 값이 하나로 정해진 경우에는 사용불가!

오버로드를 사용하는 이유

매개변수가 다르지만 add라는 메소드의 이름이 중복되어도 괜찮기 때문에 각각의 메소드의 이름을 짓는 번거로움에서 벗어날 수도 있고 add라는 이름 하나만 기억하면 되므로 언제든지 생각해서 사용하기에 편하다는 장점이있다.

커맨드 라인 입력

자바 Class로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고, main()메소드를 호출할 때 매개값으로 전달한다.

public static void main(String[] args){
}

String[] args = {};로 길이가 0인 String 배열이 먼저 생성되는데 만약 String 배열의 값을 지정해주고 쓰고 싶다면 Run -> Edit Configurations -> Program argument에서 값을 지정해줄 수 도 있다.

값은 10과 20 으로 설정해주고 한번 코드를 작성해 프로그램을 실행해보았다.

public class Note {

    public static void main(String[] args) {
        if (args.length != 2) {  
            System.out.println("데이터의 개수가 2개가 아닌가바");
            System.exit(0);     
        }

        String strNum1 = args[0];
        String strNum2 = args[1];

        int num1 = Integer.parseInt(strNum1);    
        int num2 = Integer.parseInt(strNum2);

        int result = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + result);
    }
}
  1. 데이터의 개수를 3개로 설정했을 때

  2. 데이터의 개수를 2개로 설정했을때(10, 20)

메소드의 재활용

public class Quiz_5_3 {
    public static void main(String[] args) {
        System.out.println("==========================================");
        String address = "dongyunhan1@naver.com";
        String title = "2020년도 상반기 인턴채용";
        String text = "본문의 내용은 아래와 같습니다.";

        email(address, title, text);
        System.out.println("==========================================");
        email(address, text);

    }

    public static void email(String address, String title, String text) {
        System.out.println(address + "의 아래의 메일을 송신한다");
        System.out.println("제목 : " + title);
        System.out.println("본문 : " + text);

    }

    public static void email(String address, String text) {
//        System.out.println(address + "의 아래의 메일을 송신한다");
//        System.out.println("제목 : 제목없음");
//        System.out.println("본문 : " + text);
        email(address, "제목 없음", text); 
        이렇게 사용하는것이 메소드의 재활용이다.

    }
}

0개의 댓글

관련 채용 정보