2023.05.26.금.TIL

heeh·2023년 5월 26일

TIL

목록 보기
10/82
post-thumbnail

2-7 switch

  • switch는 if와 동일한 역할을 수행하지만 훨씬 가독성이 좋음
  • 모든 조건들을 한 줄 한 줄로 나열하여 무슨 조건에는 어떤 역할을 한다가 한 눈에 보임

문법 설명

  • switch 안에 어떠한 연산을 하게 될 조건/변수를 넣는다
  • 피연산자가 들어가고 각 case마다 case가 들어가고 각각 연산이 들어가는 형태
  • case는 if else if else 처럼 여러 개 설정 가능
  • case 연산문에는 break를 꼭 넣어야 함 → braek가 없으면 밑으로 계속 흐름
  • case 조건들이 모두 만족 하지 않았을 때, if의 else와 비슷한 default

switch 예제 w14

  • 코드 세팅

    public class w14 {
        public static void main(String[] args) {
            int month = 8;
            String monthString = "";
    
            //switch문
            switch (피연산자 month) {
                //case~~~ 연산
            }
        }
    }
  • case 1: 은 month가 1이냐고 물어보는 것 → X month = 8

    • switch, 하나하나 변경해 가면서 비교를 한다

      switch (month) {
                  //case~~~ 연산
                  case 1:
              }
  • case가 1일 때는 monthString을 1월로 지정

    						case 1:
                    monthString = "1";
                    break;
    • break;를 꼭 써야 monthString을 1월로 세팅하고 switch문이 중괄호를 바깥으로 빠져 나오는 것을 막음 / 밑으로 흐르는 것을 막음
  • 줄 맞춤도 필수

    						case 1:
                    monthString = "1";
                    break;
                case 2:
                    monthString = "2";
                    break;
  • 아무것도 없는 경우

    • if문으로 치면 else → switch문에서 default

    • default도 case와 같이 :(콜론)으로 막아줌

      						default:
                      monthString = "알 수 없음";
  • 완성 코드

    public class w14 {
        public static void main(String[] args) {
            int month = 8;
            String monthString = "";
    
            //switch문
            switch (month) {
                //case~~~ 연산
                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);
        }
    }

    • month의 값을 8로 설정했기 때문에 8월 결과가 나옴

if문과 switch문 같은점

  • if문과 switch문은 역할이 동일하다고 할 수 있다
  • 모두 조건문을 구현하는 문맥

if문과 switch문 차이점

  • 복합조건이 다르다
    • if문은 복합조건을 지원한다
      • 복합조건 : 괄호 안에 조건 여러 개를 넣으면서 수행문을 수행 할 수 있음
    • switch문은 피연산자 한 개에 대한 조건만 지원한다
  • 코드 중복
    • if문은 코드 중복이 상당히 많다
    • switch문은 코드 중복이 적다
  • if문과 switch문의 가독성 비교
    // if vs switch
    // switch 문 실습코드를 if 문으로 바꿔보겠습니다.
    
    // switch 
    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 로 변환
    if (month == 1) {
    	monthString = "1월";
    } else if (month == 2) {
    	monthString = "2월";
    } else if (month == 3) {
    	monthString = "3월";
    } else if (month == 4) {
    	monthString = "4월";
    } else if (month == 5) {
    	monthString = "5월";
    } else if (month == 6) {
    	monthString = "6월";
    } else if (month == 7) {
    	monthString = "7월";
    } else if (month == 8) {
    	monthString = "8월";
    } else if (month == 9) {
    	monthString = "9월";
    } else if (month == 10) {
    	monthString = "10월";
    } else if (month == 11) {
    	monthString = "11월";
    } else if (month == 12) {
    	monthString = "12월";
    } else {
    	monthString = "알수 없음";
    }
    System.out.println(monthString); // 8월 출력

2-8 for

반복문

  • 특정 조건에 따라 연산을 반복하는 것
    • 반복 : 끊지 않을 때 까지 계속해서, 영원히 수행 될 수 있음(무한루프)
  • 대표적으로 for문, while문, do-while문

