[1/2] TIL - 📚 오늘의 학습 정리: 연산자, 제어문, 배열, 콜렉션 자료구조, 객체와 생성자

2025. 1. 2. 20:25개발 회고/TIL

😊오늘 배운 내용

연산자(대입연산자, 논리연산자, 비교연산자, 기타연산자, 삼항연산자, 비트연산자), 연산자 우선순위, 

가위바위보 만들기, if문, switch문, for문, 향상된 for문, while문, do while문, break와 continue, 배열(초기화방법(중괄호 혹은 for문)), 얕은복사와 깊은복사, String 배열,  다차원배열, 콜렉션 자료구조(ArrayList, LinkedList), 객체와 생성자

 

[어떤 문제가 있었는지 + 어떻게 해결하였는지]

1. 오늘은 개념 학습한 날이라서 크게 문제상황은 일어나지 않았다. 그 중 오늘 배운 개념에 대해서 기억해야 할 부분들을 남겨보고자 한다.

 

삼항연산자

//삼항 연산자
//비교연산자와 항상 함께 쓰임
//조건 ? 참 : 거짓
int x = 1;
int y = 2;
boolean z = (x==y) ? true : false;
System.out.println(z); //false

 

연산자 비교순위

//연산자 우선순위
//산술 > 비교 > 논리 > 대입
int x = 1;
int y = 2;
int z = 3;

boolean result = x<y && y<z; //true
System.out.println(result);

result = x+10 < y && y<z; //false
System.out.println(result);

 

가위바위보게임 (if문과 Objects.equals() 활용)

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("A 입력: ");
        String Ahand = sc.nextLine();

        System.out.println("B 입력: ");
        String Bhand = sc.nextLine();

        //두개의 입력값을 비교하는 메서드
        //Objects.equals(좌,우) -> 좌우값이 같으면 true 다르면 flase반환
        if (Objects.equals(Ahand, "가위")) {
            if (Objects.equals(Bhand, "가위")) {
                System.out.println("비겼습니다.");
            } else if (Objects.equals(Bhand, "바위")) {
                System.out.println("A가 졌습니다.");
            } else if (Objects.equals(Bhand, "보")) {
                System.out.println("A가 이겼습니다.");
            }
        } else if (Objects.equals(Ahand, "바위")){
            if (Objects.equals(Bhand, "바위")) {
                System.out.println("비겼습니다.");
            } else if (Objects.equals(Bhand, "보")) {
                System.out.println("A가 졌습니다.");
            } else if (Objects.equals(Bhand, "가위")) {
                System.out.println("A가 이겼습니다.");
            }
        } else if (Objects.equals(Ahand, "보")) {
            if (Objects.equals(Bhand, "보")) {
                System.out.println("비겼습니다.");
            } else if (Objects.equals(Bhand, "가위")) {
                System.out.println("A가 졌습니다.");
            } else if (Objects.equals(Bhand, "바위")) {
                System.out.println("A가 이겼습니다.");
            }

        }


    }

 

향상된 for문

//향상된 for문
//int로 이루어진 배열이라는 뜻
int[] numbers = {3,6,9,12};
for (int number : numbers) {
    System.out.println(number);
}

 

정적배열 선언

int intArray[] = new int[3];
boolean booleanArray[] = new boolean[3];
String stringArray[] = new String[3];

 

배열 초기화 (모두 같은 값으로 할때는 Arrays.fill() 활용)

//초기화 방법
//1 중괄호 사용
int intArr[] = {1,2,3};

//2 for문 이용해서 대입
for (int i = 0; i < intArray.length; i++) {
    intArray[i] = i;
}

for (int numbers : intArray) {
    System.out.println(numbers);
}

//배열을 모두 같은 값으로 초기화
Arrays.fill(intArray, 5);

 

얕은 복사

//얕은 복사 (바람직하지 않음)
int arr1[] = new int[3];
int arr2[] = arr1;
arr2[0] = 75;
System.out.println(arr1); //같은 주소
System.out.println(arr2); //같은 주소
System.out.println(arr1[0]); //75

 

깊은 복사 (메서드를 이용하면 .clone() 혹은 Arrays.copyOf() 활용)

//깊은 복사
//for문 이용
int a[] = {1,2,3,4};
int b[] = new int[a.length];

for (int i = 0; i < b.length; i++) {
    b[i] = a[i];
}

//메서드 이용
int c[]  = a.clone(); //그러나 2차원 이상 배열에서는 얕은복사가 됨
int d[] = Arrays.copyOf(a, a.length); //어떤 배열복사할 것인지, 그 배열의 길이를 매개변수로

 

String 배열

public static void main(String[] args) {
        //문자 char 1byte
        //문자열 String
        //String = char[]
        //String은 char를 가지고 배열을 만든 것

        //String 기능 활용
        String str = "ABCD";

        //lenth
        int strLength = str.length();
        System.out.println(strLength);

        //charAt(int index)
        char strChar = str.charAt(0);
        System.out.println(strChar);

        //substring(int formIdx, int toIdx)
        String subStr = str.substring(0,3);
        System.out.println(subStr);

        //equals(String str)
        String newStr = "ABCE";
        boolean strEquals = newStr.equals(str);
        System.out.println(strEquals); //false

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

        //반대로 char[] -> String
        char chrArray[] = {'A','B','C'};
        String charArrayString = new String(chrArray);
        System.out.println("char[] -> " + chrArray); //메모리 주소값
        System.out.println("String -> " + charArrayString); //문자열

    }

 

