[JAVA] 김영한의 자바 입문 ; 메서드

선뀰·2023년 12월 21일
0

JAVA

목록 보기
8/25

생각보다 길었던 배열을 끝내고
드디어 마지막 과정인 메서드로 넘어왔다.

비슷한 코드들이 여러 군데에서 쓰이기 때문에
같은 코드를 여러번 반복해서 작성하는 번거로움을 지우기 위해

함수 = 메서드

함수를 만들고 (정의), 필요한 입력 값을 넣어서 해당 함수를 호출한다. 계산된 결과가 나온다.
블랙박스와 같기 때문에 함수를 호출할 때 외부에서 필요한 값만 입력하면 계산된 결과가 출력되고, 여러 번 호출이 가능하다.

즉, 재사용이 가능하다.

메서드

자바에서는 함수를 메서드(Method)라 한다.

  • 메서드 선언
    public static int add(int a, int b)
    메서드를 선언하는 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.
    메서드 선언 정보를 통해 메서드를 호출 가능하다.

  • 제어자(Modifier) : public, static와 같은 부분이다.
    public : 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다. 접근 제어에서 학습한다.
    static : 객체를 생성하지 않고, 호출할 수 있는 정적 메서드라는 뜻이다.
    메서드 앞에 static이 붙어 있을 때는 static이 붙은 필드 또는 메서드만 호출할 수 있다.

  • 반환타입 : 반환하는 데이터의 타입을 지정한다.
    void print(String str) : 입력 매개변수가 없을 때다. 메서드가 반환하는 값이 없다는 것을 의미한다.
    int add(int a, int b)
    int : 반환 타입을 정의한다. 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정
    add : 메서드에 이름을 부여한다. 메서드를 호출 가능
    (int a, int b) : 메서드를 호출할 때 전달하는 입력 값을 정의한다. 해당 메서드 안에서만 사용된다. = 매개변수(파라미터)

  • 메서드 사용