for문

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

for문 예제 w15

  • for문은 3가지의 분할된 표현들이 나와야 함 → 세미콜론 ; 으로 구분됨

    • 맨 앞 자리 : 초기값, 초기값을 선언하고 할당하는 형태로 나타남(정수형)
    • 가운데 자리 : 조건문, 언제까지 반복할 것인지 명시를 해줘야 수행하고 멈춤
    • 마지막 자리 : 증가 연산, for문 안에 들어 있는 로직을 한 번 수행하고 나면 초기값을 바꿔주는 명령 값
      ex) 변수++ = 1씩 증가
  • for문 예제 코드 해석

    for (int i = 0; i < 4; i++) {
                System.out.println(i + " 번재 출력!");
            }

    • for (int i = 0; i < 4; i++)
      • int i = 0; : 초기값
        → int i는 0이다
      • i < 4; : 조건문
        → i가 4가 되기 전까지 해라(0부터 4보다 작은 수까지)
      • i++
        → i는 1씩 증가
    • 조건문으로 인해 i는 4가 되기 전까지(4보다 작은 수까지) 0에서 부터 1씩 증가한다

향상된 for문

  • 기존 for문을 고도화 시킴
  • 기존 : for문 안에 3개의 표현이 들어감 → (초기값 ; 조건문 ; 증가연산)
  • 향상 : for문 안에 2개의 표현이 들어감

향상된 for문 예제

  • 잠깐 배우는 배열 (심화는 나중에)

    • int[]
      • 대괄호로 묶어주면 int로 이루어진 배열이라는 뜻
    • int[] numbers = {3, 6, 9, 12, 15};
      • 3, 6, 9, 12, 15로 이루어진 숫자 배열이라는 뜻
  • 향상된 for문 코드 해석

    int[] numbers = {3, 6, 9, 12, 15};
            for (int number: numbers) {
                System.out.print(number + " ");
            }
    • numbers 배열이 하나 하나씩 빙글빙글 돌면서 for문 안 int number에서 1개 씩 쓰임
      - 첫 번째 돌 때 3, 두 번째 6, 세 번째 9, 네 번째 12, 다섯 번째 15

    • number에 하나씩 3, 6, 9, 12, 15가 for문 안에서 하나하나씩 할당 된다는 뜻

  • 실무에서 일반적인 for문을 쓰는 곳이 많음

향상된 for문을 for문으로 구현

int[] numbers = {3, 6, 9, 12, 15};
        for (int i=0; i < numbers.length; i++) {
            System.out.print(numbers[i]);
        }
  • i < numbers.length 는 5를 리턴
  • System.out.println(numbers[i]);
    배열에 있는 요소로 접근하는 방법은 대괄호 [ ]로 인덱스를 써주는 방법
    - 왜 i인가? : 프로그래밍의 세계는 0부터 시작, 코드를 보면 i=0이기 때문에 i를 사용
  • 이해 안돼도 괜찮아!
  • 향상된 for문과 같은 표현

2-9 while, break, continue

while

  • ~하는동안
    • for도 뜻이 ~하는동안
  • 반복을 위한 Java의 문법
  • for문과 동일하게 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 문맥
  • 무한Loop 주의
  • 코드
    while ( ) { }
    // while 문
    
    int number = 0;
    while(number < 3) {
    		number++;
        System.out.println(number + "출력"); 
    }
    
    // 출력
    1출력
    2출력
    3출력
    • while 문으로 사용하면 조건문을 만족해야지만 연산 반복 수행이 됨
    • 한 번 반복할 때마다 조건문을 체크해서 조건문이 불만족(false)이면 반복을 중단함

while 예제 w16

while (number < 3) {
                        
        }
  • while의 ( )에는 조건만 적어주면 되는데, 3보다 작은 값에 대한 증감 부분 등 모든 로직은 { } 에 들어가야 함
  • while문은 ( ) 안의 조건을 만족할 때 까지 돈다
package week02;

