DAY_009[국비] 자바 웹프로그래밍 과정

Bona의 블로그 입니다.·2022년 10월 7일
0

국비과정

목록 보기
10/99

 🌞 Day 009 : 메서드 연습 



 🌱 1 교시 

 📙 연습 문제 : 배열 값들의 합계를 구하는 메서드 만들기 

  • 문제
  • 내가 쓴 답
  • 간단한 연산을 할 때에는 굳이 변수를 만들 필요가 없다.
      double avg = sum/(double)n.length;

 📙 연습 문제 : 메서드 만들기 (1) 

  • 문제
  • 내가 쓴 코드



 🌱 2 교시 

 🌵 메서드를 사용하는 세 번째 목적 

  • 메서드 호출 후 메서드에서 계산된 결과를 호출한 지점에 리턴 받아서 사용하고자 할 때,

  • 리턴값이 존재하는 메서드를 사용하면, 호출된 메서드가 return 명령을 이용하여 호출된 지점으로 결과값 하나를 되돌려 보내서 활용할 수 있다.

  • squar()메서드가 호출되어 실행되면,
    실행된 결과를 squar메서드 내에서 출력하는 게 아니라 결과만 되돌려 받아서 호출된 곳에서 결과를 출력할 수 있다.
    (혹은 다른 연산에 이용할 수도 있다.)

  • max(65,87,12);
    -> 메서드를 호출해서 리턴값을 받았으나 활용하지 않은 상태

  • 리턴 값이 있는 메서드의 호출 시 반드시 리턴값을 받아주는 변수가 있어야 하는 것은 아니다.

  • 다만 리턴이라는 명령을 쓰는 목적은 실행결과를 되돌려 받아 쓰려는 것이므로, 목적에 맞게 사용하는 것이 올바른 사용이라고 할 수 있다.

  • 또한 메서드 실행의 결과(리턴값)는 변수에 저장할 수 있을뿐만 아니라 다음과 같이 다른 메서드 또는 연산의 일부로도 사용할 수도 있다.
    [ 예시 ]
    maxValue = max(65,87,12); 변수에 저장한 경우
    int k = 10+max(65,87,12); 리턴값을 받아서 바로 연산에 적용

  • 메서드가 실행된 결과를 되돌려주는 명령 : return
    그동안 형식적으로 void라고 썼던 곳에 리턴되는 값의 자료형을 써준다.
    그동안 썼던 void는 리턴값이 없다는 뜻으로 썼던 키워드


 📙 연습 문제 : 리턴값이 있는 메서드 만들기 

  • 문제

  • 내가 쓴 답

  • 전달인수와 리턴 값의 자료형이 다르므로 헷갈리거나 바뀌지 않도록 조심할 것!!

  • 연산이 짧으면 연산을 리턴 값에 변수 없이 바로 넣어도 된다.
    예시 : return b*b*3.14;

 이클립스 Tip!!! 

  • 함수를 호출해놓고 아직 안만든 경우 이클립스가 자동완성 해주는 기능이 있다.
  • 나는 내용만 채우면됨 오타 확률 DOWN!!



🌱 3 교시

 📙 연습 문제 : 윤년 계산 메서드 만들기 

  • 문제

  • 나의 답

  • 짧게 줄일 수 있었다. 수정한 부분 ⬇


 🌵 메서드의 사용에 따른 메서드 형태 

  • 메서드 형태
    abc();                - 전달인수 X, 리턴값 X
    abc(10,20);         - 전달인수 2, 리턴값 X
    k = abc();          - 전달인수 X, 리턴값 O
    k = abc(10,20);   - 전달인수 2, 리턴값 O

  • 개발자의 필요에 의해 만들어지는 메서드는 반드시 클래스 안에 정의 되어야 한다.

  • 생성된 메서드들 간에는 자유롭게 서로를 호출하여 사용할 수 있습니다.

  • 그들은 그들을 둘러싼 클래스 속에 있는 멤버들이라고도 부른다.

  • 다만 서로를 자유롭게 호출하는 대상에서 main은 제외 한다.

  • main을 호출한다는 것은 프로그램을 시작한다는 뜻이며,
    개발자에 의해 임의 호출 될 수 없다.

 📙 연습 문제 : 메서드 만들기 (2) 

  • 문제

  • 나의 답

  • 문제점

    1. myInput()에서 sc.close;를 하면 실행 중 에러발생
      (첫 번째만 실행되고 두 번째 호출에서 오류난 듯)
      근데 왜 인지 모르겠고 지우고 그대로 실행하니 실행은 됨

    2. Scanner생성을 main에다가 하니까 또 경고 뜸
      이클립스의 에러창을 읽어보니 myInput메서드에서는 sc라는 참조변수를 받은 적이 없다는 듯했다.
      (Scanner로 생성된 sc에 계속 경고표시가 떠있어서 옮겨보았다.)

    3. 그렇다고 sc.close;만 main메서드 마지막에 써도 안됨.

  • 이클립스 안내(?!) 대로 해본 방법

    1. main에 sc를 만듬

    2. myInput에 sc도 매개변수로 넣어주고 전달도 함

    3. main 마지막에 sc.close();를 넣음
      경고 표시 사라짐 WOW~

  • 이클립스가 안내한 대로 수정해본 코드 ⬆



