🔯 메소드 (Method)
method : 방법
메소드란? | ⦁ 객체의 동작에 해당하는 중괄호 { } 실행 블록 ⦁ 클래스 안에 정의 ⦁ 메소드를 호출하게 되면 중괄호 블록의 모든 코드들이 일괄적으로 실행된다 ⦁ 메소드는 객체 간의 데이터 전달 수단으로 사용된다. 수행 후 반환 값/결과 값은 있거나 없을 수 있음 |
메소드 장점 | ⦁ 이미 만들어진 로직을 재활용 할 수 있다 (코드의 양을 줄일 수 있다) ⦁ 유지보수가 유리해진다 |
⭐ 메소드 표현식
접근제한자 | 예약어 | 반환형 | 메소드명 | (매개변수) |
public | static | void | method_name | (int a) |
public class MEthod_1 {
public static void numbering() { // numbering 메소드 본체,아래 {부터
int i = 0;
while (i < 10) {
System.out.println(i);
i++;
} // }는 그 메소드 정의
}
public static void main(String[] args) {
numbering(); //numbering 메소드 호출=실행
}
}
⭐ 메소드 접근제한자
[접근제한자] [예약어] 자료형 변수명 [=초기값];
구분 | 클래스 | 패키지 | 자손클래스 | 전체 | ||
+ | public | O | O | O | O | 모든 클래스가 접근 가능함 |
# | protected | O | O | O | default범위 + 다른 패키지의 상속 받은 후손 클래스까지 접근 가능 >후손 클래스외의 다른 패키지에 있는 클래스는 접근 불가능 |
|
~ | (default) | O | O | 같은 패키지안에 있는 다른 클래스들이 접근 가능함 |
||
- | private | O | 클래스 안에서만 접근 가능 >클래스 밖에서는 접근 불가능 |
⭐ 메소드 예약어
구분 | 전체 |
static | static 영역에 할당하여 객체 생성 없이 사용 |
final | 클래스 : 상속이 불가능한 클래스 메소드 : 상속은 가능 하지만 서브 클래스에서 오버라이딩이 금지됨 |
abstract | 미완성된 추상 메서드, 상속하여 오버라이딩으로 완성 |
synchronized | 동기화 처리, 고유 자원에 한개의 스레드만 접근 가능함 |
static final (final static) | static과 final의 의미를 둘다 가짐 |
구분 | 전체 |
class 클래스명 { } | (default)클래스 > 해당 패키지 안에 있는 클래스들끼리만 import없이 사용가능 |
public class 클래스명 { } | 패키지 밖의 다른 클래스에서 사용하고자 할 경우, import 하면 사용 가능 |
public final class 클래스명 { } | 종단 클래스 > 상속에 사용 못함 클래스의 기능 확장을 막기 위해 사용 |
public abstract class 클래스명 { } | 추상클래스 > 미완성된 클래스 스스로 객체 생성을 못하는 클래스 |
⭐ 메소드 반환형
반환형 | ||
반환 값 없음을 의미 | void | |
기본형 자료형 연산 수행 후 반환 값이 기본 자료형일 경우 사용 |
byte | |
short | ||
int | ||
long | ||
char | ||
float | ||
double | ||
boolean | ||
참조형 데이터형 | class | |
String | ||
array |
⭐ 메소드 매개변수
구분 | 전체 |
( ) | 매개변수가 없는 것을 의미 |
기본 자료형 | 기본형 매개변수 사용 시 값을 복사하여 전달 매개변수 값을 변경하여도 본래 값은 변경되지 않음 |
배열 / 클래스 | 배열, 클래스 등 참조형을 매개변수로 전달 시에는 데이터의 주소 값을 전달하기 때문에 매개변수를 수정하면 본래의 데이터가 수정됨 (얕은 복사) |
가변인자 | 매개변수의 개수를 유동적으로 설정하는 방법으로 가변 매개변수 외 다른 매개변수가 있으면 가변 매개변수를 마지막에 설정 *방법 : (자료형 ... 변수명) |
* 매개변수의 수에 제한이 없다.
✔ 메소드 매개변수 사용예시
더보기
매개변수 ex: public static void number (int init, int limit)
package java02;
public class MethodExam {
/*1. 매개변수X, 리턴값X
* [접근제한자][예약어] void 메소드명(){
* }
*/
public void method() {
System.out.println("매개변수가 없고, 리턴값도 없을떄");
}
/*2. 매개변수O, 리턴값X
* [접근제한자][예약어] void 메소드명(매개변수){
* }
* 매개변수의 값의 타입은 기본자료형, 배열, 클래스, 가변인자
* 매개변수의 수는 여러개일 수 있습니다. 구분은 ,(콤마)로 식별
*/
public void method2(int x) {
System.out.println("매개변수는"+ x +", 리턴값은 없을때 메소드");
}
public void method2(int x, String s) {
System.out.println("매개변수가 여러개이고, 리턴값이 없을때 메소드");
}
public void method2(int[]x,String[]s) {
System.out.println("매개변수가 배열,형태이고 리턴값도 없을때 메소드");
}
/*3. 매개변수X, 리턴값O
* [접근제한자][예약어] 반환형 메소드명(){
* }
*/
public int method3() {
System.out.println("매개변수가 없고,리턴값이 있을때 메소드");
return 10;
}
/*4. 매개변수O, 리턴값O
* [접근제한자][예약어] 반환형 메소드명(매개변수){
* }
*/
public String method4(int x) {
return "매개변수도 있고,리턴값도 있을때 메소드";
}
}
메서드 종류 | 설 명 |
일반 메서드 | 다른 용도(기능)를 처리하기 위한 메소드 |
main 메서드 | main 메소드는 규칙이다. 여러분이 만들고 싶은 프로그램이 있다면 여러분은 반드시 public static void main (String[ ] args) { }가 이끄는 중괄호 안에 실행되기를 기대하는 로직을 위치시켜야한다. 이것은 약속이기 때문에 여러분은 약속을 지켜야 한다. 그렇게 코드를 작성하면 자바를 실행할 때 자바는 여러분이 작성한 main메소드를 실행하게 되는것이다 |
getter 메서드 | ▶ get 메소드 : 값을 가져오는 것 할당된 필드(인스턴수 변수)에 기록된 값을 읽어서 요구하는 쪽으로 읽은 값을 넘기는 메소드 ⦁ 표현식 [접근제한자] [예약어] 반환형 get필드명 ( ) { return 필드명; } public int getStudentNumber( ) { return studentNumber; } |
setter 메서드 | ▶ set 메소드 : 값을 지정하는 것 할당된 필드값을 변경하는 메소드 바꿀 새 값을 전달받아 해당 필드에 대입 ⦁ 표현식 [접근제한자] [예약어] void set (자료형 변수명) { (this.)필드명 = 자료형 변수명; } public void setStudentNumber(int studentNumber) { this. studentNumber = studentNumber ; } |
▶ set메서드 get메서드를 사용하는 이유
더보기
∘ 일반적으로 객체 지향 프로그래밍에서는 이처럼 클래스의 필드를 비공개(private)로 선언한다. 필드를 비공개로 선언하면 필드에 접근해 데이터를 변경하지 못하게 막을 수 있다. 대신 getter/settere를 이용해 검증된 접근만 가능하게 한다.
클래스 선언할 때 필드는 일반적으로 private접근 제한 - 외부에서 엉뚱한 ∘ SET, GET 메소드를 사용하는 이유는 외부로부터 변수값에 직접적으로 접근하는것을 막기 위해서다. 직접 접근하개 되면 값이 변하게 되고 그러면 데이터 무결성이 깨질 수 있기 때문이다. ∘ 대표적으로 자바에서는 함수를 통해 값을 전달받고, 전달하고 방식을 권장하고 있다. 또한 클래스 내에서 변수 private(캡슐화, 정보은닉)를 선언해서 외부에서 접근할 수 없도록 한다. |
▶ 사용예시
더보기
Student | Run |
|
|
▶ 만약 메소드가 없다면
더보기
반복문 수업에서 0부터 9까지 출력하는 애플리케이션을 만들었다. 그런데 0부터 9까지를 3번 출력해야 한다
메소드가 없는 경우 | 메소드를 사용하는 경우 (void안쓰고 return넣은 버전 ) |
|
|
🔯 return
⦁ 해당 메소드를 종료하고 자신을 호출한 메소드로 돌아가는 예약어 ⦁ 반환 값이 있다면 반환 값을 가지고 자신을 호출한 메소드로 돌아감 |
return문은 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다. 반환값 없는 void 반환타입을 가지는 메서드들도 return문이 존재해야한다. 하지만 사용하지 않았다 이유는 컴파일러가 메서드의 마지막에 'return;'을 자동으로 추가해주었기 때문이다. 반환타입이 void가 아닌 경우는 필수적으로 return문이 존재해야 한다. 존재하지 않으면 메서드 이름에 빨간 밑줄을 볼수 있고 그 위에 올리면 반환타입의 결과를 반드시 return해줘야한다고 알려준다. 하나의 메서드 안에서 return문은 여러개 존재할 수 있지만 반환되는 값은 return중 하나만 반환이 된다. |
✔ return예시 1
더보기
class Main {
public static String num(int i) {
if(i==0){
return "zero";
} else if(i==1){
return "one";
} else if(i==2){
return "two";
}
return "none";
}
public static void main(String[] args) {
System.out.println(num(1));
}
}
// num( )에
// 0을 넣으면 zero
// 1을 넣으면 one
// 2를 넣으면 two
// 그외의 숫자는 none
✔ return예시 2
🔯 입력과 출력
자주 사용하는 로직을 메소드로 만들어두면 호출하는 것을 통해서 간편하게 로직을 재활용 할 수 있다
package com.hy.method1;
public class Main {
public static void numbering(int init, int limit) { //매개변수
int i = init;
while (i < limit) {
System.out.println(i);
i++;
}
}
public static void main(String[] args) {
numbering(1, 5); //numbering 메소드로 1과 5라는 인자를 전달한다.
}
}
'Language > Java' 카테고리의 다른 글
Overloding(다향성) / Overriding(상속성) (0) | 2022.01.07 |
---|---|
객체 배열 (0) | 2022.01.04 |
Class - 생성자 (Constructor) (0) | 2022.01.03 |
Class - 필드(변수) (0) | 2022.01.03 |
package와 import (0) | 2022.01.02 |