public class w16 {
    public static void main(String[] args) {
        int number = 0;
        while (number < 3) {
            number++;
            System.out.println(number);
        }
    }
}
  • number = 0, < 3 가능하니까 true, true니까 number++가 실행됨

  • 써있는 숫자 (3) 까지 만족되고 멈춤

do-while 예제

  • do-while의 뜻
    • do : 어떤 것을 먼저 하고
    • while : while 을 실행 시키겠다
    • while문과 같은데 do를 하고 나서 while문이 실행된다, 어떤 작업이 먼저 선행된다
int = 4;
        do { //이 로직을 먼저 수행하겠다
            System.out.println(number + "출력!");
        } while (number < 3);
  • int = 4고 do의 sout 먼저 실행되어 출력, while의 조건은 (number < 3);
    → while문에서 조건이 성립되지 않아도 먼저 있는 do로 인해 4가 먼저 출력됨

  • while문이라고 생각해보면? 아무것도 수행하지 않고 끝난다
    → 조건이 성립되지 않음, 수행하지 않음 = number는 영원히 3보다 크기 때문

break

  • 깨부수다, while문의 중괄호 안에 있는 로직을 꺠부수고 나와서 로직을 종료시키는 역할
  • 가장 가까운 블록의 for문 또는 while, switch문을 중단시킴

break 예제

  • break는 for문, while문, switch문을 중단하는 역할
int number = 0;
        while (number < 3) {
            number++; //2
            if (number == 2) {
                break;
            }

            System.out.println(number + " 출력입니다");
        }

  • number은 0
  • while은 3까지 실행된다
  • number++; 1씩 +가
  • if (number == 2) number가 2면
  • break; 멈춘다
  • 하지만 2 전에 밑으로 흘러서 1이 sout된다
  • 주의
    • { } 배치 주의하기, break가 실행 안될 수도 있음
    • while문이 설정한 값이 되기 전을 break로 멈추는 것

for문을 이용한 break 예제

  • for문 안에 for문, if문처럼 중복 가능
for (int i = 0; i < 10; i++) {
            System.out.println("i: " + i);
            if (i == 2) {
                break; //i가 2일 때, 가장 바깥 반복문이 종료된다
            }
            for (int j= 0; j < 10; j++) {
                System.out.println("j: " + j);
                if(j == 2) {
                    break; //j가 2일 때, 안쪽 반복문이 종료
                }
            }
        }
  • 바깥쪽 for문, i = 0 부터 시작
  • i = 0이기 때문에 if (i == 2)에 들어가지 않음
  • 안쪽 for문으로 진입
  • i는 0인 상태 i = 0으로 j가 하나씩 실행
  • j = 0, j = 1, j = 2가 되면서 break
  • 안쪽 for문이 break 돼도 모두 끝나는 것이 아니라 다시 바깥쪽 for문으로 돌아감
  • 바깥쪽 for문으로 돌아가면서 i = 1
  • i = 1이기 때문에 if (i == 2)에 들어가지 않음
  • 다시 안쪽 for문으로 진입하여 반복
  • 다시 바깥쪽 for문으로 돌아가서 1이었던 i가 2가 됨 i = 2
  • if (i == 2)를 충족하여 break

continue

  • break와 상당히 닮아 있음
  • continue와 break의 다른점 예제
    • continue는 ~계속하다라는 의미
    • continue를 만나면 바로 그 다음 반복문으로 넘어가게 됨
    • continue는 하위로직을 생략함

continue와 break의 다른점 예제

