Java,Spring

[자바 기초 문법] 제어문과 메서드

뀨린 2021. 5. 13. 01:39

제어문이란? 실행문의 수행 순서를 변경해 프로그램의 실행 흐름을 바꾸는데 활용한다. 

 

제어문의 종류

 

  • 조건문: 조건에 따라 실행문을 선택할 때 사용. if, if-else, 다중 if문, switch-case...
  • 반복문
  • 분기문

중첩 if 문: if-else문과 혼합하여 사용할 시 혼동을 피하기 위해 중괄호로 명확하게 구분한다!

 

다중 if문과 중첩 if문 예시

 

다중 if문

package sec02;

import java.util.Scanner;

public class MultiIfDemo{
    public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    String grade;
    System.out.print("점수를 입력하세요: ");
    int score = in.nextInt();
    
    if (score >= 90)
       grade = "A";
    else if (score >= 80)
       grade = "B";
    else if (score >= 70)
       grade = "C";
    else 
       grade = "F";
    
    System.out.println("당신의 학점은" + grade);
    }

}

 

중첩 if문

package sec02;

import java.util.Scanner;

public class MultiIfDemo{
    public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    String grade;
    System.out.print("점수를 입력하세요: ");
    int score = in.nextInt();
    
    package sec02;

import java.util.Scanner;

public class MultiIfDemo{
    public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    String grade;
    System.out.print("점수를 입력하세요: ");
    int score = in.nextInt();
    
    if (score >= 90)
       grade = "A";
    
    else { 
        if (score >= 80)
        grade = "B";
    
    else { 
        if (score >= 70)
       grade = "C";
    else 
       grade = "F";
    
    System.out.println("당신의 학점은" + grade);
    }

}
    }

}

 

switch 문: 여러 경로 중 하나를 선택할 때 사용한다. 기존 switch문은 낙하 방식으로 콜론 case 레이블을 이용한다. 

 

  콜론 레이블을 사용하는 switch 문

 

0개 이상의 case 절과 0이나 1개의 default절로 구성한다. 

switch 변수로 문자열과 열거 타입도 사용 가능하다. 

 

switch(변수) {

 

    case 상수1 : 0개 이상의 실행문 

case 레이블이다.                      break문과 같은 실행문이 없으면 계속해서 다음 case 레이블에 있는 실행문을 수행함. 

 

....

 

default : 0개 이상의 실행문 

선택사항

}

 

개선된 switch 문

 

String Kind = switch (bio) {

case "호랑이", "사자":
    yield "포유류";

case "독수리", "참새":
    yield "조류";

case "고등어", "연어":
    yield "어류";
    
default:
	System.out.print("어이쿠! ");
    yield "...";

};

 

주의사항: 가능한 모든 값에 대해 일치하는 case 레이블 없으면 오류 발생

다음 코드에서 변수 n의 모든 가능한 값은 정수이므로 오류 발생

 

static String howMany(int n){

    return switch(n){   //break 없으면 계속 진행
    
    case 1 -> "1개";
    case 2 -> "2개";
    
    
    }; //default 문은 선택사항

}

 

반복문 : while, do-while, for

 

 while vs for? 

 

 while 문은 특정 조건을 잘 알 때, for 문은 반복횟수를 알 때!

 

 while은 종이 한 쪽을 다 채울 때까지 반복해 쓰기, for은 100번 반복해 쓰기

 

   while 문

조건에 따라 무한 루프가 발생가능하며, 조건식이 거짓이면 본체를 한번도 실행하지 않는다. 

 

 

while (조건식) {

 반복 실행문들; // 본체를 탈출할 실행문이 필요. 

}

 

   do-while 문

 

while문과 차이: 조건식이 거짓이어도, 1번은 실행한다. 

 

do{

      반복 실행문들; //본체

 

} while {조건식}; //조건식이 거짓이라도 한번은 본체를 실행한다. 

 

 

   for 문

 

for (초기식; 조건식; 증감식){

    반복 실행문(들); // 본체

}

 

분기문

  break문

 

반복문 내에서 실행흐름을 변경하고자 할 때

 

out: while () {
    while () {
    
    break out;
    
    }


}

 

👉 레이블이 표시된 반복문 종료

 

   continue 문

 

반복문 내에서 실행흐름을 변경하고자 할 때

 

while (조건식) {

   continue;

}

 

do{

    continue;

 

 

} while(조건식);

 

