본문 바로가기
> 프로그래밍 언어/JAVA

[나도코딩] 자바기본편 - 섹션 7

by 자몽주스 2023. 4. 12.
728x90

chap_06.zip
0.00MB

메소드

package chap_06;

public class _01_Method {
	// 메소드 정의
	public static void sayHello() {
		 System.out.println("안녕하세요? 메소드입니다.");// sayHello(메소드 이름)
	}
	public static void main(String[] args) {
		// 메소드: 기능을 하는 코드들의 묶음(동작)
		// 메소드 호출: 메소드를 사용하는 것.
		// 다른곳에서 만든 메소드를 실행시키는 것.
		System.out.println("메소드 호출 전");
		sayHello(); // 메소드 호출(원하는만큼 호출 가능)
		sayHello();
		sayHello();
		System.out.println("메소드 호출 후");
	}

}
전달값 (Parameter)

package chap_06;

public class _02_Parameter {
// 전달값이 있는 메소드 
	public static void power(int number) { 
		// 순서3) 2라는 값이 number에 저장, number는 parameter 또는 매개변수라고 한다
	 	int result = number * number; //int result 에다가 결과값 저장하기
	 	System.out.println(number + "의 2 승은 " + result);
	}
	//void 위치에는 반환형태가 들어감
	
	public static void main(String[] args) {
		// 전달값,parameter
		// 2 -> 2 * 2 = 4
		// 3 -> 3 * 3 = 9
		
		// 순서1) 메소드 호출
		// 순서2) 이 때 2라는 값을 인수라고 함 (argument)
		power(2); // 2의 2승 호출
		power(3); // 3의 2승 호출
		
	}

}
package chap_06;

public class _02_Parameter {
// 전달값이 있는 메소드 
	// 전달값 2개를 받는 메소드
	public static void powerByExp(int number, int exponent) {
		int result = 1; // 초기값을 먼저 설정(계산 결과를 저장하기 위해서는 먼저 그 결과를 담을 수 있는 공간이 필요)
		for (int i = 0; i < exponent; i++) {
			result = result * number; // result *= number;
		} // i가 0이면 result = 1 이니까 1 * 2 돼서 result = 2가 된다.
		System.out.println(number + "의" + exponent + "승은" + result);
	}
	// number가 2고 , exponent가 3이다 라고 치면
	// i 는 0,1,2 일 때 총 3번동안 result=1 이라는 값에다가 number을 곱해줌
	// number가 2라고 치면 1*2 = 2 / 2*2 = 4 / 4*2 = 8
	public static void main(String[] args) {

		powerByExp(2, 3); // 2 * 2 *2 = 8
		powerByExp(3, 3); // 3 * 3 * 3 = 27
		powerByExp(10, 0); // 10의 0승 = 1

	}

}
반환값 (Return)

package chap_06;

public class _03_Return {
	// 호텔 전화번호
	public static String getPhoneNumber() {
		String phoneNumber = "02-1234-5678";
		return phoneNumber;
	};
	// void: 반환값이 없는 메소드라서 아무런 값을 반환하지 않음.
	// 호텔 전화번호라는 문자열을 반환하도록 하기위해 String을 사용해준다.
	// 메소드이름: getPhoneNumber
	// 반환하려면 return 써주고 return 하려는 값을 옆에 적어준다.

	// 호텔 주소
	public static String getAddress() {
		return "서울시 어딘가";
	}
	//바로 값 자체를 반환할 수 있음
	public static void main(String[] args) {
		// String phoneNumber = getPhoneNumber();
		// 여기의 phoneNumber와 위의 phoneNumber은 완전 다름
		// 헷갈리니 다른 이름으로 설정해놓고 출력하기.
		String contactNumber = getPhoneNumber(); //문자열 변수로 받아서 사용
		System.out.println(contactNumber); //02-1234-5678

		System.out.println(getAddress());//서울시 어딘가 
		// 이렇게 사용할 수도 있음.
	}

}

반환형태는 다양하게 사용 가능

1. 왜 앞에 get을 쓰는 건지
2. return을 쓰는 이유. 왜 꼭 써야하는지
3. 왜 문자열 변수로 받아서 사용하는지
-> String contactNumber = getPhoneNumber(); //문자열 변수로 받아서 사용 이 부분
전달값과 반환값
package chap_06;

