본문 바로가기
수업 일지/JAVA

9일차 - [JAVA] 메소드 오버로딩/참조 타입

by 쿠쿠씨 2022. 1. 11.
반응형

예제1-1: 메소드를 이용하여 최대값, 최소값 구하기

 

먼저 최대값, 최소값 구하는 방법이다.

9라인 int형 배열 arr을 선언하고 길이를 10으로 한다.

13라인 1~100범위의 난수들을 배열 arr에 대입한다.

18라인 max의 초기값을 arr의 0번 인덱스 값으로 설정한다.

19라인 for문을 이용하여 arr의 1번 인덱스부터 끝까지 검사한다.

20라인 max값을 다음 인덱스 값과 비교하여 더 큰 값을 max값으로 한다.

 

28라인 min의 초기값을 999(100이상의 값)로 설정한다.

29라인 for문을 이용하여 arr의 0번 인덱스부터 끝까지 검사한다.

30라인 min값을 다음 인덱스 값과 비교하여 더 작은 값을 min값으로 한다.

 

다음은 메소드를 호출하는 방법이다.

62라인 반환값은 int형, 인자는 int형 배열인 arrayMaxValue() 메소드를 선언한다.

63~67라인 위의 최대값 구하는 방법과 동일하다.

69라인 max값을 반환한다.(최대값)

 

71라인 반환값은 int형, 인자는 int형 배열인 arrayMinValue() 메소드를 선언한다.

72~76라인 위의 최소값 구하는 방법과 동일하다.

78라인 min값을 반환한다.(최소값)

 

예제1-2: 메소드를 이용하여 합계, 평균 구하기

 

82라인 반환값은 int형, 인자는 int형 배열인 arraySumValue() 메소드를 선언한다.

83라인 합계를 저장할 sum 변수값을 0으로 초기화한다.

84,85라인 for문을 이용하여 배열 0번 인덱스부터 마지막 인덱스까지 순차적으로 sum에 더한다.

87라인 sum값을 반환한다(합계)

 

91라인 반환값은 double형, 인자는 int형 배열인 arrayAvgValue() 메소드를 선언한다.

92~94라인 위의 방식으로 sum을 구한다.

95라인 arraySumValue() 메소드를 호출하여 sum을 구할 수도 있다.

97라인 sum값을 배열의 길이로 나누어 평균을 구한 뒤 double형으로 강제 형변환을 한다.

 

 

 

메소드 오버로딩(overloading) 

 

클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 말한다.

메소드의 이름은 같으나 인자 형식(타입, 개수, 순서)이 달라야 한다.

대표적인 메소드로 Arrays.toString() 메소드가 있다.

14라인 Arrays.toString() 메소드는 int형 배열의 인자를 받아 int형의 반환값을 갖는다.

50라인 Arrays.toString() 메소드는 double형 배열의 인자를 받아 double형의 반환값을 갖는다.

 → 메소드 오버로딩

*

45라인 r.nextDouble() 메소드는 0~1 범위의 실수값 난수를 반환한다.

46라인 r.nextDouble()*10 은 0~10 범위의 실수값 난수를 반환한다.

47라인 r.nextDouble()*9+1 은 1~10 범위의 실수값 난수를 반환한다.

 

 

기본타입과 참조타입

 

참조타입(String, 배열 변수, 모든 클래스) 변수는 메모리에 주소(데이터의 참조값)를 저장한다.

기본형(byte, short, char int, long, float, double, boolean) 변수(기본형 배열 요소 포함)는 메모리에 데이터를 저장한다. 

 

String[] names;           배열 요소는 참조값

StudentScore[] scores;  배열 요소는 참조값

int[] arr;                    배열 요소는 기본형 데이터

 

*용어 정리

배열 변수: arr

배열 요소: arr[0], arr[1]

 

예제2: 문자열 배열 연습

 

9라인 문자열 배열 strArray을 선언하고 초기값을 지정한다.

11,12라인 for문을 이용하여 0번 인덱스부터 끝까지의 인덱스(i)와 저장된 값을 출력한다.

14,15라인 for문을 이용하여 각 인덱스의 0번 자리 문자(charAt(0))와 2~4번자리 문자열(subString(2,5))을 출력한다.

20라인 String 배열 names를 선언하고 길이는 5로 한다.

22라인 0번 인덱스부터 끝까지 각 인덱스(i)와  저장된 값을 출력한다.

 → 배열에 값이 저장되지 않았으므로 null이 출력된다.(null: 아무 것도 없다.)

24라인 names는 배열의 주소, names[i]는 문자열의 주소를 참조합니다.

26라인 문자열이 null일 때 charAt(), substring() 등 메소드를 실행하면 오류가 발생한다.

 → 오류의 명칭(원인)은 NullPointerException이다.

31~34라인 입력을 받아 names 배열에 값을 저장한다.

38, 39라인 names 배열의 인덱스와 저장된 값을 출력한다.

41, 42라인 names[0]의 0번 자리 문자(charAt(0))와 2~4번자리 문자열(subString(2,5))를 출력한다.

45, 46라인 names 배열 각 인덱스의 문자를 toUpperCase() 메소드를 사용하여 대문자로 변경한다.

 → 이 때 names 배열 요소들이 참조하던 주소가 변경된다.

48라인 Arrays.toString() 메소드를 사용하여 배열 형태로 출력한다.

 

