- 지난 강좌에서 메서드를 잠깐 봤었습니다.
- 클래스와 객체에 대한 개념을 잘 모르면 아래 주소를 보고 오세요.
https://ossam5.tistory.com/636
- 지난 강좌에서는 간단한 개념만 봤기 때문에 이번에는 메서드를 조금 디테일하게 보겠습니다.
1. 함수란?
- 메서드는 함수(function)의 한 종류입니다.
- 먼저 함수란 무엇인지 살펴보고, 메서드에 대해서 자세히 알아보겠습니다.
- 함수는 하나의 기능을 수행하는 코드의 집합입니다.
- 기능을 수행할 수도 있고, 값을 반환할 수도 있습니다.
- 함수는 선언하는 부분과 실행하는 부분을 나눠서 코딩합니다.
1) 간단한 함수 처리
## 함수 선언과 호출 문법
//함수 선언
자료타입 함수명() {
코드의 집합;
}
//함수 호출
함수명();
- 메서드와는 다르게 소유자(인스턴스)가 있지 않습니다.
- 함수명(); 으로 호출하면 됩니다.
- 그럼 선언하는 부분과 호출하는 부분을 왜 나눠서 하는지 실습 후 설명하겠습니다.
- 그럼 간단하게 커피를 사러가는 함수를 만든다고 보겠습니다.
- 아래에서는 직접 실습으로 확인해 보겠습니다.
- 패키지(ch14_class_object)과 클래스(Ex01_Function.java)를 추가해 주세요.
- 이때 main() 함수가 생성되게 체크해주고 생성해 주세요.
- 기초적 작업을 모르는 분은 아래 주소를 클릭하고 보고 오세요.
https://ossam5.tistory.com/613
## 기본 함수 생성 실습1 - Ex01_Function.java
package ch14_class_object;
public class Ex01_Function {
//함수 선언
static void coffee() {
System.out.println("스타벅스에 갑니다.");
System.out.println("아메리카노를 주문합니다.");
System.out.println("맛있게 마십니다.");
}
public static void main(String[] args) {
coffee(); //함수 호출
}
}
- 함수 선언을 할 때 static이라는 키워드를 작성했습니다.
- static은 변수나 메서드(함수) 앞에 붙이는 키워드로 이것을 붙이면 프로그램이 실행될 때 딱 한번 메모리에 올라가서 모든 인스턴스가 이 변수나 함수를 사용할 수 있게 처리합니다.
- 현재는 main() 함수 내부에서도 사용할 수 있게 작성한 것입니다.
- static는 추후에 더 자세하게 강의하도록 하겠습니다.
- void는 자료타입을 반환하는 것이 아니고, 기능 실행하는 경우에만 붙이는 키워드입니다.
- 함수명은 coffee로 선언했습니다.
- 그리고 자바 프로그램이 실행되는 진입점인 main() 함수 내부에 함수를 호출했습니다.
- 그래야 콘솔창에 함수 선언 코드블록 { } 내부에 작성한 것이 실행되기 때문입니다.
- 함수를 선언하는 부분과 호출하는 부분으로 나누는 이유는 언제 실행될지, 몇 번 실행될지 지정하기 위해서입니다.
- 현재 수업시간인데 밖에 나가서 커피 사러 간다면 강의장 안에 있는 사람들이 다 미친 줄 알겠죠?
- 그래서 쉬는 시간이나 점심시간에 커피를 사러 나가야 합니다.
- 그래서 시점을 분리하기 위해 함수를 선언하는 부분과 호출하는 부분으로 나눕니다.
- 그리고 한 번만 호출하지 않을 수도 있습니다. 오전에도 커피를 사러 나가고, 오후에도 사러 2번 나갈 수 있습니다.
- 그럼 선언은 한번만 하지만, 호출을 2번 하면 코드가 간결해지겠죠?
- 그래서 함수를 선언하는 부분과 호출하는 부분으로 나눕니다.
## 기본 함수 생성 결과1 - Ex01_Function.java
- 그럼 결과가 잘 출력되는 것을 확인할 수 있습니다.
2) 매개변수
- 매개변수는 함수를 선언하는 쪽과 호출하는 쪽의 매개가 되는 변수입니다.
- 선언하는 쪽에서는 가상의 변수를 만들고, 호출하는 쪽에서 실제 변수값을 할당해서 호출합니다.
## 매개변수 문법
//함수 선언
자료타입 함수명(자료타입 매개변수1, 자료타입 매개변수2...) {
코드의 집합;
}
//함수 호출
함수명(인수,인수,...);
- 매개변수도 변수이기 때문에 앞에 자료 타입을 작성해야 합니다.
- 매개변수 개수에 맞게 호출 시 인수라고 적은 곳에 값을 작성해 줍니다.
- 그럼 위의 coffee 함수에서 스타벅스와 아메리카노를 매개변수로 바꾸겠습니다.
- 왜냐면 커피를 꼭 스타벅스에서만 사 먹을 필요도, 메뉴도 아메리카노만 먹을 필요는 없잖아요?
- 그래서 다양한 선택으로 하도록 프로그래밍을 하는 겁니다.
## 매개변수 실습1 - Ex02_Parameter.java
package ch14_class_object;
public class Ex02_Parameter {
//함수 선언
static void coffee(String store, String menu) {
System.out.println(store + "에 갑니다.");
System.out.println(menu + "를 주문합니다.");
System.out.println("맛있게 마십니다.");
}
public static void main(String[] args) {
coffee("스타벅스","아메리카노"); //함수 호출1
System.out.println("==================");
coffee("스타벅스","바닐라라떼"); //함수 호출2
System.out.println("==================");
coffee("커피빈","카푸치노"); //함수 호출3
}
}
## 매개변수 결과1 - Ex02_Parameter.java
- 그럼 각각의 매개변수에 적은 인수의 값이 출력되는 것을 확인할 수 있습니다.
- 하나의 함수에 다양한 결과를 가질 수 있습니다.
- 이래서 수학시간에 함수는 x값(매개변수)에 따라서 결과가 달라지는 것이다! 라고 배운 겁니다.
2) return
- return 키워드는 함수가 단순 기능을 하는 것이 아닌 값을 한 개 반환할 때 사용하는 키워드입니다.
- 이때는 값을 반환하기 때문에 void가 아닌 자료타입을 작성해줘야 합니다.
- 그럼 더하기 연산을 하는 함수인 add()를 선언하고 호출해 보도록 하겠습니다.
## 리턴 실습1 - Ex03_Return.java
package ch14_class_object;
public class Ex03_Return {
//더하기 함수 선언
static int add(int x, int y) {
return x + y;
}
public static void main(String[] args) {
//함수호출
System.out.println(add(10,5));
System.out.println(add(10,10));
System.out.println(add(10,20));
}
}
- 정수를 더할 것이라 int라는 자료 타입을 처리했습니다.
- 그리고 매개변수인 x와 y를 더한 값을 반환하므로 [ return x + y; ]로 처리합니다.
## 리턴 결과1 - Ex03_Return.java
- 그럼 더하기가 각각 처리된 것을 확인할 수 있습니다.
- 그럼 아래 문제를 함수로 만들어 보세요.
사칙 연산을 하는 함수를 제작하고,
사용자에게 좌변정수, 우변정수, 연산자를 입력받아
사칙연산을 호출하는 프로그램을 제작하시오.
- 혼자 풀어 본 후 더보기 버튼을 눌러 주세요.
## 사칙연산 실습1 - Ex04_Arithmetic.java
package ch14_class_object;
import java.util.Scanner;
public class Ex04_Arithmetic {
//사칙연산 함수선언
static int addition(int left, int right) {
return left + right;
}
static int subtraction(int left, int right) {
return left - right;
}
static int multiplication(int left, int right) {
return left * right;
}
static double division(int left, int right) {
return (double)left / right;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); //스캐너 호출
System.out.println("=====사칙연산 프로그램=====");
System.out.print("좌변정수입력: ");
int num1 = scan.nextInt();
System.out.print("우변정수입력: ");
int num2 = scan.nextInt();
System.out.print("연산자입력(+,-,*,/): ");
//charAt(0) : 입력한 글자 중 한글자만 반환받는 메서드(0 : 첫번째 글자)
char operator = scan.next().charAt(0);
//연산자에 따른 조건 처리
switch(operator) {
case '+':
System.out.println("결과 : " + addition(num1, num2));
break;
case '-':
System.out.println("결과 : " + subtraction(num1, num2));
break;
case '*':
System.out.println("결과 : " + multiplication(num1, num2));
break;
case '/':
System.out.println("결과 : " + division(num1, num2));
break;
default:
System.out.println("잘못된 연산자를 입력했습니다.");
break;
}
scan.close(); //스캐너 종료
}
}
- 코드는 작성하는 것에 따라 다를 수 있습니다.
- 공부에 참고만 해주세요.
## 사칙연산 결과1 - Ex04_Arithmetic.java
2. 메서드와 게터세터
- 메서드는 클래스가 소유한 함수를 말합니다.
- 클래스가 내장한 메서드를 각각의 인스턴스가 호출해서 사용합니다.
## 함수 호출과 메서드 호출
//함수호출
함수명();
//메서드호출
인스턴스변수명.메서드명();
- 함수는 소유자가 없기 때문에 바로 호출했었습니다.
- 하지만 메서드는 소유자가 인스턴스이기 때문에 앞에 인스턴스변수명을 써줘야 합니다.
- 자세한 메서드 사용법은 지난 강좌에서 봤기 때문에 게터와 세터 개념을 보도록 하겠습니다.
1) 게터
- 게터(getter)는 멤버 변수의 값을 얻어오는 메서드입니다.
- 추후 접근제어자와 정보은닉 수업에서 다시 언급하겠지만 멤버변수는 바로 접근하지 못하게 막는 것이 보통입니다.
- 그래서 메서드를 통해서 값을 얻어오거나, 변경하게 합니다.
- 이때 값을 얻어오는 메서드를 게터라고 합니다.
- 보통 getOO으로 메서드명을 처리해서 게터라고 부릅니다.
- 꼭 get으로 시작할 이유는 없지만, 게터는 get으로 시작하는 것이 프로그래머들의 관례입니다.
- 그럼 학생 클래스(Student)를 만들고, Ex05_Getter.java파일로 불러와 보겠습니다.
## Student.java 코드
package ch14_class_object;
public class Student {
//멤버변수 선언
String name; //이름
int grade; //학년
int num; //반 - class로 하면 키워드와 겹침
int id; //번호
//이름을 가져오는 메서드 선언
public String getName() {
return name;
}
//번호를 가져오는 메서드 선언
public int getId() {
return id;
}
//생성자
public Student(String name, int grade, int num, int id) {
this.name = name;
this.grade = grade;
this.num = num;
this.id = id;
}
}
- 학생 클래스에 멤버변수는 이름, 학년, 반, 번호로 선언했습니다.
- 일단 이름과 번호만 가져오는 메서드를 선언했습니다.
- 게터는 get으로 시작하는 것이 관례라고 했죠?
- 인스턴스로 생성 시 4개의 멤버변수 값을 모두 매개변수로 사용하게 처리했습니다.
## Ex05_Getter.java 코드
package ch14_class_object;
public class Ex05_Getter {
public static void main(String[] args) {
//인스턴스 생성
Student st01 = new Student("김석진",1,1,1);
Student st02 = new Student("김태형",1,1,2);
//게터 값 출력
System.out.println(st01.getId() + "번이름 : " + st01.getName());
System.out.println(st02.getId() + "번이름 : " + st02.getName());
}
}
- 그럼 학생 2명을 인스턴스로 생성했습니다.
- 생성자에서 이름, 학년, 반, 번호를 모두 매개변수로 사용했기 때문에 모두 작성해야 합니다.
- 각각의 인스턴스가 자신의 이름을 불러오는 getName()과 번호를 불러오는 getId()를 메서드로 호출했습니다.
## Ex05_Getter.java 결과
- 그럼 인스턴스에서 만든 멤버변수의 값들을 잘 얻어오는 것을 확인할 수 있습니다.
2) 세터
- 세터(setter)는 멤버 변수의 값을 변경하는 메서드입니다.
- 인스턴스 생성 시 값을 줬더라도, 변경이 가능합니다.
- 보통 setOO으로 메서드명을 처리해서 세터라고 부릅니다.
- 꼭 set으로 시작할 이유는 없지만, 세터는 set으로 시작하는 것이 프로그래머들의 관례입니다.
- 그럼 학생 클래스(Student)에 세터를 추가하고, Ex06_Setter.java파일로 불러와 보겠습니다.
## Student.java 코드
package ch14_class_object;
public class Student {
//멤버변수 선언
String name; //이름
int grade; //학년
int num; //반 - class로 하면 키워드와 겹침
int id; //번호
//이름을 가져오는 메서드 선언
public String getName() {
return name;
}
//번호를 가져오는 메서드 선언
public int getId() {
return id;
}
//이름을 변경하는 메서드 선언
public void setName(String name) {
this.name = name;
}
//번호를 변경하는 메서드 선언
public void setId(int id) {
this.id = id;
}
//생성자
public Student(String name, int grade, int num, int id) {
this.name = name;
this.grade = grade;
this.num = num;
this.id = id;
}
}
- 세터 같은 경우는 값을 가져오는 것이 아니라 변경하는 기능을 하기 때문에 기능만 처리해서 void로 타입을 설정합니다.
- 대신 멤버변수의 값을 매개변수 값으로 변경하는 겁니다.
## Ex06_Setter.java 코드
package ch14_class_object;
public class Ex06_Setter {
public static void main(String[] args) {
//인스턴스 생성
Student st01 = new Student("김석진",1,1,1);
Student st02 = new Student("김태형",1,1,2);
//st02의 이름과 번호를 변경
st02.setName("정호석");
st02.setId(3);
//게터 값 출력
System.out.println(st01.getId() + "번이름 : " + st01.getName());
System.out.println(st02.getId() + "번이름 : " + st02.getName());
}
}
- 두 번째 인스턴스의 이름과 번호를 세터를 통해 변경했습니다.
## Ex06_Setter.java 결과
- 결과가 잘 변경된 것을 확인할 수 있습니다.
3) 이클립스로 쉽게 게터/세터 추가하기
- 게터/세터는 클래스를 만들면 워낙 많이 작성하는 코드입니다.
- 자꾸 작성하다 보면 똑같은데, 매번 치는 느낌입니다.
- 이클립스가 이것을 쉽게 처리해 주는 기능이 있습니다.
- 우선적으로 Student의 게터와 세터를 먼저 지워 보겠습니다.
- 멤버변수와 생성자만 남겨두고 모두 삭제합니다.
- 그러고 나서 생성자 위에서 마우스 오른쪽 - [Source]-[Generate Getters an Setters...]를 클릭합니다.
- 그럼 게터와 세터를 생성하고 싶은 멤버변수를 체크합니다.
- 원래 체크가 안되어 있지만, 제가 모두 체크해 봤습니다.
- 그러고 나서 하단의 [Generate] 버튼을 눌러 줍니다.
- 그러면 좀 엔터가 많이 쳐서 나오지만 게터와 세터가 자동으로 생성됩니다.
## Student.java 코드
package ch14_class_object;
public class Student {
//멤버변수 선언
String name;
int grade;
int num;
int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
//생성자
public Student(String name, int grade, int num, int id) {
this.name = name;
this.grade = grade;
this.num = num;
this.id = id;
}
}
- 게터와 세터는 직접 입력하지 않아도 자동으로 코드가 나오는 것을 확인할 수 있습니다.
'컴퓨터언어 > JAVA(자바)' 카테고리의 다른 글
[JAVA강좌] 24강 여러 클래스 생성 후 객체 협력 (0) | 2024.01.17 |
---|---|
[JAVA강좌] 23강 접근제어자와 정보은닉 (0) | 2024.01.17 |
[JAVA강좌] 21강 클래스와 객체 (0) | 2024.01.16 |
[JAVA강좌] 20강 자바기본문법으로 게임제작하기 - 업다운게임 (0) | 2024.01.16 |
[JAVA강좌] 19강 반복문관련 - break와 continue (0) | 2024.01.15 |