int number = 0;
        while (number < 3) {
            number++; //1 //2 //3
            if (number == 2) {
                continue;
            }
            System.out.println(number + " 출력입니다");
        }
  • int number = 0;이기 때문에 while (number < 3) 조건 만족 = true
  • true이기 때문에 number++; 실행 0 → 1
  • if (number == 2)는 아니기 때문에 1 출력
  • 다시 위로 가서 반복 number++; 실행 1 → 2
  • if (number == 2) 조건 충족으로 인해 continue
  • continue가 되면 하위 로직으로 가지 않고 다음 반복문으로 넘어감
    → System.out.println(number + " 출력입니다"); 를 스킵
  • number가 2인 상태에서 while (number < 3) 실행, number는 3이 됨
  • number가 3인 상태에서 if (number == 2) 실행 안됨
  • if (number == 2) {continue;} 적용 안됨
  • System.out.println(number + " 출력입니다"); 가 실행됨

  • 이해하기
    • if (number == 2)의 2의 값은 {continue;}으로 인해 스킵되어 출력에 나오지 않음?
    • 왜 0은 없나요…?
    • continue = 생략, 다음으로 넘어감 이라고 기억?

궁금한 점

답변은 비공개 노션

continue 스킵

  • 질문
    • continue - 2 출력입니다 왜 없음?!
  • 해결
    • continue는 조건 충족된 코드의 하위 코드를 스킵(print 스킵)하고 다음 반복문 실행

continue는 0이 없다

  • 질문

    • continue는 왜 0이 없나요?
  • 해결

    • for문은 0이 바로 찍혀 있어서 0부터 시작
      • for문 코드
        				for (int i = 0; i < 4; i++) {
                    System.out.println(i + " 번재 출력!");
                }
    • while문은 int number = 0;으로 설정해주고 ++가 먼저 만나서 시작되기 때문에 1부터 시작
      • while문 코드
        int number = 0;
                while (number < 3) {
                    number++;
                    if (number == 2) {
                        continue;
                    }
                    System.out.println(number + " 출력입니다");
                }

2-10 반복문 활용 연습

조건문과 반복문에 익숙해지기 위해 연습하기 w17

  • 구구단 만들기

    • 구구단은 두 개의 숫자가 곱해서 나오는 것, for문이 두 번 나와야 함(중복 for문)

      package week02;
      
      public class w17 {
          public static void main(String[] args) {
              //구구단
              for (int i = 2; i <= 9; i++) //구구단의 첫 번째 수
                  for (int j = 2; j <= 9; j++) { //구구단의 두 번째 수
                      System.out.println(i + "곱하기" + j + "는" + (i*j) + "입니다");
                  }
          }
      }
      2곱하기24입니다
      2곱하기36입니다
      2곱하기48입니다
      2곱하기510입니다
      2곱하기612입니다
      2곱하기714입니다
      2곱하기816입니다
      2곱하기918입니다
      3곱하기26입니다
      3곱하기39입니다
      3곱하기412입니다
      3곱하기515입니다
      3곱하기618입니다
      3곱하기721입니다
      3곱하기824입니다
      3곱하기927입니다
      4곱하기28입니다
      4곱하기312입니다
      4곱하기416입니다
      4곱하기520입니다
      4곱하기624입니다
      4곱하기728입니다
      4곱하기832입니다
      4곱하기936입니다
      5곱하기210입니다
      5곱하기315입니다
      5곱하기420입니다
      5곱하기525입니다
      5곱하기630입니다
      5곱하기735입니다
      5곱하기840입니다
      5곱하기945입니다
      6곱하기212입니다
      6곱하기318입니다
      6곱하기424입니다
      6곱하기530입니다
      6곱하기636입니다
      6곱하기742입니다
      6곱하기848입니다
      6곱하기954입니다
      7곱하기214입니다
      7곱하기321입니다
      7곱하기428입니다
      7곱하기535입니다
      7곱하기642입니다
      7곱하기749입니다
      7곱하기856입니다
      7곱하기963입니다
      8곱하기216입니다
      8곱하기324입니다
      8곱하기432입니다
      8곱하기540입니다
      8곱하기648입니다
      8곱하기756입니다
      8곱하기864입니다
      8곱하기972입니다
      9곱하기218입니다
      9곱하기327입니다
      9곱하기436입니다
      9곱하기545입니다
      9곱하기654입니다
      9곱하기763입니다
      9곱하기872입니다
      9곱하기981입니다
    • 입력 받는 단을 제외하고 출력

      Scanner sc = new Scanner(System.in);
              int passNum = sc.nextInt();
      
      //public class 위(밖)에 있는 import java.util.Scanner; 확인하기
      package week02;
      
      import java.util.Scanner;
      
      public class w17 {
          public static void main(String[] args) {
              //입력 받는 단을 제외하고 출력
              Scanner sc = new Scanner(System.in);
              int passNum = sc.nextInt(); //출력을 제외 할 구구단 수 값
      
              //구구단
              for (int i = 2; i <= 9; i++) {//구구단의 첫 번째 수
                  if (i == passNum) {
                      continue;
                  }
                  for (int j = 2; j <= 9; j++) { //구구단의 두 번째 수
                      System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다");
                  }
              }
          }
      }
      • if (i == passNum) {continue;}
        → 2단 경우 바로 3단 넘어가서 수행 ~ 8단 경우 바로 9단 넘어가서 수행
      • 터미널에 2를 입력할 경우 2단을 뺀 나머지 구구단이 출력됨
      • 터미널에 3를 입력할 경우 3단을 뺀 나머지 구구단이 출력됨

