🦁멋쟁이 사자처럼 15기/3월달 수업 내용 정리

멋쟁이 사자처럼 8회차 ( 03 / 07 )

코딩하는 하마 2025. 3. 7. 17:05

 

 

[학습목표]

1. if else switch 문을 활용하여 조건을 평가하고 프로그램의 흐름을 제어할 수 있다.

2. 비교 연산( > , < . == , !=) 와 논리 연산(&&, || , !)을 조합하여 복잡한 조건식을 구성할 수 있다.

3. 반복문 (for, while, do-while) 을 이해하고 상황에 맞게 활용할 수 있다.

    - for 루프를 사용하여 정해진 횟수만큼 반복되는 로직을 구현할 수 있다.

    - while 루프를 활용하여 특정 조건이 충족될 때까지 반복되는 코드를 작성할 수 있다.

    - do while 루프를 이용하여 코드를 최소 한 번 실행한 후 , 조건을 확인하여 반복을 결정하는 구조를 익힌다.

4. switch 문을 활용하여 다중 분기 구조를 이해하고 활용할 수 있다.

5. 중첩 조건문을 활용하여 복잡한 조건을 효율적으로 처리할 수 있다.

 

 


 

 

if 문

조건문은 프로그램이 특정 조건을 만족할 경우에만 특정 코드 블록을 실행하는 구조를 제공한다.

 

[선언형식]

if (boolean expression) {
    statement;
} else if (boolean expression) {
    statement;
} else {
    statement;
}

 

ex)

package com.sec04.exam;

public class d_ifTest {
	
	// 1. 여러 조건을 조합한 경우
	public static void checkPassOrFail(int score, boolean isPassed) {
		// score이 80 이상이고 홀수인 경우
		if (score >= 80 && isPassed && score % 2 != 0) {
			System.out.println("우수한 성적으로 합격했습니다.");
		} else {
			System.out.println("조건을 충족하지 못했습니다.");
		}
	}

	// 2. 범위와 논리 연산자를 조합한 경우
	public static void checkEligibility(int age, String country) {
		
		// age가 18세 이상 30세 이하이고 "Korea"인 경우는 조건을 충족한다라고 출력하자
		// .equals() : 
		if ((age >= 18 && age <= 30) || country.equals("Korea")) {
			System.out.println("조건을 충족합니다.");
		} else {
			System.out.println("조건을 충족하지 않습니다.");
		}
	}

	// 3. 객체 유형과 조건을 조합한 경우
	public static void checkStringLength(Object obj) { // 가장 상위 부모 타입을 선언하게 되면 모든 class 객체는 대입된다.
		
		//instanceof : 객체의 type을 확인하는 연산자
		//obj가 String 클래스의 인스턴스이고 , 문자열의 길이가 5보다 큰 경우 메세지 출력
		// String -> Object -> (String) obj (String.length())
		if (obj instanceof String && ((String) obj).length() > 5) {
			System.out.println("길이가 5보다 큰 문자열입니다.");
		} else {
			System.out.println("조건을 충족하지 않습니다.");
		}
	}

	// 4. 삼항 연산자와 조합한 경우
	public static void checkEvenPositive(int num) {
		
		//삼항연산자 : 조건식 ? true 명령 : false 명령;
		//num이 2의 배수인 경우 'true' 출력 , 아닌 경우 false 출력
		boolean isEven = (num % 2 == 0) ? true : false; 
		
		//num이 0보다 크면 "양수" 출력 , 아니면 "음수 또는 0" 출력
		String result = (num > 0) ? "양수" : "음수 또는 0";

		//isEven이 true이고 result의 결과가 "양수"dlaus 메세지 출력
		if (isEven && result.equals("양수")) {
			System.out.println("짝수 양수입니다.");
		} else {
			System.out.println("조건을 충족하지 않습니다.");
		}
	}

	public static void main(String[] args) {
		// 1. 여러 조건을 조합한 경우
		checkPassOrFail(85, true);
		checkPassOrFail(75, false);

		// 2. 범위와 논리 연산자를 조합한 경우
		checkEligibility(25, "USA");
		checkEligibility(35, "Korea");
		checkEligibility(17, "Japan");

		// 3. 객체 유형과 조건을 조합한 경우
		checkStringLength("HelloWorld");
		checkStringLength(123);

		// 4. 삼항 연산자와 조합한 경우
		checkEvenPositive(10);
		checkEvenPositive(-5);
	}

}

 

