본문 바로가기

컴퓨터언어/JAVA(자바)

[JAVA강좌] 22강 메서드와 게터세터

728x90
반응형

 

 

 

 

 

 

 

 

 

 

- 지난 강좌에서 메서드를 잠깐 봤었습니다.

- 클래스와 객체에 대한 개념을 잘 모르면 아래 주소를 보고 오세요.

https://ossam5.tistory.com/636

 

[JAVA강좌] 21강 클래스와 객체

- 사전적 의미로 객체는 [의사나 행위가 미치는 대상]입니다. - 눈에 보이는 건물, 자동차, 사람도 객체가 될 수 있고, 보이지 않는 공기, 혹은 주문, 관리 등의 행동도 객체가 될 수 있습니다. - 자

ossam5.tistory.com

- 지난 강좌에서는 간단한 개념만 봤기 때문에 이번에는 메서드를 조금 디테일하게 보겠습니다. 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형

 

 

 

 

 

 

 

 

 

 

 

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;
	}
}

 

- 게터와 세터는 직접 입력하지 않아도 자동으로 코드가 나오는 것을 확인할 수 있습니다. 

 

 

 

 

 

 

728x90
반응형