2-11 배열 개념소개 및 선언 조회 실습

  • 배열을 분류통이라고 비유를 들어서 설명
  • 변수에 값을 넣어서 보관,
    여러 개의 변수를 한꺼번에 저장하고 관리하고자 할 때는 배열에 저장&표현
  • 배열에서 하나하나 꺼내서 쓰기도 하고 메소드를 이용해서 값을 가공하기도 함
  • ‘자료구조’ 라고도 사용함
  • Java 안에 여러가지 자료구조가 있는데 그 중 하나가 배열
  • 자료구조를 잘 쓰게 되면 실제 세계에 있는 여러가지 문제들을 효율적으로 풀 수 있음
    → 알고리즘 : 자료구조 기반

배열 선언

1. `타입` `[]` `변수`;
    ex. `int[] intArray;` //일반적인 배열형 변수
    
2. `타입` `변수[]`;
    ex. `int intArray[];`
  • 기본형 변수 선언 방식의 우측에 배열 형태 [ ] 대괄호를 붙여주면 됨
    ex) int [ ] (String, Boolean 타입 모두 다 다름 : [코드 스니펫] 배열 선언 참고)
  • 형태는 같으나 int라는 형태만 바꿔주면 어떤 변수를 배열에 넣을지 정할 수 있다
  • 한번에 많은 양의 데이터를 다루거나 계산할때 사용 → for문 등 반복문과 많이 사용됨

배열 생성

  • 참조형 변수들처럼 new 명령어를 통해서 생성, 대괄호 안에서 크기 지정
    • new 명령어로 몇 개를 담을지, 배열의 크기가 배치될지를 미리 정의해준다
  • 배열은 기본적으로 idex가 있음
    • idex를 통해서 이 배열에 몇 번째에 이게 채워질 것이냐, 몇 번째에 접근할 것이냐
  • 생성될 때 각 타입별 초기값으로 초기화
    ex) int의 초기값은 0 정수형은 0, boolean = false, String = null(없음)
  • 초기화를 시키고 나면 배열에는 모두 다 0으로 채워진 값으로 세팅이 되어 있다

배열 생성, 순회 arr01

배열 생성

//배열 생성
        int[] intArray = new int[3]; //초기값0 {0, 0, 0}
        boolean[] boolArray = new boolean[3]; //초기값false {false, false, false}
        String[] stringArray = new String[3]; //초기값null(없음) {"", "", ""}
  • int[] 변수 타입 선언, 우측 대괄호 → 배열이라는 것을 명시
  • intArray 변수 이름
  • int[] intArray = 우측에 배열 생성을 위해 배열의 크기를 지정, new로 만들어줌
  • int[] intArray = new int[3];
    • 크기를 3개 가지고 있는 int형 Array
    • int의 초기값은 0이고 {0, 0, 0}으로 초기화가 됨

배열 선언 먼저 -> 나중에 초기화