if문을 활용한 예제로 여러 메소드들을 만들어 호출하는 클래스를 만들어보았다. 

if ((age >= 18 && age <= 30) || country.equals("Korea"))  

여기서 '==' 대신 equals()를 사용한 것을 볼 수 있다.

' =='는 값이 아닌 주소값을 비교한다

값이 같은지 비교하고 싶다면 .equals()를 사용하면 된다.

equals()는 객체의 값을 비교하는 재정의 메소드이다.

 

 

그림판으로 그림을 그려 보았다. 

m == m1 일 경우에는 주소값으로 비교하게 되어 &100 과 &200으로 다름을 확인할 수 있다.

m.equals(m1)일 경우에는 그 주소 안에 들어있는 값인 100을 비교하므로 같음을 확인할 수 있다. 

 

public static void checkStringLength(Object obj) {
		if (obj instanceof String && ((String) obj).length() > 5) {
			System.out.println("길이가 5보다 큰 문자열입니다.");
		} else {
			System.out.println("조건을 충족하지 않습니다.");
		}
	}

 

 

이 부분에서 Object obj를 확인할 수 있다.

이는 가장 상위 부모 타입을 선언하여 모든 class들이 대입될 수 있도록 한다.

instanceof 는 객체의 type을 확인하는 연산자이다. 

 

do ~ while 문 

do ~ while 문의 경우 무조건 명령을 한 번 수행한 다음 반복의 조건을 만난다.

이를 사용하는 경우는 예약 시스템으로 볼 수 있다.

 

[선언형식]

