5 분 소요

[JAVA_입문_수업] 3장 : 메소드 & 입출력

해당 게시글은 JAVA_입문_수업 을 공부하며 정리한 글입니다.


Method

메소드는 코드를 재활용할 수 있게 해준다.

메소드(Method)와 함수(Funtion)는 같은 의미이다. 자바에서는 메소드라고 불린다.


[위 내용에 대한 개인적 생각]

사실 내가 파이썬을 공부하며 이해하기로는, 파이썬에서는 함수와 메소드는 다르게 해석하는 것 같다.

  • 함수는 def로 정의하여 사전에 정의된 코드에 따라 input을 넣으면 ouput를 주거나 내부적으로 계산, 실행만 해주는 것이고

    • ex) 함수명(입력값)
  • 메소드는 클래스 하위의 함수를 사용할 때 이를 메소드라 부른다.

    • ex) 클래스명.메소드명(입력값)

다만, 파이썬은 인터프리터 방식이기에 클래스 없이 그냥 함수 정의가 가능하지만,

자바는 객체지향 언어이기 때문에 반드시 클래스를 정의하고 들어가기에 함수라고 따로 부르지 않는 것 같다.

(지극히 개인적인 이해임. 사실이 아닐 수 있음.)



1. 형식

메소드는 아래와 같은 형식을 갖는다.

각 클래스 마다 main 메소드가 하나씩 존재하며, 클래스를 실행할 때 메인 메소드가 실행된다.

메인 메소드가 아닌 메소드들은 main에서 호출하지 않는다면 정의만 되어있을 뿐 실행되지 않는다!

public static void numbering() {
    명령문;
}



2. 장점

아래 클래스에서는 numbering이라는 메소드와 메인 메소드가 존재한다.

main메소드에서 numbering메소드를 2번 호출했으니 0~9출력이 2번 반복된다.

아래 예시에서는 그냥 메인 메소드 하나에서 2중 반복문을 사용해 같은 결과를 출력할 수 있지만,

재활용성과 유지보수면에서 이가 훨씬 유용하다.

public class MethodDemo1 {
    public static void numbering() {
        int i = 0;
        while (i < 10) {
            System.out.println(i);
            i++;
        }
    }
 
    public static void main(String[] args) {
        numbering();
        numbering();
    }
}



3. 입력

메소드(함수)에 입력값을 다르게 부여함으로서 호출마다 다른 출력을 가질 수 있다.

입력값을 담을 변수는 메소드를 정의할 때 메소드명(입력값) 에서 정의된다.

아래의 경우, numbering이 호출되며 limit값이 5로 입력되었다. 그렇게 0부터 4까지 출력될 것이다.

public class MethodDemo4 {
    public static void numbering(int limit) {
        int i = 0;
        while (i < limit) {
            System.out.println(i);
            i++;
        }
    }
 
    public static void main(String[] args) {
        numbering(5);
    }
}


여기서 매개변수와 인자를 혼동하지 말자.(혼용해서 사용되기도 한다.)

  • 매개변수(parameter) : 입력값을 수용하기 위한 변수(여기선 limit)

  • 인자(argument) : 입력값(여기선 5)

    • main메소드의 매개변수인 args가 바로 argument의 약어이다.

    • 이것은 클래스가 실행될 때, 입력값(인자)를 args라는 문자열 배열에 담아 메소드 내에서 사용될 수 있도록 한다.

이처럼 매개변수는 하나가 아니라 입력하고자하는 값에 따라 형식에 맞추어 정의해주면된다.

아래와 같이 example메소드를 호출할 때에는 형식(x1, x2)에 맞추어 example(1,2)와 같이 호출하면 된다.

public static void example(int num1, int num2) {} # 만약 이런 



4. return

1) return이란?

한 메소드에서 계산된 어떤 값을 다른 메소드에 가져가서 사용하고 싶다면 어떻게 할까?

바로 return을 통해 이를 이룰 수 있다. 메소드를 호출하면 그 자리에 return을 반환함으로서, 변수에 담아 사용가능하다.

  • 아래 예제에서는 numbering메소드에서 ouput이라는 변수를 return하도록 정의하였고

  • 메인 메소드에서 numbering(1,5)를 호출한 뒤

  • 반환된 Output값을 받아 result에 저장.

public class MethodDemo6 {
    public static String numbering(int init, int limit) {
        int i = init;
        // 만들어지는 숫자들을 output이라는 변수에 담기 위해서 변수에  값을 주었다.
        String output = "";
        while (i < limit) {
            // 숫자를 화면에 출력하는 대신 변수 output에 담았다.
            output += i;
            i++;
        }
        // 중요!!! output에 담겨 있는 문자열을 메소드 외부로 반환하려면 아래와 같이 return 키워드 뒤에 반환하려는 값을
        // 배치하면 된다.
        return output;
    }
 
    public static void main(String[] args) {
        // 메소드 numbering이 리턴한 값이 변수 result에 담긴다.
        String result = numbering(1, 5);
        // 변수 result의 값을 화면에 출력한다.
        System.out.println(result);
    }
}


2) return의 자료형