//배열 선언 먼저 -> 나중에 초기화
        int[] intArray2 //선언만 먼저함
        intArray2 = new int[3]; //{0, 0, 0} //변수를 생성할 때, 변수를 선언할 때와 동일
  • int inArray2는 int형 배열이다 라고 선언 먼저 해놓음
  • intArray = new int[3]; 라고 후에 초기화 할 수도 있음

생성한 배열 '순회' -> 배열의 값 ‘조회’

  • 생성한 배열을 '순회' -> 배열의 값을 하나씩 뽑아서 조회한다

  • (1) 단건 조회

    int[] intArray = new int[3]; //초기값0 {0, 0, 0}
    
    System.out.println(intArray[1]);
    • {0, 0, 0}은 순서대로 0, 1, 2이며 두번째 0에 접근할 때 1로 불러와야 함
      → System.out.println(intArray[1]);
  • (2) 다건 조회(important!)

    • intArray2를 for문으로 접근해서 순회 도는 방법

      for (int i=0; i<intArray2.length; i++) {
                  System.out.println(intArray2[i]);
              }

    • i<intArray2.length;

      • intArray2의 길이(length)만큼
        → intArray2 = new int[3];이기 때문에 i<intArray2.length; = i<3
    • length : 길이를 구하는 메소드

    • 0번째일 때, 1번째일 때, 2번째일 때 3번 돌아감

초기화 arr02

    1. 배열에 특정값 대입해서 선언하는 방식으로 초기화 지정

      				int[] intArr ={1, 2, 3, 4, 5};
              String[] stringArray = {"a", "b", "c", "d"};
    • int[] intArr ={1, 2, 3, 4, 5};
      → 의 길이는 자동으로 5가 세팅 되면서 값들도 들어감
    • String[] stringArray = {"a", "b", "c", "d"};
      → 배열을 선언 하면서 초기값을 지정해 줄 수 있음
  • 2-1. for문을 통해서 대입
    • 선언해 놓은 변수를 이용, 값을 하나하나씩 for문으로 돌리면서 대입

      for(int i=0; i<intArr.length; i++)
                  intArr[i] = i;
    • intArr의 i값을 i로 바꾸면 i는 0, 1, 2, 3, 4로 돌게 됨

  • 2-2. for문을 통해서 대입을 다건출력
    for(int i=0; i<intArr.length; i++) {
                System.out.println(intArr[i]);
            }
    • 1, 2, 3, 4, 5가 들어가 있지만 for문을 통해서 0, 1, 2, 3, 4를 대입함

  • 2-3. 향상된 for문 다건출력 (배열 이용)
    for (int i: intArr) {
                System.out.println(i);
            }
    • 위와 동일하게 0, 1, 2, 3, 4 결과 값이 나옴
  • 2-4. 향상된 for문 더 이해하기
    int[] intArr ={10, 20, 30, 40, 50};
    
            for (int item: intArr) {
                System.out.println(item);
            }
    • {10, 20, 30, 40, 50}가 intArr로 들어감
    • item에 {10, 20, 30, 40, 50}가 들어감
    • 향상된 for문에서는 index가 아니라 {10, 20, 30, 40, 50}의 하나하나를 지칭해줌
  • 배열의 주소를 모두 같은 값으로 초기화
    • Arrays라는 Java의 유틸리티, 배열과 관련된 모든 메소드들이 들어있음
    • Arrays.fill 로 모두 같은 값으로 초기화
      int[] intArr = {10, 20, 30, 40, 50};
      
      		Arrays.*fill*(intArr, 1);
      		//Arrays.fill(배열, 초기화 할 값);
      
          for (int item : intArr) {
      		    System.out.println(item);
          }

2-12 얕은 복사, 깊은 복사, string 배열

  • 복사는 일반적인 변수에서도 가능
    • int a = 4
      int b = a
  • 위와 같은 변수 복사는 배열에서 위험!

복사

