JAVA 문법종합반 2주차

SJ.CHO·2024년 9월 3일

연산자

  • 비교연산자는 두 연산자의 타입이 다를경우 더 큰타입으로 타입을 통일시킴

  • 비교연산은 주소값을 비교하기에 참조형의 경우 .equals()메서드 사용
    (비교연산부분 참조)

  • 증감연산자는 항상 순서에 주위하여 계산해야함.

  • 삼항 연산자

    • 결과에 따라 직접 응답할 값을 지정하는 연산자.
    • (조건) ? (참) : (거짓)
int x = 1;
int y = 9;
boolean b = (x == y) ? true : false;
System.out.println(b); // false
  • instance of 연산자
    • 피연산자가 조건에 명시괸 클래스의 객체인지 bool값을 리턴
    • 상속받은 객체 또한 해당 클래스 객체로 인식
    • 객체명 instance of (클래스명)
  • bit 연산자
    • 2진수를 기준으로 방향을 정해 이동
    • << = 2의배수로 곱셈, >> = 2의배수로 나눗셈

조건문

IF연산자

  • if(조건식) {연산}
// 조건문
boolean flag = true;

if (flag) {
	System.out.println("flag 값은 true 입니다."); // flag 값은 true 입니다. 출력
}
  • if(조건식){연산} else{연산}
    • if가 거짓일경우 else의 연산수행
// 조건문 with else
boolean flag = false;

if (flag) {
	System.out.println("flag 값은 true 입니다."); // 미출력
} else {
	System.out.println("flag 값은 false 입니다."); // flag 값은 false 입니다. 출력
}
  • if(조건){연산} else if(조건식){연산}
    • if문이 거짓이면서 다른조건으로 다시 체크해서 연산할 때
// 조건문 with else if
int number = 2;

if (number == 1) {
	System.out.println("number 값은 1 입니다."); // 미출력
} else if (number == 2) {
	System.out.println("number 값은 2 입니다."); // number 값은 2 입니다. 출력
} else {
	System.out.println("number 값은 모르는 값입니다."); // 미출력
}
  • 중첩 if도 가능.

switch / case 연산자

  • switch(피연산자) { case(조건): (연산) } 이러한 형태로 쓰임
  • switch 피연산자case 조건을 만족하면 case: 뒤에 명시되어 있는 연산을 수행.
  • break 문이 없을경우 하향식으로 계속 실행됌.
// switch/case 문 

int month = 8;
String monthString = "";
switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";
             break;
    case 4:  monthString = "4월";
             break;
    case 5:  monthString = "5월";
             break;
    case 6:  monthString = "6월";
             break;
    case 7:  monthString = "7월";
             break;
    case 8:  monthString = "8월"; 
             break;
    case 9:  monthString = "9월";
             break;
    case 10: monthString = "10월";
             break;
    case 11: monthString = "11월";
             break;
    case 12: monthString = "12월";
             break;
    default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

차이점

  • if문은 복합조건을 통해 여러 조건을 걸수 있다. switch는 불가능.
  • if문은 분기별로 동일조건에 대해 코드가 중복된다. switch는 적음.

반복문

  • 조건을 잘못 걸면 무한반복에 빠짐. (다른행동을 하지 못함.)

for문

  • for(초기값; 조건문; 증감연산;){연산}
for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
    System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}

향상된 for문

  • for(변수타입 변수명 : 목록변수(배열 등)){연산}
// 향상된 for 문

int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
    System.out.print(number + " "); 
}

// 출력
3 6 9 12 15

while, do-while 문

  • 초기값없이 조건문으로만 반복
  • while(조건문){연산}
    • 반복할때마다 조건문을 확인후 반복
// while 문

int number = 0;
while(number < 3) {
		number++;
    System.out.println(number + "출력"); 
}

// 출력
1출력
2출력
3출력
  • do{연산} while(조건문)
    • 최초1회는 조건에상관없이 실행하고 조건을 검사.
// do-while 문

int number = 4;
do {
    System.out.println(number + "출력"); 
} while(number < 3); // 연산을 한번 수행 후 조건문 체크

// 출력
4출력

break;

  • 가장가까운 블록의 반복문, 또는 조건문을 중단시키는 역할.
// break 명령

