내일배움캠프 7기

Spring 7기 8일차(자바)

suuuki 2024. 10. 10. 21:10

조건문

 특정 조건에 따라 다른 연산을 수행하고 싶을때

  • 조건문❓ : “물이 끓으면 강불에서 약불로 줄여주세요.”
    • **“물이 끓으면”**이 조건이 만족하면 “약불로 줄이는” 연산을 수행하는 조건문입니다

-if문

public class W12 {
    public static void main(String[] args) {
        //중첨 if문
        boolean flag = true;
        int number =2;

        if (flag) {
            if (number == 1) {
                System.out.println("flag값은 true고, number값은 1입니다.");
            } else if (number == 2) {
                System.out.println("flag값은 true고, number값은 2입니다.");
            } else {
                System.out.println("flag값은 true고, number값은 모르겠습니다.");
            }
        } else {
            if (number == 1) {
                System.out.println("flag값은 false고, number값은 1입니다.");
            } else if (number == 2) {
                System.out.println("flag값은 false고, number값은 2입니다.");
            } else {
                System.out.println("flag값은 false고, number값은 모르겠습니다.");
            }
        }
    }
}

 

-switch문

public class W14 {
    public static void main(String[] args) {
        int month = 8;
        String monthString ="";

        //switch문
        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 vs switch

  • 차이점1. 복합 조건
    • if 문은 복합 조건을 지원합니다.
      • 복합 조건 : 괄호()안에 조건 여러 개를 지정하여 조건문을 수행할 수 있습니다.
    • switch 문은 피연산자 한 개에 대한 조건만 지원합니다.
  • 차이점2. 코드 중복
    • if 문은 상대적으로 코드 중복이 많습니다.
    • switch 문은 코드 중복이 적습니다.

 

 

반복문

 특정 조건에 따라 반복해서 동일한 연산을 수행하고 싶을때

for, while, do-while

  • 반복문🔁 : “하얗게 색이 변하기 전까지 계속 저어주세요.”
    • “하얗게 색이 변하기 전” 조건이 만족할 동안 “저어주세요” 연산을 반복하는 반복문입니다.

-for문

초기값, 조건문, 증가연산 {(연산)}의 형태로 사용

특정 조건은 초기값과 조건문을 통해서 정의

 

2-8에서 예시

 

-While, do-while문

2-9예시


분류통

자바 프로그래민에서 여러개의 변수를 붕류통 같은곳에 모아서 저장하고싶을때 기본적으로 "배열"이라는 변수에 저장

분류통은 자료구조라는 이름으로 불린다

 

선언

int: 기본형 변수는 1개의 값만 변수에 저장

int[]: 배열형 변수는 여러개의 변수를 저장 할 수 있다

단, 하나의 배열형 변수에는 같은 타입의 변수만 담을 수 읶다

 

한번에 많은 양의 데이터를 다루거나 계산할때 사용(for문 등 반복문과 사용)

 

1. 타입   []   변수;   배열형 변수

  ex. int[] intArray;

2.타입  변수[];

ex. int intArray[];

 

생성

배열(Array)는 참조형 변수들처럼 new 명령을 통해서 생성하며, 대괄호[] 안에 크기를 지정해 줍니다.

사이즈를 지정해 생성된 분류통은 각 칸마다 순번이 있음

시작은 1이 아닌 0부터 시작

 

분류통(배열)은 생성될때 각 타입별 초기값으로 초기화 되어 채워진다

예를 들어, int는 0, boolean 은 false, String 은 null 값과 같은 초기값이 정해져 있음

public class Arr01 {
    public static void main(String[] args) {
        //배열 생성
        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}

        //생성한 배열을 '순회' ->배열의 값을 하나씩 뽑아서 조회
        //(1)단건 조회
        System.out.println(intArray[1]);

        //(2)다건 조회
        //length: 길이를 구하는 메서드
        for (int i=0; i<intArray2.length; i++) {
            System.out.println(intArray2[i]);
        }
    }
}

 

초기화

//초기화

//1.배열을 특정값 대입해서 선언
int[] intArr ={1, 2, 3, 4, 5};
String[] stringArray = {"a", "b", "c", "d"};

//2.for문을 통해서 대입
for(int i=0; i<intArr.length; i++) {
    intArr[i] = i;
}

//다건출력
for(int i=0; i<intArr.length; i++) {
    System.out.println(intArr[i]);
int[] intArr ={1, 2, 3, 4, 5};
for(int item: intArr) {
    System.out.println(item);
}
//배열의 주소를 모두 같은 값으로 초기화
int[] intArr ={1, 2, 3, 4, 5};
Arrays.fill(intArr, 1); //(배역, 어떤값으로 초기화할지)

for (int item: intArr) {
    System.out.println(item);
}

복사

-얕은 복사

배열 변수 간 대입 연산자(=)를 사용해서 복사하게 되면 주소값만 복사

이렇게 주소값만 복사되고 실제 값은 1개로 유지되는걸 얕은 복사

  •  주소값이 복사된다?

        변수명은 서로 다르지만 같은 값을 보고 있다는 것을 의미

//얕은 복사

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으로 조회

 

-깊은 복사

얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 똑같이 만들고 싶을때 사용

실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사하면 된다

반복문(for문)을 통해 하나씩 꺼내서 복사해주는 방법, 여러 메서드르 사용하는 방법이 있다

// 깊은 복사

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 배열은 그대로
// 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]);

 

기본형 변수 vs 참조형 변수

-기본형 변수는 '소문자로 시작', 참조형 변수는 '대문자로 시작'

 ex) Wrapper class에서 기본형 변수를 감싸줄 때 (boxing), int->Integer

-기본형 변수는 값 자체를 지정, 참조형 변수는 별도의 공간에 값을 저장 후 그 주소를 저장(=주소형 변수)

 

String

String str = "ABCD";

// (1)length()
        int strLength = str.length();
        System.out.println(strLength);  // 4 출력

// (2)charAt(int index)
        char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킴
        System.out.println(strChar);  // C 출력

// (3)substring(int fromIdx, int toIdx)
        String strSub = str.substring(0, 3); // 0~2순번까지 자르기 (3순번은 제외)
        System.out.println(strSub);  // ABC 출력

// (4)equals(String str)
        String newStr = "ABCD";  // str 값과 같은 문자열 생성
        boolean strEqual = newStr.equals(str);
        System.out.println(strEqual); // true 출력

// (5)toCharArray(): String -> char[]
        char[] strCharArray = str.toCharArray();  

// (6)반대로 char[] -> String -> char
        char[] charArray = {'A', 'B', 'C'};
        String charArrayString = new String(charArray);
        System.out.println(charArrayString); // ABC문자열 형태로 변환

 

 


다차원배열

현실에서 일어나는 복잡하고 다양한 문제를 풀기 위해 필요

 

선언

2차원 배열을 선언할 때는 1차원 배열에 대괄호를 하나 더 추가해 주면 된다