위에서 두 메소드를 정의할 때 String numbering, void main를 사용하였다.

여기서 메소드명 앞에 오는 String과 void는 리턴값의 형식을 의미한다.

  • String은 문자열값을 리턴, void(빈공간)는 리턴값이 없다는 의미!

  • 그렇기에 메소드의 정의에 적힌 리턴값의 자료형을 보고, 메인 메소드에서 담을 변수의 자료형을 정의해준다.(like, String result)


3) 복수의 return

만약 한 메소드에 리턴이 여러개 있다면 어떻게 될까?

리턴은 값을 반환할 뿐만 아니라, 그 메소드의 실행을 종료시킨다.

아래의 경우에는 1만 리턴되고 끝난다.

public class ReturnDemo {
    public static int one() {
        return 1;
        return 2;
        return 3;
    }
 
    public static void main(String[] args) {
        System.out.println(one());
    }
}


그렇다면 여러개의 값을 한 번에 return하고 싶으면 어떻게 할까?

배열에 담아 보내면 된다!

public class ReturnDemo4 {
 
    public static String[] getMembers() {
        String[] members = { "최진혁", "최유빈", "한이람" };
        return members;
    }
 
    public static void main(String[] args) {
        String[] members = getMembers();
    }
 
}






Scanner Library

자바앱이 실행되고 있는 동안에 사용자의 입력을 받기 위해서는 Scanner라이브러리를 사용해야한다.

1. 사용법

[라이브러리 불러오기 > 스캐너 생성 > 입력받기 > 마무리]

1) 이를 위해 라이브러리를 아래와 같이 불러온다.

  • import java.util.Scanner;

2) 그 다음 입력을 받을 객체를 생성한다.

  • Scanner sc = new Scanner(System.in);

  • 여기서 소괄호안에 들어가는 System.in은 ‘사용자가 입력할 값’이라고 생각하면된다.

  • 소괄호 안에 만약 파일명이 들어가면, 이 스캐너는 파일을 받아오는 스캐너가 된다.

  • 입력값에 따라 스캐너가 달라진다고 생각하면 된다.

3) 입력 받을 자료형에 맞게 객체의 메소드를 사용하여 변수에 저장한다.

  • int i = sc.nextInt();

  • int값으로 받아오는 거니 nextInt임.

4) 스캐너로 입력을 받았으면 무조건 마무리로 close해줘야함.

  • sc.close();
import java.util.Scanner; # 1. 불러오기
 
public class ScannerDemo {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  # 2. 스캐너 생성
        int i = sc.nextInt(); # 3. 입력받기
        sc.close(); # 4. 마무리
        
        System.out.println(i*1000);
    }
 
}



2. 연속 입력

while문을 통해 sc.nextInt()을 반복하면 무한대로 입력을 받을 수 있다.

그러나 우리가 원하는 것은 끝 없이 입력받는 것이 아니다. 그래서 sc.hasNextInt()를 사용한다.

sc.hasNextInt()는 입력값이 생기기 전까지 실행을 유보시키는 역할을 한다.

만약 입력한 값이 int 형이 아닐 경우는 false를 리턴하고, int로 표현할 수 있는 형식의 숫자형인 경우는 true를 리턴한다.

그렇기에 이는 입력값을 받아 저장하는 용도가 아닌, while문의 조건에 사용되며 정수일 때 반복문이 실행될 수 있도록한다.

주의할 점은 nextInt()는 I만 대문자이지만, 여기선 N도 대문자이다.

또한 입력값은 sc.nextInt()에 저장된다는 것에 주의하자.(hasNextInt가 있다고 2번 입력받는 것이 아님.)

import java.util.Scanner;

public class ScannerDemo2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while (sc.hasNextInt()) {
			System.out.println(sc.nextInt()*1000);
		}
		sc.close();

	}

}



3. 파일 스캔

사용자의 키보드 제어만이 입력은 아니다.

아래 예제는 out.txt라는 파일을 입력 받아서 화면에 출력하는 예를 보여주고 있다.(out.txt 파일이 존재해야 한다.)

예제를 실행하려면 프로젝트의 루트 디렉토리(src와 bin 디렉토리가 위치하고 있는 경로)로 이동해서 아래와 같이 명령을 실행한다.

1) 라이브러리 불러오기 - import java.util.Scanner;

2) 파일 객체 생성 - File file = new File("out.txt");

3) 파일을 입력받는 스캐너 객체 생성 - Scanner sc = new Scanner(file);

4) 마찬가지로 반복문을 통해 정수를 입력받아 출력

5) 마무리 - sc.close()

import java.util.Scanner;
import java.io.*;
 
public class Scanner3Demo {
 
    public static void main(String[] args) {
        try {
            File file = new File("out.txt");
            Scanner sc = new Scanner(file);
            while(sc.hasNextInt()) {
                System.out.println(sc.nextInt()*1000); 
            }
            sc.close();
        } catch(FileNotFoundException e){
            e.printStackTrace();
        }
         
    }
 
}

끝! 여기까지가 시즌1.

이후에는 객체 지향 프로그래밍에 대해 알아보겠다.

댓글남기기