얕은 복사

  • 참조형 변수는 복잡하기 때문에 실제 값이 아니라 주소값을 저장
  • 배열 변수값에 대입 연산자. 즉, ‘=’를 이용해서 복사하면 주소값이 복사됨
  • 주소값만 복사되고 실제값은 1개로 유지되는 것을 얕은 복사라고 함
  • 배열에서 =을 사용한 복사 위험성
    • int[] arr1 = {a, b, c}

      • {a, b, c}는 별도 공간에 저장됨 (“add1” ‘주소’라고 가정한 ‘공간’)
    • int[] arr2 = arr1
      - 공간 자체를 가져오는 것이 아닌 “add1” 라는 주소값만 가져오게 됨
      - 즉, arr2의 값을 바꾸더라도 ‘공간’에 접근해서 바꾸기 때문에 arr1도 영향이 있음 → 바람직하지 않은 상황!

  • 얕은 복사 코드 arr03
    package week02.array;
    
    public class arr03 {
        public static void main(String[] args) {
            //얕은 복사
    
            int[] a = {1, 2, 3, 4};
            int[] b = a; //얕은복사
    
            b[0] = 3; //b 배역의 0번째 순번값을 3으로 수정했습니다 (1 -> 3)
    
            System.out.println(a[0]); //출력 3 <- a 배열의 0번째 순번값도 3으로 조회됩니다
        }
    }
    • int[] a = {1, 2, 3, 4};
      • 선언한 배열을
    • int[] b = a; //얕은복사
      • 대입 연잔자로 붙여 넣어 버림
    • a와 b는 똑같은 별도 영역에 주소를 바라보게 됨
      → 똑같은 값을 가지고 있지 않음
    • b[0] = 3;
      • b의 0번째 자리(1)을 3으로 수정한다
    • System.out.println(a[0]);
      • b를 수정한 상태이며 a는 바뀌지 않음
    • b는 a이지만 a는 b가 아닐 수 있음, a는 바뀌지 않았음
      그렇다면 a의 0번째 자리는?
      - a도 3이 나오게 됨 = 얕은복사
      - 바람직하지 않은 방법
       

깊은 복사

  • 배열에서 얕은 복사를 피하고 깊은 복사를 사용해야 함

  • (1) for문을 통해서 하나하나씩 다 꺼내서 복사를 해주는 방법
    → 하나하나씩 새로운 배열을 만들어 주는 방법
    - 깊은 복사 코드

        ```java
        // 깊은 복사
        
        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length]; 
        
        for (int i = 0; i < a.length; i++) {
            b[i] = a[i]; // 깊은 복사
        }
        
        b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
        
        System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.
        ```
        
    • a를 참조해서 별도의 b를 만들었다

    • a가 가지고 있는 별도의 영역과 b가 가지고 있는 별도의 영역은 다른 것

      • 다른 주소를 바라보고 있음
  • (2) 깊은 복사 메소드

    • clone()

      // 깊은 복사 메서드
      
      // 1. clone() 메서드
      int[] a = { 1, 2, 3, 4 };
      int[] b = a.clone(); // 가장 간단한 방법입니다. 
      // 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
      • ‘=’ 으로 복사 했을 때 문제가 생기는 것을 방지하기 위해 a.clone()을 사용
      • a.clone() : a를 완전히 복사하지만 주소는 다른 걸 가지고 오는 메소드
      • 2차원 이상 배열에서는 얕은 복사로 동작합니다
        → 배열로 이루어진 배열이 [ [ ] ] 있을 수 있기 때문에 주의해야 함
    • 최종적으로 사용해야하는 깊은 복사 메소드 arr04

      // 깊은 복사 메서드
      
      import java.util.Arrays;
      
      public class Main {
      	public static void main(String[] args) {
      		// 2. Arrays.copyOf() 메서드
      		int[] a = { 1, 2, 3, 4 };
      		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
      	}
      }
    • a와 b다른 배열 만들기

      package week02.array;
      
      import java.util.Arrays;
      
      public class arr04 {
          public static void main(String[] args) {
              // 2. Arrays.copyOf() 메서드
              int[] a = { 1, 2, 3, 4 };
              int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
      
              a[3] = 0;
              System.out.println(a[3]);
              System.out.println(b[3]);
          }
      }

      • int[] b = Arrays.copyOf(a, a.length);
        • copyOf → 메소드를 이용해서
        • a, a → a 배열과 a 배열이 가지고 있는
        • .length → 길이를 넣어주면 새로운 배열을 리턴한다
      • 함수는 입력이 있으면 출력이 있음
        • a, a.length 이라는 입력을 해서 출력이 있음
        • 새로운 배열을 주면 그 출력을 b에다 담음
        • 그러면 a랑 b는 완전히 다른 종류의 배열이 됨
          • a의 3번째 자리(4)를 0으로 바꿔도 b의 3번째 자리(4)가 온전한 것이 확인됨