예제3: 입력 문자열 비교

 

9라인 영문 문자열을 값으로 갖는 String 배열 engArray를 선언한다.

10라인 한글 문자열을 값으로 갖는 String 배열 korArray를 선언한다.

14라인 입력한 문자열을 참조할 변수 find를 선언한다.

18라인 for문 밖에서도 i를 사용할 수 있도록 for문 앞에 선언한다.

19,20라인 각 인덱스 값을 출력하고, equals() 메소드로 입력한 문자열과 저장된 값을 비교해 결과를 출력한다.

23라인 입력한 문자열과 같은 문자열을 찾으면 for문을 종료한다.

25라인 i<korArray.length는 문자열을 찾았다는 것을 의미한다. (못 찾았다면 i=korArray.length로 for문 종료)

26,27라인 찾은 인덱스 번호를 출력하고, 그 번호에 해당하는 영문 문자열을 출력한다.

28,29라인 같은 문자열을 못 찾았다면 출력되는 문자열이다.

 

예제4: 클래스에서 메소드 호출하기

 

StudentScore 클래스

7~11라인 전역변수를 선언한다.

14라인 반환값 없고 인자가 없는 inputData() 메소드를 선언한다. 

17~21라인 입력을 받아 필드에 저장한다. 아직 객체가 생성되지 않은 상태이므로 this를 사용한다.

 → this는 객체를 생성한 후에 참조 변수가 들어갈 자리이다.

23라인 반환값 없고 인자가 없는 printScore() 메소드를 선언한다.

24라인 입력 받은 값을 출력한다.

27,28라인 int형을 반환하고 인자가 없는 sum() 메소드를 선언한다. → 세 점수의 합계를 반환한다.

30,31라인 double형을 반환하고 인자가 없는 avg메소드를 선언한다. → 실수형으로 평균을 반환한다.

 

StudentScoreArray 클래스

9라인 StudentScore클래스의 배열 iclass의 길이를 5로 선언한다.

11라인 iclass의 각 인덱스에 저장된 값을 출력한다. 아직 참조하는 객체가 없으므로 null이 출력된다.

15라인 StudentScore 객체를 생성하고 참조값을 iclass[0]에 저장한다.

16라인 inputData() 메소드를 실행한다. 만약 15라인 없이 실행한다면 NullPointer 오류가 발생한다.

19~21라인 객체를 생성하여 iclass의 1번~3번 인덱스에 참조값을 저장하고, inputData() 메소드를 실행한다.  

23라인 iclass의 4번 인덱스에는 StudentScore 객체만 생성한다.

 

27라인 객체를 생성했지만 필드값이 없는경우 int형 값들은 0이 출력되고, String 값은 0이 출력된다.

 → 전역변수는 초기값이 참조 타입은 null, 기본형 타입은 0 또는 0.0으로 자동으로 저장된다.

 → 지역변수는 초기값이 자동으로 설정되지 않는다.

36라인 printf를 이용하여 소수점 자리수를 설정하는 법도 있지만 다른 방법을 사용할 것이다.

37라인 DecimalFormat 클래스를 이용하여 객체를 생성하고 인자값 "###.##"로 출력 형식을 지정한다.

 # 하나가 1자리수를 나타낸다. "###.00"로 정수 뒤에 .00을 붙일 수 있다.

38라인 .format()메소드를 이용하여 출력형식을 적용하여 문자열로 변환한다.

40라인 변수 avg를 출력하면 지정한 형식으로 출력된다.

45라인 printScore() 메소드를 이용하여 모든 인덱스에 저장된 값을 출력한다.

 

오늘의 복습문제 : 숫자 맞추기 게임(if문, 반복문, 배열)

**실행화면**(예시)
--------------
숫자 맞추기 게임 시작합니다. 나 컴퓨터는 숫자를 결정했습니다.
너 휴먼은 맞춰보세요.
생각한 숫자 입력 -> ....
아닙니다. 더 큰 값입니다.
생각한 숫자 입력 -> ....  값을 배열에 저장
아닙니다. 더 작은 값입니다.
    :
생각한 숫자 입력 -> ....
딩동댕 맞추셨습니다. 지금까지 시도한 값... ... ... ... 4번만에 정답입니다.

12라인 1~300 범위의 난수를 number에 저장한다.

13라인 int형 배열 numbers를 선언하고 길이를 10으로 한다.

17라인 for문 이후에도 i를 사용하기 위해 i를 for문 앞에 선언한다.

18~20라인 숫자를 반복하여 최대 10번까지(numbers의 길이) 입력받는다.

21,22라인 number가 입력한 숫자보다 크다면 "아닙니다. 더 큰 값입니다." 메시지를 출력한다.

23,24라인 number가 입력한 숫자보다 작다면 "아닙니다. 더 작은 값입니다." 메시지를 출력한다.

25라인~28라인 입력한 숫자가 number와 같다면 지금까지 시도한 값(numbers[i])을 나열한다.

29라인 몇 번 만에 맞췄는지 횟수를 출력한다. (i=0부터 시작하므로 횟수는 i+1)

30라인 break문으로 for문을 종료시킨다.

32,33라인 i=9(numbers.length-1) 즉 10번 만에 맞추지 못하면 "기회를 모두 날렸습니다. 당신이 졌습니다."가 출력되고 i++가 실행되어 i=10으로 for문이 종료된다.

 

반응형

댓글