[JAVA.07] 메소드(함수)와 변수의 사용 가능한 범위와 메모리 영역 and 꿀팁📣

Kama_Code·2023년 7월 10일
1

JAVA

목록 보기
12/20
post-thumbnail
post-custom-banner
  • 자바(JAVA)는 객체지향언어이다.
    메소드는 프로그래밍을 하는데 매우매우 중요하며
    안정적 그리고 효율성을 증가시키는 메소드(함수)에 대해서 알아본다!

<Step.1> 메소드의 정의👀🐣

  • 메소드(함수)란?
    ㄴ객체지향 프로그램에서 행동 또는 동작을 의미한다.
    ㄴ함수는 무조건 클래스 안에 존재하기 때문에 결국 모든 함수가 메소드가 된다.

→ 상수명은 전체 대문자로 쓴다
→ 패키지명은 전체를 소문자로 기술하고 연결단어는 .(닷)으로 구분한다.

  • 다음처럼 기능을 구현하는 것을 '메소드를 정의한다' 라고 한다
  1. 메소드 이름: 클래스명 - 대문자로 시작하지만
    ㄴ메소드 및 변수명 - 소문자로 시작한다
  2. 매개변수를 통해서 전달된 값이 복사된다.
    ㄴ메소드의 형태는 총 4가지가 있다!
  1. 반환형 : 위 사진에서 int는 정수형 반환값이 있는 메소드를 말하며
    void는 반환값이 없는 것을 말한다.
  2. 코드 블럭 : 말 그대로 위에서부터 아래로 코드를 실행한다.
  3. return : (반환값이 있을 때의 return)은 호출한 곳으로 값을 반환한다.
    (반환값이 없을때 void의 return)은 끝낸다(end)를 의미한다.

<Step.2> 메소드의 규칙👀🐣

  • Java에서 main메서드는 무조건 public static void로 선언하기로 약속한다.
  • static으로 선언된 메서드는 static으로 선언된 메서드만 호출할 수 있다.
  • 매소드 호출 후 반환값은 호출한 위치로 반환된다.
    이때 매소드는 메모리에서 소멸된다.
  • 반환값이 없는 void형 메서드는 실행이 완료되면 호출한 위치로 실행의
    흐름이 돌아온다.
  • 하나의 기능을 수행하는 일련의 코드로 객체의 기능을 제공하기 위해
  • 반드시 클래스 내부에 구현된다.

<Step.3> main 메소드👀🐣

  • 자바(JAVA)는 객체지향언어로 순서가 없다. 그러나, 기준이 있다.
    ㄴ바로 !! main (메인)이다. 항상 프로그램의 시작은 main에서부터이다.
    ㄴ코딩이 아무리 복잡하고 뒤죽박죽일지라도 자바(JAVA)언어는 가장 먼저 메인부터
    ㄴ찾아서 위에서부터 순서대로 읽으면 수월하게 읽을 수 있다.
    ㄴ이것이 자바(JAVA) 코드 읽는 법이다.
  • 자바(JAVA)는 선입후출 형식이며 MAIN(메인)이 가장 아래에 쌓인다.
    다른 메소드가 모두 나가야 메인도 나갈 수 있다. 가장 중요함을 잊지 말자!
  • 아래 사진은 메인 메소드로부터 다른 메소드를 호출하는 과정을 의미한다.
    ㄴ메인 메소드가 HiEveryone이라는 다른 메소드를 불렀고 하지만 매개변수 int age가 있다.
    ㄴ그래서 호출할때 HiEveryone(age값)이 필수로 들어간다.
    ㄴ매개변수가 있는 메소드를 부를 때 조건에 해당하는 값이 없으면 에러(error)가 난다.

<Step.4> 변수의 사용 가능한 범위👀🐣

  • 변수도 사용 가능한 범위가 있다.
    굉장히 중요한 내용이니까 눈에 꼭 익히자!

자바(JAVA)에서 변수의 구분은 클래스변수, 지역변수, 매개변수가 있다.

  • 클래스변수는 클래스 안에서 모두 사용이 가능하다.
  • 매개변수는 메소드를 호출할때 필요한 조건에 해당한다.
  • 지역변수는 그 메소드 지역 안에서만 사용이 가능하다.
    ㄴ지역변수는 해당 지역을 벗어나면 메모리에서 소멸된다. 그러므로
    ★ 다른 메소드에서 똑같은 이름으로 변수를 사용할 수 있다.

