메소드 타입 - 0804

안씅👩🏻‍💻·2022년 8월 4일
0
post-thumbnail

메소드 사용 영역

메소드(method)란?
: 코드를 재사용할 수 있게 헤주는 것.
: 경제적으로 로직을 작성 할 수 있게 해줌.

public class Method{
	public static void number(){

		// number() 메소드 코드 내용 작성 부분

	}
	public static void main(String[] args){
		number();	
        // number() 메소드 호출해서 number() 메소드 코드 내용을 사용할 수 있음.

	}
}


local variable지역변수
: 특정 메소드 내에서만 사용되는 변수

  • main 메소드는 i j k -> local variable

  • max 메소드는 result

  • parameter variable
    : 메소드의 fomal paremeter list

  • max 메소드에서는 num1 num2


string 타입
문자열을 저장하는 메소드 class타입

null

  • 참조타입 변수에서만 사용가능
  • 주소가 없다는 의미 --> 초기화 하겠다는 의미
  • 참고로 , 기본 타입의 초기값은 int 같은 경우에는 0(int age =0;)
  • 힙메모리의 고아 테이터들은 garbage collector 프로그램이 주기적으로 실행하면서 제거됨.

배열

배열이란?

  • 같은 타입의 데이터를 연속된 공간에 저장된 자료구조를 의미함.
  • c언어부터 오래동안 사용하고 있는 데이터 타입임.

    • CPP JS Python(list),,,
  • 배열 값들은 힙메모리에 연속으로 붙어 저장 됨.

<배열 사용 예시>

  • 수능 수험생들의 성적, 등급, 평균,,, 등을 배열
    • 반복문으로 소스코드의 양을 대폭 줄일 수 있지만, 변수를 수험생만큼 선언해야함.
  • 중복된 변수를 줄일 수 있음.

Array 배열

  • 특정 타입의 원소가 연속적으로 메모리에 할당된 데이터 타입을 의미함.

  • int[] arr = {10,20,30,40}; 형식으로 작성함.

    • int[] 는 배열 타입(배열 원소의 데이터 타입이 int라는 의미)
    • arr 은 변수의 이름
    • {10,20,30,40} 은 배열 초기 값, 각각의 데이터를 배열 원소의 데이터 값으로 설정한다는 의미
  • arr[index] index가 0인 경우 첫번째 원소를 가져옴

int[] arr = {10,20,30,40};
		
		 System.out.println("arr 첫번째 원소 : " +arr[0]);
		 System.out.println("arr 첫번째 원소 : " +arr[1]);
		 System.out.println("arr 첫번째 원소 : " +arr[2]);
		 System.out.println("arr 첫번째 원소 : " +arr[3]);
          System.out.println("arr 전체 배열 원소 갯수 : " +arr.length); // 전체 원소의 길이(갯수)

int[] arr1 = { 50, 60, 70, 80 };

	System.out.println("arr1 첫번째 원소 : " + arr1[0]);
	System.out.println("arr1 첫번째 원소 : " + arr1[1]);
	System.out.println("arr1 첫번째 원소 : " + arr1[2]);
	System.out.println("arr1 첫번째 원소 : " + arr1[3]);
	System.out.println("arr1 전체 배열 원소 갯수 : " + arr1.length);

// ---------------------------------------

	double[] arr2 = { 1.2, 2, 3, 4 };

	System.out.println("arr2 첫번째 원소 : " + arr2[0]);
	System.out.println("arr2 첫번째 원소 : " + arr2[1]);
	System.out.println("arr2 첫번째 원소 : " + arr2[2]);
	System.out.println("arr2 첫번째 원소 : " + arr2[3]);
	System.out.println("arr2 전체 배열 원소 갯수 : " + arr2.length);


배열만 선언하고 나중에 초기값을 넣는 방법.

  • 예시 arr3 = new int[]{5,6,7,8,9}; 에서 new 메소드를 넣어 초기값을 넣음.
	int arr3[];
	// new + data type(배열 타입인 경우는 예를 들면 int[])
	arr3 = new int[]{5,6,7,8,9}; // 
		
	System.out.println("arr3 첫번째 원소 : " + arr3[0]);
	System.out.println("arr3 첫번째 원소 : " + arr3[1]);
	System.out.println("arr3 첫번째 원소 : " + arr3[2]);
	System.out.println("arr3 첫번째 원소 : " + arr3[3]);
	System.out.println("arr3 첫번째 원소 : " + arr3[4]);
	System.out.println("arr3 전체 배열 원소 갯수 : " + arr3.length);
		
