[Java] 오버로딩 / 가변인자

2021. 1. 23. 14:49Dev.Program/Java & Spring

728x90

< 메서드 오버로딩(Method Overloading) = 다중 정의 >

p.197

  • 동일한 이름의 메서드를 여러개 정의하는 것
  • 이름은 동일하고 파라미터가 서로 달라야 함
    • ⇒ 파라미터의 타입 또는 개수가 달라야 함
  • 리턴타입은 오버로딩과 무관함(달라도 상관없음)
  • 반드시 메서드를 호출하는 시점에서 오버로딩 된 메서드를 구분할 수 있어야함

 

======== Ex.java 만들기.

문제 )

정수 num 을 전달받아 절대값을 리턴하는 abs() 메서드 호출

정수 num 을 전달받아 절대값을 리턴하는 abs() 메서드 정의

 

  • 더블 타입을 넣으면 오류남!
  • public int abs(int num) {} ⇒ int 타입을 받기 때문에!

  • 그래서 double 타입을 받아서 리턴하는 메소드를 따로 정의해줘야함.

  • 오류가 사라짐

< 메서드 오버로딩 = 다중정의 >

p.197~

  • 우리가 자주 사용하는 println도 오버로딩이 적용된것!!
  • 오버로딩이 없었다면 System.out.printlnInt() / System.out.printlnString() …. 이렇게 적어야 했을 것 

 

  • ctrl + space 눌러보면, 오버로딩을 적용할 경우 이렇게 뜸!

  • Duplicate : 중복값이기 때문에 오버로딩할 수 없다(오류!)

  • num2로 바꿔도 오류 안없어짐! (바깥에선 구분할 수 없기 때문)
    • ⇒ 바깥에서 2 라는 int 값을 들고올 때 이 값을 int num 에 넣을지, int num2 에 넣을지 구분할 수 없기 때문이다.
  • public double abs(int num2) { }  double로 바꿔도 오류발생!
    • ⇒ 리턴타입만 바꾸는 것은 오버로딩이 아니다!
    •     (호출하는 시점과 리턴타입은 아무런 관계가 없다)
  • 바깥에서 호출하는 값이 int 값이므로 리턴값을 바꿔도 오류가 없어지지않는다.
  • 똑같이 바깥에서 2 라는 int 값을 받아왔을 때, num에 넣을지 num2에 넣을지 구분할 수 없기 때문!

 

문제 ) 오버로딩 클래스 생성하기

푼 답 )

  • 출력창

⇒ 오버로딩 개념 잘 익히기 ( 껍데기는 같고 파라미터로 구분! )

 

> 연습해보기 )

======== Test.java 새 문서 만들기

  • 문제

푼 답 ) …………..

선생님 답안 ) 리턴값이 없는 문제!

======== Ex2.java 새 문서 만들기

문제 ) 파라미터가 다른 메서드 오버로딩

푼 답 ) =선생님 답

  • ctrl + space : 오버로딩 생성 된 거 볼 수 있다!

  • 이렇게 순서 바꾸는 건 가능

  • 이렇게는 오류남! 파라미터 이름 바꾸는건 의미 없다. 같은 스트링타입이라!

 

======== Test2.java 새 문서 만들기 // 계산기...와 비슷하게(물론 계산기는 이렇게 안함!)

문제 ) 연산기호(연산자)와 연산에 사용될 데이터 2 ~ 4개를 전달받아 연산 수행

  • 1차 ) +로 받았을 때, 2차) -로 받았을 때 !

답 ) 풀다가 안되서 수영이 코드 도움……..ㅎㅎ

https://blog.naver.com/vjvl4642/221799851014

  • 희진이 블로그

 

public void cal(char ch, int a, int b) {
    if(ch == '+') {
    	System.out.println(a + b);
    } else if (ch == '-') {
    	System.out.println(a - b);
    } else if (ch == '*') {
	    System.out.println(a * b);
    } else if (ch == '/') {
        System.out.println(a / b);
    }
}
  • 곱셈/나눗셈 까지 간단하게 추가 가능!
  • ⇒ if 문 대신 switch ~ case 문으로도 가능 (나중에 해보기)

 

< 가변인자 = 비정형인자 >

p189 (4)

======== Ex3.java 새 문서 만들기

 

int … nums

  • 가변인자 ...
  • ...은 “int… nums”로 써도 “int … nums”로 써도 “int ...nums”로 써도 다 상관없다!
  • ⇒ “ … ” 위치는 중간에만 있으면 다 OK!
  • 띄어쓰기 아무곳에나 상관없이 타입과 변수명 사이에만 오면 됨.

 

  • na.print("유라", "수영", "해진", "희진"); // 오류!
  • 3개 까지만 만들었기 때문에 4개 적기 시작하면 오류가 난다!
  • 해당 갯수만큼 메서드 오버로딩 수행 필수

 

  • 가변인자 만들 때 점 세개 찍는 순간 변수명 생성해줌 (근데 우린 다른 이름 줄 거)

  • 답 ) 문제 풀고 출력했더니 출력창이…..ㅎㅎ
for(int i = 0; i < names.length; i++) {
	System.out.println(names[i] + " ");
}
  • names[i] 배열이니까!! 이부분을 안해줘서 오류났던거!

 

va.print();
  • 아무것도 출력 안해도 오류 안남!

> 주의사항! 가변 인자는 마지막 파라미터로 단 한 번만 사용 가능!!

  • 가변인자가 다른 파라미터보다 앞에 올 수 없다!
  • 가변인자는 0 ~ 무한대 까지 받을 수 있기 때문에 언제 끝날지 몰라서!
  • 무조건 마지막 파라미터가 되어야 함.

  • 같은 이유로 가변인자가 2개 이상 올 수 없음!
  • 가변인자가 앞쪽에 오는게 불가(언제 끝날지 모르기 때문에)!



======== Test3.java 새 문서 만들기

  • 문제 ) 가변인자를 활용한 계산기

  • 푼 답 ) 완전 틀림 ㅜ.ㅜ 다시 풀어보기

  • 푼 답 ) 또 틀림……..num[i+1] 을 하면 i < num.length 에서 num.length 범위를 넘어가기 때문에 오류가 생긴다.

 

  • 푼 답

 

  • 선생님 답안

int a = 0; // 가장 많이 하는 실수!!

for(int i = 1; i < num.length; i++) // 같이 바꿔주기!

이렇게 돌리면 if 문 안에 for 문이 들어가서 for문을 덜 돌릴수있다. (처리 속도가 빨라짐)

 

> 최소한 피연산자(데이터)가 2개 이상일 때만 연산 수행

if(num.length < 2) {
	return;
}
728x90