public class _04_ParameterAndReturn {
	/*
	 * public static void power(int number) { int result = number * number;
	 * System.out.println(number + "의 2승은" + result); } void 위치에는 반환형태가 들어감
	 * 
	 * public static void powerByExp(int number, int exponent) { int result = 1; for
	 * (int i = 0; i < exponent; i++) { result = result * number; }
	 * System.out.println(number + "의" + exponent + "승은" + result); }
	 */

	// 전달값과 반환값 같이 사용하기
	public static int getPower(int number) {
		int result = number * number; // 2) 2를 전달받아서 2*2인 4를 
		return result; //3) 반환해준다. 
		// return number * number; 이렇게 2줄을 1줄로 생략 가능
	} // number * number 값이 저장된 result를 return문을 통해 반환
		
	public static void main(String[] args) {
		int retVal = getPower(2); // number가 2니까  2 * 2 = 4
		// 반환값을 받기위한 (저장하기 위한) 변수가 정의돼야 함
		// 1) 이 메소드를 호출하면서 2라는 값을 전달하고
		// 4) 그 반환된값을 retVal 에다가 전달받아서 
		System.out.println(retVal); //4
		// 5) 출력해준다
	}

}
1. int retVal = getPower(2);
여기에서 왜 반환값을 받기위한 (저장하기 위한) "변수가 정의"돼야 하는지

package chap_06;

public class _04_ParameterAndReturn {
	// 전달값과 반환값 같이 사용하기
	public static int getPowerByExp(int number, int exponent) {
		int result = 1;
		for (int i = 0; i < exponent; i++) {
			result *= number; // result = result * number; 
		}
		return result;
	}

	public static void main(String[] args) {
		int retVal = getPowerByExp(3,3); // 3의 3승
		 System.out.println(retVal);
		 
		 System.out.println(getPowerByExp(3,3));
		 //이렇게도 표현 가능
	}

}
// number - 숫자
// exponent - 숫자를 몇 번 곱해줄 지
메소드 오버로딩

package chap_06;

public class _05_Overloading {
	public static int getPower(int number) { // int라서 전달값을 정수로 받았음
		int result = number * number;
		return result; // return number * number;
	}

	// 전달값을 문자열로 받기
	// 문자열을 정수로 바꿔주는 역할 하기 - int number 라는 정수형 변수 만들기 -> strNumber을 정수로 바꿔주기(형변환)
	public static int getPowerStr(String strNumber) {
		int number = Integer.parseInt(strNumber);
		return number * number;
	}

	public static int getPowerByExp(int number, int exponent) {
		int result = 1;
		for (int i = 0; i < exponent; i++) {
			result = result * number;
		}
		return result;
	}

	public static void main(String[] args) {
		// 메소드 오버로딩: 이름이 같은 메소드 여러개를 만드는 것
		System.out.println(getPower(3)); // 3 * 3 = 9
		System.out.println(getPowerStr("4")); // 4 * 4 = 16 // 큰따옴표 붙이는거 잊지말기

		// 그런데 String 같은 문자열 말고도 boolean이나 double 같은게 올 수 있다
		// 그때마다 서로 다른 메소드 이름으로 만들게 되면
		// 메소드 호출(사용) 하는 입장에서는 어떤 메소드를 사용해야할지 난감함
		// 그럴떄 사용하는 것 : 메소드 오버로딩 - 이름을 똑같이 주면 되는 것
		// str 붙인 부분을 없애보자
	}

}

package chap_06;

public class _05_Overloading {
	public static int getPower(int number) { // int라서 전달값을 정수로 받았음
		int result = number * number;
		return result; // return number * number;
	}

	public static int getPower(String strNumber) {
		int number = Integer.parseInt(strNumber);
		return number * number;
	}

	public static void main(String[] args) {
		// 메소드 오버로딩: 이름이 같은 메소드 여러개를 만드는 것
		System.out.println(getPower(3)); // 3 * 3 = 9
		System.out.println(getPower("4")); // 4 * 4 = 16

		// str을 지운다해도 똑같이 9와 16이 잘 출력된다!
		// 똑같이 getPower라는 메소드를 호출하는데, 전달값은 서로 다르게 줬었다 (int 정수 /string 문자열)
		// 전달되는 자료형에 따라서 메소드 이름은 똑같지만, 전달값의 자료형이 다르므로
		// 전달값이 다른 메소드를 각각 호출하게 되는 것
		
		// 메소드 오버로딩: 전달값의 타입이 다르거나, 자료형이 다르거나 또는
		// 전달값의 갯수가 다르면, 똑같은 이름의 메소드를 얼마던지 중복해서 선언할 수 있다.
	}

}

package chap_06;