do {
    statement;
} while (condition);
```

 

ex)

public class DoTest {
	public static void main(String[] args) {

		int i = 1;
		do {
			System.out.println(i);
			i++;
		} while (i >= 3);
	}
}

 

for 문

[선언 형식]

for (initialization; condition; update) {
    statement;
}

 

initialization : 초기값을 여러개 선언할 수 있고 , 비워둘 수 도 있다.

condition : 조건식은 여러개 가능하나 결과가 true , false 로 리턴되어야 한다.

update : 루프 변수(제어 변수 , 조건 변수)에 해당하는 변수값을 증가 , 증감한다.

 

ex) 

public class ForTest03 {
	public static void main(String[] args) {
		
	        for(int i=1; i<=2; i++) {
	            for(int j=1; j<=3; j++) {
	                System.out.println("i="+i +"  j="+j);
	            }
	            System.out.println();
	        }
	}
}

 

위 코드의 실행을 그림으로 살펴보면 아래와 같다. 

 

여기서 i는 행을 의미하고 j는 열을 의미함을 알 수 있다.

 

+) 제네릭 타입 for문 출력 형태 

for ( int res  : ar) {
	System.out.println(res);
}

 

break 문 , continue 문 , return 문

1) break 문 

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println(i);
}

 

위 코드를 보면  for문으로 1부터 10까지 가다가 5를 만날 경우 동작을 멈추고 빠져나온다.

 

2) continue 문

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) { // 짝수일 경우 루프 진행 , 홀수 일 경우 출력
        continue;
    }
    System.out.println(i);
}

 

위 코드를 보면 1부터 10까지 가는데 2로 나누었을 경우 나머지가 0이면 루프를 진행하고 그렇지 않은 경우는 출력하는 동작을 한다. 즉 짝수일 경우는 루프 진행하고 홀수일 경우는 출력하는 코드이다.

 

3) return 문

public class ReturnTest {
    public static void main(String[] args) {
        printMessage();
    }
    public static void printMessage() {
        System.out.println("Hello, World!");
        return;
    }
}

 

return 문은 실행중인 코드를 중단하고 호출한 곳으로 돌아간다. 

위 메소드에서 반환형이 void인 경우는 return이 필요 없지만 그렇지 않은 경우는 return을 써야 한다.

 

 

 


 

switch 문

기존의 `switch` 문에서는 정수형 (`int`)이나 열거형 (`enum`)만 사용할 수 있지만, JDK 21부터는 객체 타입과 `when` 조건을 함께 활용할 수 있다.

 

[선언 형식]

switch (expression) {
    case Type1 variable -> statement;
    case Type2 variable -> statement;
    case Type3 variable when condition -> statement;
    default -> statement;
}

 

ex)

package com.sec04;
import java.util.Scanner;

public class SwitchTest01 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = 0, b = 0;
		char op = '\0';
		System.out.print(" 두수 와 연산자를 입력(+,-,*,/) : ");
		a = sc.nextInt();
		b = sc.nextInt();
		op = sc.next().charAt(0);

		switch (op) {
			case '+' :
				System.out.println(a + " + " + b + " = " + (a + b));
				break;
			case '-' :
				System.out.println(a + " - " + b + " = " + (a - b));
				break;
			case '*' :
				System.out.println(a + " * " + b + " = " + (a * b));
				break;
			case '/' :
				System.out.println(a + " / " + b + " = " + (double) a / b);
				break;
			default :
				System.out.println("연산자 error");
		}// switch end
	}// main end
}// SwticTest01 end

 

switch 문의 변수 -> char , short , int, String 까지 받을 수 있다. 

 

+)

ex)

Object obj = "null"; //type들을 선택해서 쓸 수 있음 
	        switch (obj) {
	        case Double d -> System.out.println("실수 : "+d);
	            case Integer i when i > 10 -> System.out.println("10보다 큰 정수: " + i);
	            case String s -> System.out.println("문자열: " + s);
	            case Integer i -> System.out.println("정수: " + i);
	            case null -> System.out.println("Null 값이 입력되었습니다.");
	            default -> System.out.println("기타 값: " + obj);
	        }

1) ': break;' 를 -> 화살표 레이블로 대체할 수 있다.

2) 표현식을 간략하게 지정할 수 있다.

3) when 문 사용할 수 있다. 

4) null을 사용할 수 있다.

 


 

배열 

1) 배열의 개념

- 동일한 자료형의 데이터를 하나의 이름으로 관리하는 데이터 객체(data object)이다.

- 배열은 같은 종류의 데이터를 여러 개 선언하는 대신 하나의 변수로 나열형 상수를 인덱스를 통해 관리한다.

- 기본 데이터형과 참조형 객체 배열을 포함하여 모든 자료형에서 사용 가능하다.

- 배열은 선언과 동시에 주소를 할당받아 (바인딩됨) 요소로 관리되며 연속된 메모리 공간을 차지한다.

 

2) 배열 선언과 생성

참조 변수 선언 -> 배열 생성 -> 초기화의 단계를 거쳐 사용된다

 

[선언 방식 ]

1) int[] arr;

2) int arr[];

3) var arVar = new int[] {10,20,30}; // 자바 10 이상

 

- new 연산자 사용하여 배열 생성

ar = new int[5];  //5개의 정수를 동적할다아 배열로 메모리 생성한 후 시작주소 리턴 = 기본값으로 초기화

 

- 배열 선언 및 초기화 

int[] ar = {10, 20, 30, 40, 50};  //나열형 상수로 배열의 메모리 확보 후 시작 주소 리턴

 

- 그 외

int[] ar = new int []{10,20,30,40,50}; // 나열형 상수로 배열의 동적할당 후 시작 주소 리턴 = 나열된 값으로 초기화

 

ex)

package com.sec05;

public class a_array {

	public static void main(String[] args) {
		Test();
		 
	}

	private static void Test() {
		// TODO Auto-generated method stub
		// 1) 배열 선언 생성 출력 확인 
		//   나열형 값을 선언과 동시에 대입했다. , 동적 할당 x
		int[] ar = {10, 20, 30, 40, 50};
		int ar02[] = {10, 20, 30, 40, 50};
		
		System.out.println("===== case 01 ar 출력 ======");
		System.out.println(ar[0]);
		System.out.println(ar[1]);
		System.out.println(ar[2]);
		System.out.println(ar[3]);
		System.out.println(ar[4]);
		System.out.println();
		
		System.out.println("===== case 02 반복 for문 출력 ======");
		for (int i =0;i <5;i++) {
			System.out.println(ar[i]);
		}

		System.out.println("===== case 03 제네릭 타입 for문 출력 = for ~each 루프 출력 ======");
		for ( int res  : ar) {
			System.out.println(res);
		}
		
		System.out.println("===== case 04 제네리 ======");
		for ( int res  : ar) {
			System.out.println(res);
		}
	}

}