public static void main(String[] args) {
        int sum1 = add(5, 10);
        System.out.println("결과 출력" + sum1);

       
    // add 메서드를 만드는 방법이다.
    public static int add(int a, int b) {
        System.out.println(a + "+" + b + " 연산 수행");
        int sum = a * b;
        return sum;

    }

중복이 제거되고 코드가 깔끔해진다.
메서드의 선언 부분과, 메서드 본문으로 나눌 수 있다.
메서드를 호출하는 곳에서는 메서드 선언은 알지만 메서드 본문은 모른다.

메서드 호출과 용어정리

메서드를 호출할 때 메서드에 넘기는 값과 파라미터의 타입이 맞아야 한다.

  • 메서드 정의
    int call(String str, int age)

  • 호출
    call("hello", 20)

인수(Argument)

'인'과 '수'의 합성어, '들어가는 수'라는 의미를 가진다. 메서드 내부로 들어가는 값을 의미한다.
인자도 같은 의미이다.

"hello", 20처럼 넘기는 값을 인수(=인자)라고 한다. 아규먼트, 인수, 인자라는 용어를 모두 사용
call("hello", 20)

매개변수 (Parameter)

'매개'와 '변수'의 합성어, '중간에서 전달하는 변수'라는 의미를 가진다.
메서드 호출부와 메서드 내부 사이에서 값을 전달하는 역할을 하는 변수라는 뜻이다.

매개변수가 없거나 반환 타입이 없는 경우

모든 메서드는 항상 return을 호출해야 한다. 반환 타입이 void의 경우 예외로 생략해도 된다.

메서드와 형변환

메서드를 호출할 때도 형변환이 적용된다. 명시적 형변환, 자동 형변환

  • 명시적 형변환
    메서드를 호출하는데 인자와 매개변수의 타입이 맞지 않다면?
  • 자동 형변환
    int < long < double
    메서드를 호출할 때 매개변수에 값을 전달하는 것도 변수에 값을 대입하는 것이다.
    자동 형변환이 그대로 적용된다.

public static void main(String[] args) {
int number = 1.5;
printNumber(number);
}
public static void printNumber(double n) {
System.out.println("숫자: " + n);
}

메서드를 호출할 때 double형이 int형보다 범위가 넓기 때문에, main에서
printnumber 메소드를 호출해도 자동으로 int형으로 형 변환이 이루어진다.

메서드 오버로딩

이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라 한다.
과하게 물건을 담았다는 뜻이다. 같은 이름의 메서드를 여러개 정의했다고 이해하면 된다.

add(int a, int b)
add(int a, int b, int c)
add(double a, double b)

  • 오버로딩 규칙
    메서드의 이름이 같아도 매개변수의 타입 및 순서가 다르면 오버로딩을 할 수 있다. 참고로 반환 타입은 인정하지 않는다.

메서드 시그니처 = 타입만 보고 구분을 한다.

int add(int a, int b)
int add(double a, int b)
타입을 다르게 지정해줘야 한다.

메서드 이름 + 매개변수 타입(순서)
자바에서 메서드를 구분할 수 있는 고유한 식별자나 서명을 뜻한다. 메서드의 이름과 매개변수 타입(순서 포함)으로 구성되어 있다. 메서드를 구분할 수 있는 기준이다. 각각의 메서드를 고유하게 구분할 수 있어야 한다. 메서드 이름이 같아도 메서드 시그니처가 다르면 다른 메서드로 간주한다. 반환 타입은 시그니처에 포함되지 않는다.

자동형변환도 적용된다.

문제와 풀이 1

구조적으로 유지보수 하기 쉽게 사용할 수 있다.

변수명 vs 메서드명

  • 변수명
    일반적으로 명사를 사용한다.
    customerName, totalSum, employeeCount, isAvailable

  • 메서드명
    동작하는데 사용되기 때문에 동사로 시작한다.
    printReport(), calculateSum(), addCustomer(), getEmpolyeeCount()

메서드 사용의 장점

  • 코드 재사용 : 특정 기능을 캡슐화 하기 때문에, 필요할 때마다 그 기능을 다시 작성할 필요 없이 해당 메서드를 호출함으로써 코드를 재사용할 수 있다.
  • 코드의 가독성 : 이름이 부여된 메서드는 코드가 수행하는 작업을 명확하게 나타내므로, 코드를 읽는 사람에게 추가적인 문맥을 제공한다.
  • 모듈성 : 큰 프로그램을 작은, 관리 가능한 부분으로 나눌 수 있다. 디버깅 쉽게 한다.
  • 코드 유지 관리 : 특정 부분에 문제가 발생하면, 해당 메서드만 수정하면 된다.
  • 재사용성과 확장성 : 다른 프로그램이나 프로젝트에서도 재사용이 가능, 기존 기능을 확장시킨다.
  • 추상화 : 프로그램의 다른 부분에는 복잡한 내부 작업에 대해 알 필요 없이 메서드 사용 가능하다.
  • 테스트와 디버깅 용이성 : 독립적으로 테스트하고 디버그 할 수 있다. 코드의 문제를 신속하게 찾고 수정하는데 도움이 된다.

this 키워드와 this()메서드

모든 사용할 수 있는 상태의 멤버는 항상 객체 속에만 존재한다.
this.m, this.n
this.init()와 같이 표현한다.

class A{
	int m;
    int n;
    void init(int a, int b){
    	int c;
        c=3;
        this.m=a; //필드
        this.n=b;
    }
    void work() {
    	this.init(2, 3);
    }
}
  • 클래스 내 다른 생성자를 호출하는 this()메서드
    A a1 = new A();
    A a2 = new A(3);

this() // 생성자를 호출

메서드 가변인자 (Object... args)

메서드의 매개변수 개수를 동적으로 지정할 수 있다. = 매개변수 생략 가능)
타입...변수명 형식으로 선언할 수 있고, 가변인자는 내부적으로 배열로 처리된다.

ex.

public void averageScore(int... scores) {
        double sum = 0;
        for (int score : scores) {
            sum += score;
        }
        double average = sum / scores.length;
        System.out.println(average);
    }
profile
공부 기록

0개의 댓글