다차원배열

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

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        array[i][j] = 0;
    }
}

 

가변배열(작은배열 안에서 각각 길이가 다를 때)

//가변배열
//작은배열 길이 선언을 생략
int array[][] = new int[3][];

//배열 원소마다 각기 다른 크기로 지정
array[0] = new int[2];
array[1] = new int[3];
array[2] = new int[4];

//중괄호로 초기화도 가능함
int array2[][] = {
        {10,20},
        {30},
        {40,50,60}
};

 

리스트

//list
//순서가 있는 데이터의 집합 (중복허용)
//배열과 다른 점 -> 최초길이를 몰라도 만들 수 있음. 가변적임
//Array -> 정적배열
//List(==ArrayList) -> 동적배열(크기가 가변적으로 늘어남)
//생성 시점에 작은 연속된 공간을 요청해서 참조형 변수들을 담아놓는다
//더 큰 공간이 필요하면 더 큰 공간을 받아서 저장함

//꺽쇠안에는 래퍼클래스가 들어가아함
ArrayList<Integer> intList = new ArrayList<Integer>();

intList.add(1);
intList.add(2);
intList.add(3);

System.out.println(intList.get(2));

//2번째 인덱스에 있는 값을 15로 바꿈
intList.set(2,15);

intList.remove(2);

//list 전체 값 삭제
intList.clear();

//list 값 확인
System.out.println(intList.toString());

 

링크드리스트

//링크드 리스트
//메모리에 남는 공간을 요청해서 여기저기 담아놓는다
//그래서 실제값이 있는 주소값으로 목록을 구성하고 저장하는 자료구조

//기본적 기능은 ArrayList와 동일
//링크드 리스트는 값을 여기저기 나누어 담아놓은 것을 화살표로 이어놓았기 때문에 값을 조회하는 속도가
//인덱스 방식보다 느림
//대신에 리스트 중간에 값을 추가하거나 삭제할 때 용이함

LinkedList<Integer> linkedList = new LinkedList<Integer>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);

System.out.println(linkedList.get(0));
System.out.println(linkedList.toString());

//2번 인덱스에 4라는 값을 추가
linkedList.add(2,4);
System.out.println(linkedList.toString());

linkedList.set(0,30);
System.out.println(linkedList.toString());

linkedList.remove(2);
System.out.println(linkedList.toString());

linkedList.clear();
System.out.println(linkedList.toString());

 

생성자

public class Person {
    //속성 == 필드, 멤버변수
    String name;
    int age;
    String gender;
    String email;

    //생성자
    //객체를 어떻게 만들지 강제하는 것
    //생성자는 리턴타입이 없다
    //생성자는 클래스와 이름이 항상 같아야함

    //this는 위에 필드 가리킴 색깔이 같음! 헷갈리니까 this.필드라고 하는 것 

    Person(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    Person(String name, int age, String gender, String email) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.email = email;
    }

    //기본 생성자, 클래스 안에 아무것도 안하면 기본생성자가 디폴트
    Person() {
    }


    //기능 == 메서드
    void walk() {
        System.out.println("I'm walking");
    }

    String getName(){
        return this.name;
    }
    
}

 

객체 생성

Person john = new Person("john", 15, "Male");
Person jane = new Person("jane", 16, "Female", "test@naver.com");
Person kane = new Person();

john.walk();
System.out.println(john.getName());

생성자에서 정의한 필드대로 입력해야 함. 왜냐하면 생성자가 객체를 어떻게 만들지 강제하였기 때문이다. 

 

유용한 꿀팁

객체나 자료구조를 생성하거나 변수를 선언할 때 타입선언 실수를 많이 하기 때문에 

"함수()" 나 "new 클래스()" 형태까지만 입력하고 알트+엔터를 해주면 인텔리제이가 알아서 변수를 선언해준다!

 

인상깊었던 부분은 배열은 참조형 변수라서 메모리 주소값을 저장하기 때문에 얕은복사라는 것이 일어나게 되고 이를 피하기 위해서 깊은복사를 해줘야 한다는 점이었다. 그리고 클래스와 객체 생성부분. 학교에서 처음 자바 배울 때 죽어도 이해가 되지 않던 부분이 이제 조금씩 이해되기 시작했다.😂 생성자는 객체를 어떻게 생성할지 강제하는 것! 그리고 this는 너무 신경쓰지 말자. 그냥 필드에서 선언해놓은 부분과 헷갈려서 관습적으로 하는 것이니 그냥 '이거'라는 뜻으로 이해해도 될 것 같다. 

내일은 계산기 과제 level1을 해결하고 3주차 강의를 수강한 후에 level2를 해결해야겠다. 

 

오늘도 열심히 공부한 나 자신 수고했다...!

나라도 칭찬해줘야지 힘이 날것같다🥹