<Step.5> 메소드의 오버로딩(Method Overloading)👀🐣

  • 동일한 이름의 메서드를 2개 이상 정의하는 것을 말한다.
  • 이름만 같고 기능은 다른 메소드이다.
  • 메소드가 같다는 것은 매개변수까지 모두 일치해야 똑같은 메소드로 본다.
  • 예시로는 println - 메소드 이름은 서로 같으나 매개변수가 달라 서로 다른 기능을 한다.
  • 메소드가 같고 다름을 구별할 때 반환값은 상관이 없다. (void든 int든..)
    ㄴ매개변수와 메소드 이름까지만 같다면 같은 메소드로 본다.

<Step.6> 메모리 영역👀🐣

  • 자바(JAVA) 언어를 사용하다보면 반드시 눈에 익혀야 하고 알아야 하는
    메모리 영역이다.

자바 가상머신(JVM)은 운영체제(OS)에서 이렇게 실행한다.
1. 자바(JAVA) 소스코드인 .java 파일을 컴파일러가 자바 바이트 코드인
.class로 변환합니다.
2. .class 코드를 JVM의 클래스 로더에게 보냅니다.
3. 클래스 토더는 JVM 런타임 데이터 영역으로 로딩하여 JVM의 메모리에 올립니다.

  • 메소드(Method) 영역
    ㄴ클래스 정보, static 변수, 변수 정보, 메소드 정보 등을 저장한다.
    ㄴstatic 이 선언된 클래스 멤버도 올라갑니다.

  • 스택(Stack) 영역
    ㄴ int, long, boolean 등 ★기본 자료형★을 저장하는 공간으로,
    임시적으로 사용되는 변수나 정보들이 저장되는 영역
    ㄴ쓰레드 별로 1개만 생성하며, 메소드가 호출될 때마다 생성되며 끝나면 제거된다.

  • 힙(Heap) 영역
    ㄴ 인스턴스를 생성할 때 생성되는 메모리 형식
    ㄴ new로 된 것은 다 힙 영역이다.("new"를 사용하여 객체를 만들 때 저장)
    ㄴ 참조형(class, interface, enum, Array 등) 자료형도 같이 저장
    ㄴ예시) Instance instance = new Instance(); -> heap에 존재

  • 스택(Stack) 영역은 참조값(주소값)만이 들어있다. = (id = 27)
    실제 값은 힙 영역에 저장되어 있다.

<Step.7> 재귀호출✨

재귀 호출(recursive call)이란?

  • 재귀 호출(recursive call)이란 메소드 내부에서 해당 메소드가 또다시 호출되는 것을 의미합니다.

예시1) 1~n까지의 합을 구한다.

int sum(int n) {
    int result = 0;
    for (int i = 1; i <= n; i++) {
        result += i;
    }
    return result;
}

재귀호출 변환) 1~n까지의 합의 구한다.

int recursiveSum(int n) {
    if (n == 1) {                 // n이 1이면, 그냥 1을 반환함.
        return 1;
    }
    return n + recursiveSum(n-1); // n이 1이 아니면, n을 1부터 (n-1)까지의 합과 더한 값을 반환함.
}

<Step.8> 기타 꿀팁👀🐣

  • 이클립스를 사용하다가 창이 지워졌다면?
    showview에서 사라진 창을 선택하여 다시 불러낸다.
  • 불러내기엔 돌이킬 수 없고 너무 멀리 왔다면?
    window - Perspective - Reset perspective = 초기화
  • 메소드를 더블클릭 후 [컨트롤 + T] 를 누르면 족보가 나온다.
    맨 위에 Object가 보이는데 신이라고 보면 된다.

<Step.9> 발전을 위한 문제풀이 (kama_code 출제)

  1. 두 정수를 입력을 받아서 더하기, 빼기, 곱하기, 나누기, 거듭제곱을 계산하는
    계산기 프로그램을 만들어라
  2. 원의 반지름을 입력하면 원의 둘레와 원의 넓이를 출력하는 프로그램을 만드시오
  3. 삼겹살 몇인분을 먹었는지 정수만 입력할시 인분에 따른 칼로리가 출력되는 프로그램을 만드시오
  4. 몸무게와 키를 입력받아 다이어트(BMI) 지수를 출력하는 프로그램을 만드시오
    비만: 30이상
    과체중: 25이상~30미만
    정상:18.5이상 ~25미만
    저체중: 18.5미만
  5. 현금(원)을 입력받아 달러가 환전되는 프로그램을 만드시오.

★ 정답 및 해설 ☆

  1. 복잡해보이지만 원리는 쉽고 간단하다. 더하는 메소드, 빼는 메소드,
    곱하는 메소드, 나누는 메소드, 거듭제곱 메소드를 하나씩 다 만들어서
    메인에서 불러주면 된다.

