[Java] 메소드

김용준·2022년 9월 25일
0

Java Basic

목록 보기
15/22

메소드란?

  • 객체의 기능을 담당한다.
  • 선언부와 구현부로 구성된다.
  • 선언부는 접근제한자, 반환타입, 메소드명, 매개변수로 구성된다.
  • 구현부는 해당 메소드가 수행하는 작업에 대한 실행문이 포함되어 있다.
  • 반드시 객체를 생성하고, 호출해야만 사용할 수 있다.
  • 메소드가 호출되면 블럭 내 실행문을 수행한다.

메소드의 구성요소

// 메소드의 선언부
접근제한자 반환타입 메소드명 (타입 매개변수명1, 타입 매개변수명2 ... ) {
	// 메소드의 구현부
	실행문1;
    실행문2;
    실행문3;
}

선언부

  • 접근제한자

    • 이 메소드의 공개범위를 지정한다. (public, protected, default, private)
    • public : 외부의 모든 클래스, 메소드, 필드로부터 접근 가능
    • protected : 같은 패키지에 있는 경우 혹은 상속관계에 있는 클래스에서 접근 가능
    • default : 같은 패키지에서만 접근 가능, 접근제한자를 지정하지 않았다면 자동으로 default로 지정된다.
    • private : 같은 클래스 내에서만 접근이 가능하다. 가장 좁은 범위의 접근제한자이다.
  • 반환타입

    • 메소드가 종료된 후, 반환되는 결과값의 데이터 타입을 지정한다
    • 반환타입이 void면 이 메소드는 반환값이 없다는 의미이다.
  • 메소드 이름

    • 실행문을 포함하는 코드블록의 이름이다.
    • 메소드 이름은 동사로 시작하고, 메소드의 기능을 잘 드러내는 이름으로 정한다.
  • 매개변수타입과 매개변수명

    • 메소드 실행 시 필요한 정보를 전달받는 값의 타입과 그 값을 저장하는 변수의 이름을 지정한다. 받는 값이 없으면 생략이 가능하다.

구현부

  • 실행문을 포함하고 있는 코드블록이다.
  • 반환타입이 void가 아닌 경우, 구현부에는 반드시 값을 반환하는 return문이 있어야 한다.
  • 반환값은 반드시 한 개이어야 한다.
  • return문 사용예시
    • return;
      반환타입이 void인 곳에서만 사용할 수 있다.
      실행중인 메소드를 종료시킨다.
      생략가능하다.
    • return 값;
      반환타입이 void가 아닌 메소드에서만 사용가능하다.
      실행중인 메소드를 종료하고 지정된 값을 반환한다.
      생략 불가능하다.

메소드의 유형

메소드의 유형은 매개변수와 반환값의 유무에 따라 4개의 유형으로 나눌 수 있다.

  • 매개변수 X, 반환값 X
    public void test1() { ... }

  • 매개변수 X, 반환값 O
    public 반환타입 test2() { ... }

  • 매개변수 O, 반환값 X
    public void test3(매개변수타입 매개변수명) { ... }

  • 매개변수 O, 반환값 O
    public 반환타입 test4(매개변수타입 매개변수명) { ... }

학생 정보를 정의한 클래스다. 위에서 언급한 네 가지 유형의 메소드를 정의했다.

public class Student {
	
	// Student클래스의 필드
	String name;
	int korScore;
	int engScore;
	int mathScore;
	
	// 학생 정보를 전달받아 멤버변수에 대입하는 메소드
	public void setStudent(String studentName, int studentKorScore, int studentEngScore, int studentMathScore) {
		name = studentName;
		korScore = studentKorScore;
		engScore = studentEngScore;
		mathScore = studentMathScore;
	}
		
	// 학생의 평균을 반환하는 메소드
	public double getAverage() {
		double average = (korScore + engScore + mathScore)/3.0; 
		return average;
	}
	
	// 학생 평균을 전달받아 합격여부를 반환하는 메소드
	public boolean processScore(double studentAverage) {
		boolean isPassed = studentAverage >= 60;
		return isPassed;
	}
	
	// 학생 정보를 출력하는 메소드
	public void display() {
		System.out.println("이름: " + name);
		System.out.println("국어점수: " + korScore);
		System.out.println("영어점수: " + engScore);
		System.out.println("수학점수: " + mathScore);
	}
}

학생 정보를 다루는 클래스로부터 객체를 생성하고 인스턴스 변수에 값을 대입하고 메소드를 이용한다.

public class StudentApp {

	public static void main(String[] args) {
		
		// 키보드로 값을 입력할 수 있는 기능이 있는 객체 생성
		KeyboardReader keyboardReader = new KeyboardReader();
		// Student객체 생성
		Student student = new Student();
		
		// 학생정보를 입력하고 생성된 객체의 인스턴스 변수에 대입한다.
		System.out.println("학생정보를 입력하세요.");
		System.out.print("이름 : ");
		String studentName = keyboardReader.getString();
		System.out.print("국어점수 : ");
		int studentKorScore = keyboardReader.getInt();
		System.out.print("영어점수 : ");
		int studentEngScore = keyboardReader.getInt();
		System.out.print("수학점수 : ");
		int studentMathScore = keyboardReader.getInt();
		
		student.setStudent(studentName, studentKorScore, studentEngScore, studentMathScore);
		System.out.println();
		
		// 객체의 인스턴스 변수를 이용하여 평균점수를 계산하고 반환한다.
		// 반환받은 평균점수를 출력한다.
		double studentAverage = student.getAverage();
		System.out.println("평균점수: " + studentAverage);
		System.out.println();
		
		// 평균점수를 매개변수로 받아 합격여부를 반환한다.
		// 반환받은 합격여부를 출력한다.
		boolean isPassed = student.processScore(studentAverage);
		System.out.println("합격여부: " + isPassed);
		System.out.println();
		
		// 학생 정보를 출력한다
		student.display();
	}
}
출력