  • int[][] array
  • int array[][]
  • int[] array[]

생성

2차원 배열을 생성할 때도 대괄호를 하나 더 추가하면 된다

  • int[][] array = new int[][];

 초기화

1. 중괄호를 사용해 선언과 동시에 초기화합니다.

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

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

2. 선언/생성 이후 반복문을 통해 초기화를 합니다.

// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 최초 선언

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        System.out.println("출력값 =>" + i + ", "+j);
        array[i][j] = 0;  // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
    }
}

출력값 =>0, 0
출력값 =>0, 1
출력값 =>0, 2
출력값 =>1, 0
출력값 =>1, 1
출력값 =>1, 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}

};

 

최대값 구하기

        // 최대값 구하기

        int[] arr = { 3, 2, 1, 5, 1 };

        // 최대값 초기값 세팅
        int max = arr[0];

        // 최대값 구하기
        for (int num : arr) {
            if (num > max) { // 반복문 돌면서 나(max)보다 값이 작으면 저장
                max = num;
            }
        }

// 최대값 5 출력
        System.out.println(max);

 

컬렉션(Collection)

기본형 변수가 아닌 참조형 변수를 저장

  • List : 순서가 있는 데이터의 집합 (데이터 중복 허용) - 배열(array)과 비슷

처음에 길이를 몰라도 만들 수 있음(arrary는 최초 길이를 알아야 한다)

-array: 정적배열

-List(ArrayList): 동적 배열(크기가 가변적으로 늘어난다)

   ->생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아 놓는다

       값이 추가될 떄 더 큰 공간이 필요하면 더 큰 공간을 받아서 저장해서 상관없다

  • 선언 : ArrayList<Integer> intList 형태로 선언합니다.
  • 생성 : new ArrayList<Integer>(); 형태로 생성합니다.
  • 초기화 : 사이즈를 지정하는 것이 없기 때문에 초기화가 필요 없습니다.
  • 값 추가 : intList.add({추가할 값}) 형태로 값을 추가합니다.
  • 값 수정 : intList.set({수정할 순번}, {수정할 값}) 형태로 값을 수정합니다.
  • 값 삭제 : intList.remove({삭제할 순번}) 형태로 값을 삭제합니다.
  • 전체 출력 : intList.toString() 형태로 전체 값을 대괄호[]로 묶어서 출력합니다.
  • 전체 제거 : intList.clear() 형태로 전체 값을 삭제합니다.
public class Col1 {
    public static void main(String[] args) {
        ArrayList<Integer> intList = new ArrayList<> (); //선언+생성

        intList.add(99);
        intList.add(15);
        intList.add(3);

        System.out.println(intList.get(1)); //15

        //2번째 있는 값(15)을 바꿔보자
        intList.set(1, 10);
        System.out.println(intList.get(1)); //10

        //삭제
        intList.remove(0);
        System.out.println(intList.get(0)); // 15 10 10(99가 삭제되서 2번쨰 값)

        //list안의 모든 값 삭제
        intList.clear();
        System.out.println(intList.toString()); //toString() 리스트 안의 값 사람이 볼 수 있게 만듬
                                                //출력값: [] 
    }
}

-Linked list

 메모리에 남는 공간을 요청해 여기저기 나누어 실제 값을 담는다