//		ArrayBasic ab = new ArrayBasic();

배열에 원소의 값이 없는 배열 크기(길이) 생성

  • int[] 변수명 = new int[A]; 형식
    • A에 배열의 크기(길이)를 넣어 생성함.
	int[] arr4 = new int[4];
	arr4[0] = 10;
	arr4[1] = 20;
    arr4[2] = 30;
	arr4[3] = 40;
	System.out.println("arr4의 전체 원소 개수 : "+arr4.length);

elemet 사용하기

  • main에 선언된 배열을 배열에서 첫번째 원소부터 마지막 원소의 값을 차례로 element에 넣어줌
int[] arr = { 10, 20, 30, 40, 50, 60 };
double[] arr2 = { 1.0, 2.0, 3.0, 4.0 };

for (int i = 0; i < arr.length; i++) { // arr.length = 6
	sum += arr[i];
	System.out.println("arr[" + i + "] : " + arr[i]);
		}

for (int i = 0; i < arr2.length; i++) { // arr2.length = 4
	System.out.println("arr[" + i + "] : " + arr2[i]);
		}
   
//----------------------------------위 코드를 for문으로 

		//향상된 for문(배열 등 여러개의 원소를 갖은 타입에서 사용가능)
		// arr 배열에서 첫번째 원소부터 마지막 원소의 값을 차례로  element에 넣어줌
		for (int elemet : arr) { 
        //arr배열 값이 각각 element로 담긴다는 의미
			System.out.println(elemet);
		}
		
		for (double elemet : arr2) {
			System.out.println(elemet);
		}



콘솔에서 배열의 크기와 원소의 값 읽어오기.

double[] myList;
		
		Scanner in = new Scanner(System.in);
		System.out.println("배열 전체 크기를 입력하세요");
		
		int arrayLength = in.nextInt();
		myList = new double[arrayLength];
		
		for (int i = 0; i < myList.length; i++) {
			System.out.println((i+1)+"번 째 원소를 입력하세요.");
			myList[i] = in.nextDouble();
		}
		
		for (int i = 0; i < myList.length; i++) {
			System.out.println("myList["+i+"] : " + myList[i]);
			
		}



- 참고 : c 언어는 string이라는 데이터 타입 없음

배열.length 이용해서 평균값 구하기

double average = (double) sum / scores.length; // scores.length --> 배열 크기(길이)로 산술 가능
		System.out.println("전체 합계 : " + sum);
		System.out.println("전체 평균 : " + average);

배열.length로 최대값 구하기

double max = myList[0];
		for (int i = 0; i < myList.length; i++) {
			if (myList[i]>max) {
				max = myList[i];
			}
		}
		System.out.println("max : " + max);

배열을 사용해 코딩 단순화

String[] months = {"Jan", "Feb", "Mar", "Apr","May","Jun","Jul","Sep","Aug","Oct", "Nov","Dec"};
		
		Scanner input = new Scanner(System.in);
		
		System.out.println("달력 숫자를 입력하세요.");
		int month = input.nextInt();

		
		System.out.println("이번달은 " + months[month-1] + "입니다." );

배열 복사

  • A배열 원소들의 값을 전체 B배열 원소들로 값을 복사

  • System.arraycopy(A, 0, B, 0, A.length);

    • A배열의 시작 위치는 0번째부터 , B배열의 위치 0번째부터, A.length만큼 복사
int[] sourceArr = { 2, 3, 1, 5, 10 };
		int[] targetArr = new int[sourceArr.length];

		// 1. for문을 사용하여 단순 복사 하는 방법
		for (int i = 0; i < sourceArr.length; i++) {
			targetArr[i] = sourceArr[i];
		}

		for (int i = 0; i < targetArr.length; i++) {
			System.out.println("targetArr[" + i + "] = " + targetArr[i]);
		}
		System.out.println("----------------------------------------");

		// 2. System.arraycopy Method 사용하기
		System.arraycopy(sourceArr, 0, targetArr, 0, sourceArr.length);

		for (int i = 0; i < targetArr.length; i++) {
			System.out.println("targetArr[" + i + "] = " + targetArr[i]);
		}