학생정보를 입력하세요.
이름 : OOO
국어점수 : 95
영어점수 : 80
수학점수 : 100

평균점수: 91.66666666666667

합격여부: true

이름: OOO
국어점수: 95
영어점수: 80
수학점수: 100

참조형 매개변수

앞에서 다룬 예제들은 매개변수가 모두 기본형이었다. 그런데 참조형 변수도 매개변수로 정의할 수 있다. 즉, 객체(객체의 주소값)를 인자로 전달받을 수 있다.

다음은 sampleValue객체를 전달받아 메소드를 실행하는 클래스를 정의하고, 그 클래스로부터 생성된 객체를 main메소드에서 활용하는 예제이다.

public class SampleValue {

	/**
	 * 인자로 전달하는 객체를 생성하기 위한 클래스다.
	 */
	int x;
	int y;
}
public class Sample {

	/**
	 * SampleValue타입의 참조변수가 매개변수인 메소드다.
	 * 참조변수가 null인지 체크한 후, null이면 메소드를 즉시 종료한다.
	 * sampleValue객체의 x와 y값을 출력한다.
	 * sampleValue객체의 x에 300, y에 500을 대입한다.
	 * @param sampleValue
	 */
	public void test(SampleValue sampleValue) {
		if (sampleValue == null) {
			System.out.println("주소값이 올바르지 않습니다.");
			return;
		}
		System.out.println("test의 sampleValue의 x값: " + sampleValue.x);
		System.out.println("test의 sampleValue의 y값: " + sampleValue.y);
		System.out.println();
		
		System.out.println("test의 sampleValue가 참조하는 객체의 x, y값 변경하기");
		sampleValue.x = 300;
		sampleValue.y = 500;
		}
	}
public class SampleApp {

	public static void main(String[] args) {
		
		// sample객체의 메소드를 호출하기 위해 객체를 생성한다.
		Sample sample = new Sample();
		
		// sample객체의 메소드에 samplevalue객체의 주소값을 인자로 전달하기 위해 객체를 생성한다.
		SampleValue sampleValue = new SampleValue();
		
		// sampleValue객체의 x와 y를 각각 100과 200으로 초기화한다.
		sampleValue.x = 100;
		sampleValue.y = 200;
		
		// sample객체의 test메소드를 호출한다.
		sample.test(sampleValue);
		
		// test메소드로 인해 변경된 sampleValue객체의 변수를 출력한다.
		System.out.println("sampleValue의 x값: " + sampleValue.x);
		System.out.println("sampleValue의 y값: " + sampleValue.y);
	}
}
출력

test의 sampleValue의 x값: 100
test의 sampleValue의 y값: 200

test의 sampleValue가 참조하는 객체의 x, y값 변경하기
sampleValue의 x값: 300
sampleValue의 y값: 500

참조형 반환값

참조형 매개변수가 있는 메소드가 있듯, 메소드의 반환값으로 참조변수를 반환할 수 있다.

다음은 sampleValue객체를 생성하고 주소값을 반환하는 메소드를 활용하는 예제다.

	public class SampleValue {

		/**
		 * 반환값으로 반환되는 객체를 생성하기 위한 클래스다.
		 */
		int x;
		int y;
	}
public class Sample {

	/**
	 * sampleValue객체의 주소값을 반환하는 메소드다.
	 * SampleValue타입의 객체를 생성한다.
	 * 정수 2개를 인자로 전달받아 sampleValue객체의 변수에 대입한다.
	 * sampleValue객체의 주소값을 반환한다.
	 * @param num1
	 * @param num2
	 * @return sampleValue
	 */
	public SampleValue createSampleValue(int num1, int num2) {
		SampleValue sampleValue = new SampleValue();
		sampleValue.x = num1;
		sampleValue.y = num2;
		
		return sampleValue;
	}
}
public class SampleApp {

	public static void main(String[] args) {
		
		//sampleValue객체를 생성하고 주소값을 반환하는 메소드를 호출하기 위한 sample객체를 생성한다.
		Sample sample = new Sample();
		
		// sample객체의 메소드를 호출해 sampleValue객체 2개를 생성한다.
		// 생성된 객체의 주소값을 반환받아 각각 result1, result2에 대입한다.
		SampleValue result1 = sample.createSampleValue(1, 2);
		SampleValue result2 = sample.createSampleValue(3, 4);
		
		// result1이 참조하는 객체의 변수에 저장된 값을 출력한다.
		System.out.println("첫 번째 생성된 sampleValue객체의 변수에 저장된 값 출력");
		System.out.println("x = " + result1.x);
		System.out.println("y = " + result1.y);
		System.out.println();
		
		// result2이 참조하는 객체의 변수에 저장된 값을 출력한다.
		System.out.println("두 번째 생성된 sampleValue객체의 변수에 저장된 값 출력");
		System.out.println("x = " + result2.x);
		System.out.println("y = " + result2.y);
	}
}
출력

첫 번째 생성된 sampleValue객체의 변수에 저장된 값 출력
x = 1
y = 2

두 번째 생성된 sampleValue객체의 변수에 저장된 값 출력
x = 3
y = 4
profile
차선이 모여 최선이 된다.

0개의 댓글