실제 값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조

기본적인 기능은 Arrylist와 동일

값->여러군데 나누어서, 조회하는 속도가 느리다

값을 추거하거나, 삭제할때는 빠르다

LinkedList<Integer> linkedList = new LinkedList<Integer>();

linkedList.add(5);
linkedList.add(10);
linkedList.add(3);

System.out.println(linkedList.get(0)); //5
System.out.println(linkedList.get(1)); //10
System.out.println(linkedList.get(2)); //3

System.out.println(linkedList.toString()); // 출력값 [5, 10, 3]
//이렇게 조회할 때는 arraylist보다 속도가 현저히 느림

linkedList.add(2, 4); //2번째에 4라는 값을 추가
System.out.println(linkedList.toString()); //출력값 [5, 10, 4, 3]

linkedList.set(1, 30); //1번째 있는 요소를 30으로 수정
System.out.println(linkedList.toString()); //출력값 [5, 30, 4, 3]

linkedList.remove(1); //1번째 요소를 삭제
System.out.println(linkedList.toString()); //출력값 [5, 4, 3]

linkedList.clear(); //전부 삭제
System.out.println(linkedList.toString()); //출력값 []

 

-stack

수직으로 값을 쌓아놀고, 넣었다가 뺀다. FILO(Basket)

push, peek, pop

최근 저장된 데이터를 나열하고 싶거나, 데이터의 중복 처리를 막고 싶을 때 사용

Stack<Integer> intStack = new Stack<Integer>(); //선언 및 생성

intStack.push(10);
intStack.push(15);
intStack.push(1);

//다 지워질 댸 까지 출력
while(!intStack.isEmpty()) { //비어있으면 true, 차 있으면 false
    System.out.println(intStack.pop()); //젤 위에 쌓인게 프린트 되면서 빠지게 된다. 출력 1 15 10
}

//peak
System.out.println(intStack.peek()); //1
System.out.println(intStack.size()); //3

 

 

  • Queue : 빨대🥤처럼 한쪽에서 데이터를 넣고 반대쪽에서 데이터를 뺄 수 있는 집합
    • First In First Out : 먼저 들어간 순서대로 값을 조회할 수 있다.

add(넣는것), peek(조회), poll(꺼내는거)

생성자가 없는 인터페이스

Queue<Integer> intQueu = new LinkedList<>(); //queue를 선언, 생성
                                            //생성자가 있는것만 new 키워드로 만들 수 있다
intQueu.add(1);
intQueu.add(5);
intQueu.add(9);

while(!intQueu.isEmpty()) {
    System.out.println(intQueu.poll()); //출력 1 5 9  stack과 queue의 자료구조는 다르다
}

//추가
intQueu.add(1);
intQueu.add(5);
intQueu.add(9);

//peak
System.out.println(intQueu.peek()); //출력 1
System.out.println(intQueu.size()); //출력 3
  • Set : 순서가 없는 데이터의 집합 (데이터 중복 허용 안 함) - 순서 없고 중복 없는 배열

순서가 보장되지 않는 대신 중복을 허용하지 않도록 하는 프로그램에서 사용할 수 있는 자료구조

set-> 그냥 쓸 수도 있다. 그러나, HashSet, TreeSet 등으로 응용해서 같이 사용 가능

set은 생성자가 없는 껍데기라서 바로 생성할 수 없음

생성자가 존재하는  HashSet을 이용해서 set을 구현해 볼 수 있음

Set<Integer> intSet = new HashSet<Integer>(); // 선언 및 생성

intSet.add(1);
intSet.add(2);
intSet.add(3);
intSet.add(3); // 중복된 값은 덮어쓴다
intSet.add(3); // 중복된 값은 덮어쓴다

for (Integer value : intSet) {
    System.out.println(value); // 1,2,3 출력
}

// contains()
System.out.println(intSet.contains(2)); // true 출력
System.out.println(intSet.contains(4)); // false 출력

// remove()
intSet.remove(3); // 3 삭제

for (Integer value : intSet) {
    System.out.println(value); // 1,2 출력
}
  • Map : 순서가 없는 (Key, Value) 쌍으로 이루어진 데이터의 집합 (Key값 중복 허용 안 함,유니크함), key로 value를 찾는다

map->HashMap, TreeMap으로 응용

Set<Integer> intSet = new HashSet<Integer>(); // 선언 및 생성

intSet.add(1);
intSet.add(2);
intSet.add(3);
intSet.add(3); // 중복된 값은 덮어쓴다
intSet.add(3); // 중복된 값은 덮어쓴다

for (Integer value : intSet) {
    System.out.println(value); // 1,2,3 출력
}

// contains()
System.out.println(intSet.contains(2)); // true 출력
System.out.println(intSet.contains(4)); // false 출력

// remove()
intSet.remove(3); // 3 삭제

for (Integer value : intSet) {
    System.out.println(value); // 1,2 출력
}

 

 

 

자주 쓰는 참조형 변수

  • int의 참조형 변수 = Integer
  • long의 참조형 변수 = Long
  • double의 참조형 변수 = Double
  • String은 원래부터 참조형 변수 </aside>