🌱 4 교시

 📙 연습 문제 : 메서드 만들기 (3) 

  • 문제 : 성적표 출력
    - prnTitle() : 제목을 출력하는 메서드
    - prnScore() : 점수, 총점, 평균을 출력하는 메서드

  • 나의 답

  • main말고 다른 메서드에서 또 다른 메서드를 호출해도 된다.

  • avg메서드에서 sum메서드를 사용해서 연산해도 OK!

 📙 연습 문제 : 참조변수를 전달인수로 ... 

  • 이번 예제는 직접하기 보다는 설명과 코드 작성이 동시에 진행되었음



🌱 5 교시

 🌵 메서드 오버로딩(Overloading) 

  • 메소드의 이름은 같고,
    매개변수의 타입, 개수, 순서가 다르면 서로 다른 메소드로 인지하는 문법

  • 일관된 메소드 이름을 사용하여 사용자에게 직관적인 이름을 사용하게 한다.

  • 전달인수(매개변수)의 자료형, 순서 등이 서로 달라도 가능

  • 계속 사용했던 print()도 오버로딩이었다.
    (참조) Java8 api 페이지 https://docs.oracle.com/javase/8/docs/api/

  • 개수가 다르면 다른 메서드라고 했다.
    그렇다면 1개 2개 3개 짜리를 일일히 작성해야 하나?
    그리고 전달이수의 개수를 모르면?
    이 때 사용하는 것이 있다 => 자료명 ... 매개변수명
  • 위에서 (자료형 … 변수명) ⇒ 몇 개가 들어오는지 모를 때 사용
    BUT 같은 자료형 이어야 함!!!

  • 다른 자료형은 같이 못쓰는가? Nope! 대신 앞에 붙여야 함!!

  • 같은 형인 개수가 정해지지 않은 전달 인수와 다른 자료형의 전달 인수가
    동시에 전달되어야 한다면, 반드시 ... 으로 처리할 데이터들 보다 왼쪽에 전달되게 위치시켜야 한다.
    (... 뒤에 넣으면 ...이 언제 끝날지 모르니까 안됨)



🌱 6 교시

 📙 연습 문제 : 메서드 만들기 (4) 

  • 문제

  • 내가 쓴 답

  • 이 문제에서 내가 계속 큰 실수를 하고 있었다는 사실을 알았다.

  • String끼리 같은 지 확인할 땐 .equals()를 써야 하는데 그냥 바로 == 연산자를 사용. (JS에서 습관이 되어버린듯)

  • 그런데 지금까지 잘 실행이 되어왔다.
    아마 이클립스의 내 프로젝트가 SE-17버전인 상태라서 그런 듯함

  • 그러나 일할 때에는 8을 가장 많이 쓴다고 하고 수업고 8버전이 기준이므로 .equals()를 사용하는 습관을 들여야겠다.



🌱 7, 8 교시

 📙 연습 문제 : 성적표 (입력받기 + 2차원 배열 + 출력) 

  • 문제풀기부터 해설까지 2시간 넘게 걸린 문제

  • 문제에서 Scanner의 위치와 sc를 매개변수로 추가한 것은 내가 추가, 수정해본 것이다. 아래에 관련 설명 있음

  • 나의 답

  • 위의 코드도 실행은 되었지만 고쳐야할 부분이 더 있어서 수정했다.

  • Scanner 변수를 전역변수로 만들지 않으면 각자 필요한 메서드마다 새로 선언하고 사용해야 한다.

 Call By Reference 

  • 호출 당시 전달된 배열의 주소가 매개변수에 저장되어져 사용된다.

  • 이는 호출한 곳에서 사용하고 있는 배열을 직접 제어할 권한을 얻은 것이나 마찬가지이다.

  • 따라서 input()메서드의 s[i][j]에 값을 넣는 것은 main의 scores[i][j]에 값을 넣는 것과 같다.

 전역변수 

  • Scanner sc = new Scanner(System.in);main() 밖에 선언하고 써도 된다. 대신 static을 앞에 붙여 줘야 함
    (전역변수로 만들어서 사용)
  • static Scanner sc = new Scanner(System.in);
  • 이에 관련된 내용은 뒤에 배울 예정

 고칠 점 

  • 코드 블럭에도 메모했듯이 각 학생의 과목별 점수를 입력 받는 for문에서 불필요한 변수를 사용한 부분을 줄일 수 있는 방법이 있었다.

 최종 코드 

 메서드 추가 

  • 만약 이차원배열에 크기를 선언해주는 메서드를 따로 만든다면?

    • main 수정

    • 새 메서드 memoryAllocation(); 작성



🎵 마무리

  • 마지막 문제는 시간도 오래 걸리고 복잡해서 문제 푸는데 오래걸렸다.
  • 그래도 스스로 정상실행되는 코드를 만들어서 좀 뿌듯했다.
  • 다음 시간은 2주차 평가가 있으니 주말에도 교재 필기 정리를 해서 시험에 대비해한다.
  • 이번 주말도 공부로 바쁘게 보내야 할 것 같다.



profile
제가 공부하고 공유하고 싶은 글을 올리고 있습니다.

0개의 댓글