Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

말하는 햄zzi

메소드 본문

Java/Java

메소드

대양파 2023. 5. 9. 17:44
728x90

메소드란?

-기능을 의미

 

클래스는 상태 +동작 

  상태에 해당하는것 = “멤버 변수”

  동작에 해당하는것 =“ 메소드

 

 

메소드 선언 방식 

 

▶ function 과 다르게 클래스 내부 선언 해야한다

(접근제어자, 리턴타입, 메소드이름 세가지 요소를 지정해 메소드를 선언할 수 있다)

public class 클래스이름() {
접근제어자 리턴타입 메소드이름() {
// 메소드의 기능
}
3
}
메소드를 선언하는 방법

메소드 예제 1)

 

-스페이스인베이더 게임 예제)

public class SpaceInvaders {
	int location; // 멤버 변수 선언

	public void moveLeft() { // 왼쪽으로 이동하는 메소드
		location = location - 1; // 기존 값 -1
	}

	public void moveRight() { // 오른쪽으로 이동하는 메소드
		location = location + 1; // 기존 값 +1
	}
}
더보기

멤버변수 : location

 메소드 : moveLeft(), moveRight()

예제 테스트 코드 )

public class SpaceInvadersTest {
	public static void main(String[] args) {
		SpaceInvaders si = new SpaceInvaders();
		si.moveLeft();//-1
	    si.moveRight();//0
        si.moveLeft();//-1
        si.moveLeft();//-2
		System.out.println(si.location);
		}
}
더보기

출력 : -2 

//메소드는 new 연산자를 사용해 클래스를 인스턴스화 시켜야 사용 가능함

 

메소드 선언 방법 

-메소드가 들어있는 클래스 인스턴스화된 이후에 사용 

 

사용예제)

public class Greet {
public void printHello() {
System.out.println("Hello");
}
}

▷  printHello() 메소드 실행 불가 → 클래스를 인스턴스화 해야 실행가능

public class GreetTest {
	public static void main(String[] args) {
		Greet greet = new Greet();
		greet.printHello();
	}
}

▷ test 클래스를 만들어서 Greet 클래스를 인스턴스화 시킨 후 printHello()메소드를 실행

 

메소드 사용이유

 

 - 반복호출 : 기능을 만들어 놓고 반복해서 사용하기 위함

예제)

public class 꼬부기(){
public void 물대포(){}
public void 몸통박치기(){}
}
public class 꼬부기Test {
    public static void main(String[] args) {
        꼬부기 kkobugi1 = new 꼬부기();
        kkobugi1.물대포();
        kkobugi1.몸통박치기();
    } // 꼬부기 클래스의 .물대포(), .몸통박치기() 메서드 반복 사용가능
}
public class ScannerTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int input = sc.nextInt();
        System.out.println(input);
    } // Scanner 클래스의 .next() 메서드 반복 사용가능
}

- 멤버변수와 연계해서 사용하기 위함

예제 )

public class User {
    String name;
    String phoneNumber;
    int age;
    
    boolean isAdult() {
        return age >= 18;
    }
}

테스트예제)

public class UserTest {
	public static void main(String[] args) {
		User user1 = new User();
		user1.name = "유양파";
		user1.age = 14;

		User user2 = new User();
		user2.name = "유대파";
		user2.age = 37;

		System.out.printf("%s는 성인입니까? %s\n", user1.name, user1.isAdult());
		System.out.printf("%s는 성인입니까? %s\n", user2.name, user2.isAdult());
	}
}

 

더보기

출력 :유양파는 성인입니까? false
유대파는 성인입니까? true

-중복된 코드 제거

 

프로그램을 개발하면서 자주 하는 작업

중복된 코드를 제거하고 하나로 통합하는것 = “리팩토링(Refactoring)”

기능은 그대로 ,구조개선

→사용방법 : 반복되는 기능을 메소드로 분리

 

예제 SeparateToMethod)

public class SeperateToMethod {
    public static void main(String[] args) {
        int[][] arr = {
                {10, 20, 30},
                {40, 50, 60},
                {70, 80, 89}
        };

        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));
				// [10, 20, 30]
				// [40, 50, 60]
				// [70, 80, 89]

        arr[0][0] = 0;
        arr[1][1] = 0;
        arr[1][2] = 0;

        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));
				// [10, 20, 30]
				// [40, 50, 60]
				// [70, 80, 89]
    }
}

▶아래 코드 3줄만 반복됨 /배열 수정시 아래 3줄코드 추가해야함

        System.out.println(Arrays.toString(arr[0]));
        System.out.println(Arrays.toString(arr[1]));
        System.out.println(Arrays.toString(arr[2]));