** testArrayParameter 메소드 Parameter**
  • number

    • call by value에 의해 x값이 1이 number로 copy
  • numbers

    • y의 값(주소)이 numbers로 copy --> 주소가 복사 됨.(주소를 copy해서 call by reference라고 함)
    • call by reference에 의해 호출된 메소드 안에서 배열 원소값을 수정하면 메인 메소드에서 해당 배열 원소 값이 수정 됨.
  • 스택 안에 main에서 testArray, testArray에서 heap메모리
    순서로 데이터를 가져와서 출력함.

		int x = 1;
		int[] y = new int[10];

		for (int i = 0; i < y.length; i++) {
			y[i] = 100;
		}

		testArrayParameter(x, y);

		System.out.println("x = " + x);
		System.out.println("y[0] = " + y[0]);

		System.out.println("---------------------------------");

		for (int i = 0; i < y.length; i++) {
			System.out.println("y[" + i + "] : " + y[i]);
		}

	}

	public static void testArrayParameter(int number, int[] numbers) {
		number = 1001;
		numbers[0] = 3333;
	



		int[] list = { 1, 2, 3, 4, 5 };

		System.out.print("reverse 하기 전 :");

		for (int i = 0; i < list.length; i++) {
			System.out.print(list[i] + " ");
		}

		System.out.println();

		// 스택에 있는 list의 값을 new list의 새로운 주소로 변경
		reverse(list);

		System.out.print("reverse 하기 후 :");

		for (int i = 0; i < list.length; i++) {
			System.out.print(list[i] + " ");
		}

	}

	// return type: array return
	public static void reverse(int[] list) {
		int[] newList = new int[list.length];

		for (int i = 0; i < list.length; i++) {
			newList[i] = list[list.length - 1 - i];
		}
//		list = newList; --> 작동하지 않음. main에 list는 주소를 복사해오기만 했기 때문에.
//		--> 아래 수정.
		for (int i = 0; i < list.length; i++) {
			list[i] = newList[i];
		}

프로그램 외부에서 입력

		for (int i = 0; i < args.length; i++) {
			System.out.println("arge[" + i + "] : " + args[i]);
		}

		if (args.length != 3) {
			System.out.println(" 사용법 예 : 2+3");
			return; 
            // 메소드에 return 타입이 void인 경우 리턴 값이 없는 상태로 리턴 가능
		}

		int result = 0;

		switch (args[1].charAt(0)) {
		case '+':
			result = Integer.parseInt(args[0]) + Integer.parseInt(args[2]);
			break;
		case '-':
			result = Integer.parseInt(args[0]) - Integer.parseInt(args[2]);
			break;
		case '.':
			result = Integer.parseInt(args[0]) * Integer.parseInt(args[2]);
			break;
		case '/':
			result = Integer.parseInt(args[0]) / Integer.parseInt(args[2]);
			break;
		}
		System.out.println(args[0] + " " + args[1] + " " + args[2] + "=" + result);

		System.out.println("end of calculator");

  • 메소드 parameter를 사용해 배열을 여러개의 값을 parameter로 넘길 수 있어서
    • max method처럼 여러개의 숫자에 대하여 최대값을 구하는 여러개의메소드를 선언할 필요 없음.
  • 배열과 유사한 다른 표기법은 '...'을 사용한 표기법
    • actual parameter로 배열을 사용해도 인식된다
    • primitive 타입으로 여러개 가변적으로 인식됨.
		int a = 1;
		int b = 2;
		int c = 3; 
        
        maxValue = max(a, b);
		System.out.println("maxValue : " + maxValue);
		maxValue = max(a, b, c);
		System.out.println("maxValue : " + maxValue);

		int[] numbers = { 1, 2, 3, 4, 5, 12, 15 };

		maxValue = max(numbers);
		System.out.println("maxValue : " + maxValue);
        
        int maxValue;
        
		maxValue = max(15, 24, 49, 77, 99, 120, 45);
		System.out.println("maxValue : " + maxValue);

	}// --> main 



	public static int max(int a, int b) {

		int result;

		if (a > b)
			return a;
		else
			return b;
	}

	public static int max(int a, int b, int c) {

		int result;

		result = max(max(a, b), c);
		return result;
	}
	
//	public static int max(int[] num) {
//		int result = 0;
//
//		for (int k : num)
//			if (result < k)
//				result = k;
//		return result;
//	}


	//int...은 int[] 와 비슷한 표기법으로 같은 변수를 선언하면 오류가 뜸--> 위 max(int[] num)는 각주표기함.
	public static int max(int... num) { 
    
		int result = 0;

		for (int i = 1; i < num.length; i++) {
			if (num[i] > result) {
				result = num[i];
			}
		}
		return result;



profile
그냥 은근슬쩍 살다 가긴 싫어

0개의 댓글