문자(char), 문자열(String)

  • 문자 - 기본형 변수, 1Byte
  • 문자열 - 참조형 변수
  • String = char[]
    • String은 char의 배열로 만들어짐
  • 기본형 변수와 참조형 변수의 차이점
    • (1) 기본형 변수는 '소문자'로 시작, 참조형 변수는 '대문자'로 시작
      • Wrapper class에서 기본형 변수를 감싸줄 때(boxing), int -> Integer
    • (2) 기본형 변수는 값 자체를 저장, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장(= 주소형 변수)
  • char 보다 String을 훨씬 더 많이 씁니다
    • String이 가지고 있는 기능이 너무 많아서!
    • Wrapper class와도 상당히 비슷!
      -> 기본형 변수가 가지고 있는 기능이 제한
      -> 다양한 기능을 제공하는 Wrapper를 감쌈으로써 추가 기능을 더함

String 기능 활용 예시

String str = "ABCD";
  • (1) length
    //(1) length
            int strLength = str.length();
            System.out.println(strLength);
    • 결과 값 = 4
  • (2) charAt(int index)
    //(2) charAt(int index)
            char strChar = str.charAt(1);
            System.out.println(strChar);
    • 결과 값 = B
  • (3) substring(int fromIdx, int toIdx)
    //(3) substring(int fromIdx, int toIdx)
            String strSub = str.substring(0, 3);
            System.out.println(strSub);
    • 결과 값 = ABC
      • substring : String을 잘라준다
      • (0, 3) : 0부터 3전 까지 → 0, 1, 2 : A, B, C
  • (4-1) equals(String str)
    • equals는 어떠한 String이 입력으로 받은 이 String과 같니?

      //(4) equals(String str)
              String newStr = "ABCD";
              boolean strEqual = newStr.equals(str);
              System.out.println(strEqual);
    • output은 true 또는 false = boolean

    • 우리가 가지고 있었던 str과 일치하니?

    • String str = "ABCD"; 우리가 가지고 있는 동일한 String 입력

    • 결과 값 = true

  • (4-2) equals(String str)
    • String str = "ABCE"; 우리가 가지고 있는 다른 String 입력

      //(4) equals(String str)
              String newStr = "ABCE";
              boolean strEqual = newStr.equals(str);
              System.out.println(strEqual);
    • 결과 값 = false

  • (5) toCharArray() : String -> char[]
    //(5) toCharArray() : String -> char[]
            //String을 char로 이루어진 Array로 변환하는 메소드
            char[] strCharArray = str.toCharArray();
    • 원래 가지고 있던 String을 char로 이루어진 Array로 바꿔줌
  • (6) 반대로 char[] -> String -> char
    //(6) 반대로 char[] -> String -> char
            char[] charArray = {'A', 'B', 'C'};
            String charArrayString = new String(charArray);
    				System.out.println(charArrayString);
    • char는 ‘ ‘ 홑따옴표
    • new String 키워드로 charArray를 charArrayString로 변경할 수 있음
    • 결과 값 = ABC
      • 문자열 형태로 변환됨

진도 따라잡기 위해 2-13 부터 청강 위주로 습득하고 정리해보기
3주차 강의 진입하기
5.31(수) 국취제 상담으로 인해 과제할 시간 부족 -> 주말+휴일에 과제 진입하기
WIL작성하기

profile
공부하자개발하자으쌰으쌰

0개의 댓글