- 반복되는 코드를 메소드 한개로 통합한 후 반복 호출해 사용하여 해결

 

메소드의 구성요소

 

 

구분 설명
접근제어자 메소드들 호출 할 수 있는 범위
리턴타입 메소드를 실행한 결과의 타입
메소드명 메소드의 이름 

 

접근제어자

-접근 제어자는 총 4가지가 있다

public 모든 클래스에서 접근 가능 다른 패키지에서도 접근 가능
protected 같은 패키지 내의 클래스와 해당 클래스를 상속한 외부 패키지의 클래스에서 접근 가능
default 접근 제어자를 쓰지 않은 경우 기본값 같은 패키지 내의 클래스에서만 접근 가능
private 해당 클래스에서만 접근 가능

 

각 접근제어자가 붙어있는 클래스, 메소드, 변수의 사용 가능 범위는 다음과 같다

public 0 0 0 0
protected 0 0 0  
default 0 0    
private 0      

주로 private 많이 이용 필요할 경우 public 사용

 접근 제어자를 설정하지 않을 시 자동으로 "default" 설정됨

 

예시) 같은 클래스 내 존재 시 

public class Greet {
	private void printHello() {
		System.out.println("Hello");
	}
	public static void main(String[] args) {
		Greet greet = new Greet();
		greet.printHello();
	}
}
더보기

출력 : Hello

//접근제어자가 private인 경우 같은 클래스에서만 호출 

 

-리턴타입 

: 메소드 실행 결과 값 (메소드를 호출한 곳으로 연산 결과를 보내고 싶을 때 사용)

(메소드를 만들때는 꼭 리턴타입을 써주어야 한다)

 

리턴타입 예제)

// 클래스
public class VariousReturnType {
	// 메소드
	public boolean isAdult(){
		return true;
	}
	// 메소드
	public int plus(){
		return 1 + 1;
	}
	// 메소드
	public User getUser(){
		return new User();
	}
	// 메소드
	public void printHello() {
		System.out.println("Hello");
	}
	// 메인 메소드
	public static void main(String[] args) {
		VariousReturnType vrt = new VariousReturnType();
		boolean isAdult = vrt.isAdult();
		int plusResult = vrt.plus();
		User user = vrt.getUser();
		vrt.printHello();
	}
}

 

메소드명

- 이름을 지을 때는 해당 메소드의 기능을 유추 할 수 있도록 간략하고 명확하게 이해할 수 있는것으로  이름을 지어야한다

 

 

Main메소드

-main 메소드 앞 static 옴

-static이 붙은 클래스, 변수, 메소드는 자바 프로그램이 시작 될 때 인스턴스화가 되고 자바 프로그램이 종료 될 때 사라짐

-static이 붙어 있지 않은 일반 클래스는 GC의 대상으로 필요할 때 new 를 이용해 생성되고 사용이 끝나면 메모리 효율을 위해 GC가 메모리에서 없애버린다

 

main 메소드 구성요소

접근제어자, static인지 여부, 리턴타입, 메소드명, 매개변수

-접근제어자(public)

main 메소드에서 아래에서 변경할 수 있는 것은 없다 //다른곳에서 호출되는 메소드가 아니기 때문

public으로 선언 되어야 하는 이유는 JVM에서 접근을 하기 때문입니다. private으로 되어 있다면 실행을 할 수 없습니다.

 

-static인지 여부(static)

main 메소드가 static인 이유?

 : 프로그램이 실행될 때 해당 클래스의 인스턴스를 생성하지 않고도 메소드에 접근할 수 있게 하기 위함

 

-리턴타입(void)

main메소드에서는 new 이용해 다른 클래스의 인스턴스를 생성하고 다른 기능들을 실행하는 코드들이 대부분입니다.

그래서 리턴값이 필요 없습니다. 따라서 리턴타입은 void 고정

 

-메소드명(main)

main메소드의 메소드명도 바꿀 수 없다

main이라는 이름을 가지고 이 메소드를 찾기 때문,

main이 아닌 다른 이름으로 바꾸었을때 역시나 자바에서는 찾을 수 없음  에러 

 

-String[] args

:String[] args는 자바 프로그램을 실행 할 때 특정 값들을 전달 할 수 있는 매개변수

>>배열명 'args'만 변경가능 (args arguments 줄임말로 함수나 호출시 전달되는 '인수')

주로 설정값들을 넘길 때 사용

 

 

728x90
반응형