public class _05_Overloading {
	public static int getPower(int number) { // int라서 전달값을 정수로 받았음
		int result = number * number;
		return result; // return number * number;
	}

	public static int getPower(String strNumber) {
		int number = Integer.parseInt(strNumber);
		return number * number;
	}

	// getPowerByExp 얘 또한 getPower로 이름을 중복해서 써보자 - 똑같이 잘나온다
	public static int getPower(int number, int exponent) {
		int result = 1;
		for (int i = 0; i < exponent; i++) {
			result = result * number;
		}
		return result;
	}

	public static void main(String[] args) {
		// 메소드 오버로딩: 이름이 같은 메소드 여러개를 만드는 것
		System.out.println(getPower(3)); // 3 * 3 = 9
		System.out.println(getPower("4")); // 4 * 4 = 16
		//System.out.println(getPowerByExp(3, 3)); // 3 * 3 * 3 = 27
		System.out.println(getPower(3, 3)); // 3 * 3 * 3 = 27
	}

}
		// 메소드 오버로딩: 같은 이름의 메소드를 여러번 선언
		// 1. 전달값의 타입이 다르거나
		// 2. 전달값의 갯수가 다르거나

package chap_06;

public class _05_Overloading {
	public static int getPower(int number) {
		int result = number * number;
		return result; 
	}

	public static double getPower(int number) {
		return 0.0;
	}
	// 반환형은 중복 정의 불가
메소드가 필요한 이유

package chap_06;

public class _06_WhenToUse {

	public static void main(String[] args) {
		// 메소드가 필요한 이유 : 코드의 중복을 줄일 수 있다.

		// 2의 2승을 구하기
		int result = 1;
		for (int i = 0; i < 2; i++) {
			result *= 2;
			// 0 - 1 * 2 = 2
			// 1 - 2 * 2 = 4
			// 2의 2승 구하기 끝
		}
		System.out.println(result); // 2 * 2 = 4

		// 3의 3승을 구하기
		result = 1;
		for (int i = 0; i < 3; i++) {
			result *= 3; // 27
		}
		System.out.println(result); 

		// 4의 2승을 구하기
		result = 1;
		for (int i = 0; i < 2; i++) {
			result *= 4; // 16
			// 0 - 1 * 4 = 4
			// 1 - 4 * 4 = 16
			// 4의 2승 구하기 끝
		}
		System.out.println(result); 
	}
}

package chap_06;

public class _06_WhenToUse {
	// 메소드가 필요한 이유 : 코드의 중복을 줄일 수 있다.

	public static int getPower(int number, int exponent) {
		int result = 1;
		for (int i = 0; i < exponent; i++) {
			result *= number;
		}
		return result;

	}

	public static void main(String[] args) {

		System.out.println(getPower(2, 2)); // 2의 2승 호출 // 4
	}

}
1. 리턴 반환할 때 위치를 어디에 둬야하는지 헷갈림.
// 내가 헷갈렸던 리턴문 위치

package chap_06;

public class _06_WhenToUse {

	public static void main(String[] args) {
		// 메소드가 필요한 이유 : 코드의 중복을 줄일 수 있다.

		public static int getPower(int number, int exponent) {
			int result = 1;
			for (int i = 0; i < exponent; i++) {
				result *= number;
				return result;
		}
	}
}

변수의 범위 (scope)

package chap_06;

public class _07_VariableScope {
	public static void methodA() {
		System.out.println(number);
		System.out.println(result);
	}

	public static void methodB() {
		int result = 1; // 지역변수
	}
	// result 출력 안됨
	// 해당 메소드 영역 내에서만 출력 가능
	// 지역변수: 변수가 선언된 영역내에서만 사용할 수 있는 변수.
	public static void main(String[] args) {
		int number = 3;
		// 메인 메소드에 있는 number를 methodA 에 출력하기 => 불가능
		System.out.println(result); // result 출력 안됨
	}

}

package chap_06;

public class _07_VariableScope {
	// 지역변수: 변수가 선언된 영역내에서만 사용할 수 있는 변수.
	public static void main(String[] args) {
		int number = 3;
		// 선언된 변수는 그 변수를 둘러싸고 있는 중괄호 속에선 얼마든지 가능. 벗어나면 쓸 수 없음.
		for (int i = 0; i < 5; i++) {
			System.out.println("i");

			int j = 0;
			System.out.println(j);
			System.out.println(number); // 메소드영역 내부라 출력 가능
		}
		System.out.println(number); // 메소드영역 내부라 출력 가능
	}
}
Main 메소드

728x90