int number = 0;
while(number < 3) {
		number++;
		if (number == 2) {
			break;  // 2일때 반복 중단
		}
    System.out.println(number + "출력"); 
}

// 출력
1출력

continue;

  • 반복문 중 해당 순서를 패스하고 싶을떄.(다음 반복문으로 넘어감)
  • 전체를 중단하냐, 현재단계를 중단하냐의 차이
// continue 명령

int number = 0;
while(number < 3) {
		number++;
		if (number == 2) {
			continue;  // 2일때 반복 패스
		}
    System.out.println(number + "출력"); 
}

// 출력
1출력
3출력

배열[]

  • 한번에 많은양의 데이터를 다루거나 계산할때 사용.
// 배열 생성

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}
		
//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.
int[] intArray2;
intArray2 = new int[3]; // 초기값 {0,0,0}

//배열에 특정값 대입하며 선언
int[] intArray = {1, 2, 3, 4, 5};
String[] stringArray = {"a", "b", "c", "d"};
  • 배열의 모든값으로 대입
배열의 주소를 모두 같은값으로 초기화
Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화

깊은복사 vs 얕은복사

  • 깊은복사 : 실제 값(복사할 값)을 새로운 메모리영역에 복사 /
    원본값이 변경되지않음.

  • 얕은복사 : 주소값을 복사하여 값을 공유사용. / 원본값이 변경됌.

Call by Value, Call by Reference

  • Call by Value : 메서드를 호출할 때 값을 넘겨주며 파라미터를 '복사된 값'을 넘겨주기 때문에 서로 다른변수
    원본에 영향을 주지않음.
  • Call by Reference : 참조주소를 직접 넘겨주며 파라미터와 완전동일한 변수, 원본에 영향을 준다
  • JAVA는 오직 Call by Value로만 적용이 된다.
  • 원시 타입의 전달은 값만 전달하는 Call by Value 로 동작. / 같은 이름의 변수로 개별의 주소의 저장된다.
  • 참조 타입의 경우 같은 참조값을 공유하기에 객체가 새로생성되는게아닌 참조에 의한 호출이라면 원래객체에도 영향을 준다.

참조 : https://bcp0109.tistory.com/360

다차원 배열

  • 행렬과 비슷하게 x,y의 형태로 만들어짐.

// 중괄호를 사용해 초기화

int[][] array = {
	{1, 2, 3},
	{4, 5, 6}
};

가변배열

  • Jaba에서는 2차원배열 생성시 열의 길이를 생량하여 행마다 다른길이로 지정이 가능하다.
// 가변 배열

// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}

};

숙제

답안 :

package week02;

import java.util.*;

public class W01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String collect = sc.nextLine();
        String recipe = "";
        String foodname = "";
        int cnt = 0;
        ArrayList<String> arr = new ArrayList<>();
        Set<String> set = new LinkedHashSet<>();
        Map<Integer, String> map = new HashMap<>();
        foodname = sc.nextLine();
        switch (collect) {
            case "List":
                while (true) {
                    recipe = sc.nextLine();
                    if (recipe.equals("끝")) {
                        break;
                    } else {
                        arr.add(recipe);
                    }
                }
                System.out.println("[ " + collect + " 로 저장된 " + foodname + " ]");
                for (String reciperead : arr) {
                    System.out.println(++cnt + ". " + reciperead);

                }
                break;
            case "Set":
                while (true) {
                    recipe = sc.nextLine();
                    if (recipe.equals("끝")) {
                        break;
                    } else {
                        set.add(recipe);
                    }
                }
                System.out.println("[ " + collect + " 로 저장된 " + foodname + " ]");
                Iterator<String> it = set.iterator();
                for (int i = 0; i < set.size(); i++) {
                    System.out.println(i + 1 + ". " + it.next());
                }
                break;

            case "Map":
                while (true) {
                    recipe = sc.nextLine();
                    if (recipe.equals("끝")) {
                        break;
                    } else {
                        map.put(cnt++, recipe);
                    }
                }
                System.out.println("[ " + collect + " 로 저장된 " + foodname + " ]");
                for (int i = 0; i < map.size(); i++) {
                    System.out.println(i + 1 + ". " + map.get(i));
                }
                break;

        }
    }
}
profile
70살까지 개발하고싶은 개발자

0개의 댓글