✍ 입력 : (코드만 길지.. 잘보면 간단하다.)

public class Method
{
	public static void showMenu()
	{
		System.out.println("계산을 계속하려면 엔터를 눌러주세요");
		Scanner scanner = new Scanner(System.in);
		String rp = scanner.nextLine();
		if (rp.isEmpty())
		{
			System.out.println("================================");
			System.out.println("메뉴를 선택하세요.숫자를 입력하세요.꼭이요");
			System.out.println("1.더하기");
			System.out.println("2.빼기");
			System.out.println("3.곱하기");
			System.out.println("4.나누기");
			System.out.println("5.거듭제곱");
			System.out.println("0.끝내기");
			System.out.println("================================");
		}
	}

	public static void add()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자 :");
		int num1 = sc.nextInt();
		System.out.print("두번째 숫자 :");
		int num2 = sc.nextInt();

		int result = num1 + num2;
		System.out.println(num1 + " + " + num2 + " = " + result);
		System.out.println();
	}

	public static void substract()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자 :");
		int num1 = sc.nextInt();
		System.out.print("두번째 숫자 :");

		int num2 = sc.nextInt();

		int result = num1 - num2;
		System.out.printf("%d - %d = %d ", num1, num2, result);
		System.out.println();
	}

	public static void multiply()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자 :");
		int num1 = sc.nextInt();
		System.out.print("두번째 숫자 :");
		int num2 = sc.nextInt();

		int result = num1 * num2;
		System.out.printf("%d * %d = %d ", num1, num2, result);
		System.out.println();
	}

	public static void divide()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자 :");
		int num1 = sc.nextInt();
		System.out.print("두번째 숫자 :");
		int num2 = sc.nextInt();

		if (num2 == 0)
		{
			System.out.println("0으로 나눌 수 없습니다.");
			return; // if문인 경우 continue 대신 사용
		}

		int result1 = num1 / num2;
		System.out.println(num1 + " / " + num2 + " = " + result1 + " (몫)");
		int result2 = num1 % num2;
		System.out.println(num1 + " % " + num2 + " = " + result2 + " (나머지)");
		System.out.println();
	}

	public static void power()
	{
		Scanner sc = new Scanner(System.in);
		System.out.print("첫번째 숫자 :");
		int num1 = sc.nextInt();
		System.out.print("두번째 숫자 :");
		int num2 = sc.nextInt();

		int result = 1;
		for (int i = 0; i < num2; i += 1)
		{
			result *= num1;
		}
		System.out.printf("%d의 %d 제곱 = %d ", num1, num2, result);
		System.out.println();
	}

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);

		while (true)
		{
			showMenu();

			int num = sc.nextInt(); // 입력받은 수를 가져와서 집어넣는다.
			if (num == 0)
			{
				System.out.println("계산기를 종료합니다.");
				break;
			} else
			{
				if (num > 5)
				{
					System.out.println("없는 메뉴입니다.");
					System.out.println("메뉴를 다시 선택하세요.");
					continue;
				}

				// 계산 진행
				if (num == 1)
					add();
				else if (num == 2)
					substract();
				else if (num == 3)
					multiply();
				else if (num == 4)
					divide();
				else if (num == 5)
					power();
			}

		}
		System.out.println("==========================");
	}
}
  1. 메소드만 나누어질뿐 원리 역시 간단하다.
    원의 넓이 구하는 공식과 원의 둘레 구하는 공식이 담긴 메소드만 만들어서
    메인에서 호출해주면 끝이다.
  1. 굳이 메소드를 만들지 않아도 연산이 가능하지만
    메소드 공부하는 포스팅이므로 연산하는 매개변수 int로 받고
    반환값이 int인 kalo라는 메소드를 만들었다.
  1. 키와 몸무게 두개의 값을 받기 위해 매개변수가 2개인 메소드를 생성하여
    여기서 연산을 하고 출력을 하게 했다. 간단간단 ~~
    비만: 30이상, 과체중: 25이상~30미만, 정상:18.5이상 ~25미만, 저체중: 18.5미만
  1. 위 내용들과 원리가 같다.
  • 반복문은 자바(JAVA)의 꽃이라고 했다.
    다음 시간에는 자바(JAVA) 그 자체라고도 볼 수 있는 클래스에 대해 배운다.
    어~엄청나게 중요한 것이니까 기대 :)
profile
[Java SQL HTML CSS JS Studying] 발전을 꿈꾸며 이상을 실현합니다
post-custom-banner

0개의 댓글