메서드란? 

 

클래스 내부에 정의된 함수

코드를 모듈화하여 가독성을 높임

 

public class Hello { 

////////////메서드 여기부터!
public static void main (String[] args){ //void는 메서드를 실행한 후 반환 값이 없음을 의미//String[]는 메서드의 매개변수 타입과 매개변수

  System.out.println("안녕!"); //실행문
  
  }


}

 

메서드의 구조

 

 

메서드의 호출과 반환

 

메서드를 호출하면 제어가 호출된 메서드로 넘어갔다가 호출된 메서드의 실행을 마친 후 호출한 메서드로 실행 흐름이 돌아온다. return문을 사용하면 메서드의 실행 도중에도 호출한 메서드로 제어를 넘길 수 있다!

 

 

함수 호출 방식 두가지: call by value & call by reference

 

Call by value: 매개변수 값이 다른 변수에 복사되어, 복사된 객체가 함수인자로 전달

 

package sec06;

public class IncrementDemo{
   public static void main(String[] args){
   
   int x = 0;
   System.out.println("increment() 메서드를 호출하기 전의 x는" + x);
   increment(x);
   System.out.println("increment() 메서드를 호출한 후의 x는") + x);
   
   }
   
   public static void increment(int n){
       System.out.println("increment() 메서드를 시작할 때의 n은" + n);
       n++;
       System.out.println("increment() 메서드가 끝날 때의 n은" + n);
   
   
   }


}

//output: increment() 메서드를 호출하기 전의 x는 0
//increment() 메서드를 호출하기 전의 n는 0
//increment() 메서드가 끝날 때의 n는 1
//increment() 메서드를 호출한 후의 x는 0

 

 

Call by reference: 실제 메모리상의 매개변수가 함수의 인자로 활용된다. C언어의 포인터 개념과 같다. 참조에 따라 매개변수가 함수인자로! 

 

자바는 callby value 방식으로 인자값을 받는다. 

 

메서드 오버로딩

 

public class OverloadDemo{
    public static void main(String[] args){
    
    int i1 = 3, i2 = 7, i3 = 10;
    double d1 = 7.0, d2 = 3.0;
    
    System.out.printf("max(%d, %d) = %d/n", i1, i2, max(i1, i2));
    System.out.printf("max(%1f, %1f) = %d/n", d1, d2, max(d1, d2));
    System.out.printf("max(%d, %d, %d) = %d/n", i1, i2,i3, max(i1, i2, i3));
    }
    
    public static int max(int n1, int n2){
    
       int result = n1 > n2 ? n1 : n2;
       return result;
    }

    public static double max(double n1, double n2){
    
    double result = n1 > n2 ? n1: n2;
    return result;
    }
    
    public static int max(int n1, int n2, int n3){
       return max(max(n1,n2), n3);    
    }
}

 

메서드 시그니처: 메서드 이름, 매개변수의 개수, 매개변수의 타입과 순서를 의미한다. 

 

메서드 이름은 같지만 메서드 시그니처가 다른 메서드를 정의하는 것을 메서드 오버로딩이라고 한다. 오버로딩 덕분에, 같은 동작을 하는 다양한 함수의 이름들을 구분하여 정의할 필요가 없다. 

 

class Cat{

public void Sound(){
   System.out.println("meow");
}

//overloading method

public void Sound(int num){
   for(int i=0; i<2; i++){
      System.out.println("meow");
   
   }
}
}

 

가능한 메서드 오버로딩 예시

 

  • Parameter 개수 차이
  • Parameter 데이터 타입 종류의 차이
  • Parameter 데이터 타입 순서의 차이

연산자 오버로딩

 

  • 하나의 연산자를 다양한 타입에 대해 가능하게 해주는 원리이다. 
  • 사용자 정의 연산자 오버로딩 또한 가능하다 (e.g. 시간에 대한 덧셈 등)

 

참조:

쉽게 배우는 자바 프로그래밍 2판, 한빛아카데미, 우종정, 2020.

 

Call by value and Call by references in C, https://www.javatpoint.com/call-by-value-and-call-by=references-in-c 

 

Tutorials - Javatpoint

Tutorials, Free Online Tutorials, Javatpoint provides tutorials and interview questions of all technology like java tutorial, android, java frameworks, javascript, ajax, core java, sql, python, php, c language etc. for beginners and professionals.

www.javatpoint.com