34일차 - java (연산자, 표준 입/출력, 배열-push, pop, copy, delete)

Yohan·2024년 4월 8일
0

코딩기록

목록 보기
49/156
post-custom-banner

3. 데이터타입

  • 타입이 다른 데이터의 연산에서 작은 쪽으로 캐스팅하고싶으면 작은 쪽 부호로 전체를 묶어줌
    -> 즉, int 이하의 사이즈를 가진 타입은 연산시 결과가 자동으로 int로 캐스팅
		int s = 10;
        double o = 5;
        int r = (int) (s * o);
        System.out.println("r = " + r); // int


        byte b1 = 100;
        byte b2 = 50;

        int r3 = b1 + b2;
        System.out.println(r3);

        char cc = 'A';
        int plusNum = 3;
        char r4 = (char) (cc + plusNum); // D
        System.out.println("r4 = " + r4);

4. 연산자

논리연산자

  • &, &&: 양쪽 항의 논리값이 모두 true일 경우에만 true가 도출
  • |, ||: 양쪽 항의 논리값 중 한 쪽만 true여도 true를 도출
  • 기호를 두 개씩 작성하면 단축 평가 로 진행
/*
&&, || -> 단축 평가 연산 (short circuit operation)
		 - 좌항의 연산 결과가 전체 연산 결과에 영향을 미칠 경우
		  우항의 연산을 진행하지 않습니다.
*/

int x = 10, y = 20;

System.out.println(x > 10 && (y / 0 == 10)); //false
System.out.println(x > 10 || y < 30); //true

연산자 우선순위

  • 단항(++, -- , !) > 이항(*, /, % ...) > 삼항(?:) > 대입(=)

자바에서 난수 만들기

  • Math.random()을 통해 난수를 만들 수 있는데 주의해야할 점이 있음
  • 자바스크립트와는 다르게 Math.floor() 대신 (int)를 통해서 정수로 변환시켜주게 되는데 (int)로 감쌀 때 (Math.random() * n) 처럼 전체를 () 로 꼭 묶어주어야함 !
		// Math.random =>       0.0 <=  < 1.0
        // (int) Math.random => 0 <=  < 1

        // Math.random * 10 =>         0.0 <=  < 10.0
        // (int) (Math.random * 10) => 0 <=  < 10
        // -> Math.random * n 을 반드시 괄호로 묶어줌
        int random = (int) (Math.random() * 10) + 1;

5. 표준 입/출력

표준 출력

  1. 줄 개행을 포함하지 않는 print();
  2. 자동으로 줄 개행 기능을 포함해 주는 println();
  3. 형식 지정 표준 출력 함수 printf();
  • 개행은 println();만 가능

포맷팅 서식 문자 종류

  • %s: 문자열포맷팅
  • %d: 정수
  • %f: 실수
  • %c: 단일문자
System.out.printf("%s의 강아지\n", name);

		int month = 12;
		int day = 25;
		String anni = "크리스마스";
		
		//12월 25일은 크리스마스 입니다.
		System.out.println(month + "월 " + day + "일은 " + anni + " 입니다.");
		System.out.printf("%d월 %d일은 %s입니다.\n", month, day, anni);

		//실수를 표현하는 서식문자 %f -> 기본 6자리까지 표현.
		//%.[자리수를 지정하는 숫자]f -> 원하는 자리수까지 표현.
		//%라는 문자 자체를 표현할 때는 %% 쓰시면 됩니다.
		double rate = 64.126;
		System.out.printf("합격률은 %.2f%%입니다.", rate);

표준 입력

  • 자바의 표준 입력 함수는 따로 존재 X
    -> 대신 표준 입력 장치(객체)를 제공 (Scanner)
  1. import 선언
import java.util.Scanner; // Scanner 클래스의 정보를 import 하자
  1. Scanner 객체를 생성
Scanner scan = new Scanner(System.in); // 입력준비 딱 1회만 하면됨
  1. Scanner가 제공하는 메서드들을 이용하여 입력값을 받자
		// 문자 입력받기
        System.out.print("이름: ");
        String userName = scan.nextLine();
        System.out.println("userName = " + userName);

        // 정수 입력받기 - 문자를 입력받은 뒤 정수로 변환, Integer.parseInt()
        System.out.print("출생년도: ");
        int birthYear = Integer.parseInt(scan.nextLine());
        System.out.println("birthYear = " + birthYear);
  • String userName = scan.nextLine(); 을 통해 userName에 내가 입력한 것을 저장할 수 있음
  • 입력받을 때 print를 이용하면 개행되지 않고 입력할 수 있고, println을 이용하면 개행된 후에 입력할 수 있게됨
  • 정수로의 변환은 Integer.parseInt()를 이용하면 됨

6. 조건문

7. 반복문

8. 탈출문

9. 배열

  • heap에 배열이 생성
  • stack에는 해당 배열의 주소값을 저장해서 주소를 보고 heap에 있는 배열에 접근 가능 (배열을 가리키는 것을 포인터라고함)
  • 배열 내부를 문자열 형태로 확인하고 싶다면 Arrays 클래스가 제공하는 toString()을 사용

배열의 특징

  1. 동종 모음 구조: 같은 타입의 데이터만 배열에 담을 수 있음
  2. 크기가 불변함: 크기를 동적으로 늘이거나 줄일 수 없음

배열의 생성 순서

  1. 배열 변수 선언
int[] numbers; // 타입[] 변수이름;
  1. 배열의 객체를 생성 (크기 지정)
numbers = new int[5]; // 생성할 때 배열의 크기를 지정
  1. 배열 값 초기화
        numbers[0] = 50;
        numbers[1] = 77;
        numbers[2] = (int) 66.7;
        numbers[3] = numbers[0] + 20;
        numbers[4] = 100;
//        numbers[5] = 10; // 크기를 지정해놓았기 때문에 불가능
  • 배열의 길이
System.out.println(numbers.length);
  • 배열의 순회 (for)
for (int i = 0; i < numbers.length; i++) {
     System.out.printf("numbers[%d]: %d\n", i, numbers[i]);
}
  • 배열의 순회 (forEach)
// 배열 순회 forEach : 단축키 iter
for (int n : numbers) {
    System.out.println("n = " + n);
}
  • 배열 내부 간결하게 출력 (Arrays.toString()
System.out.println(Arrays.toString(numbers));
  • 배열 한번에 만들기 (변수선언 + 객체생성)
    -> {}로 묵어주는 것이 포인트
int[] pointList = new int[] {10, 20, 30, 40};
System.out.println(Arrays.toString(pointList));
  • 만약 배열변수 선언과 동시에 값을 초기화 한다면 new Type[] 생략 가능
    -> 변수 처음에 만들때만 생략 가능, 수정 등에는 생략 불가능
String[] pets = {"멍멍이", "짹짹이", "콩수니"};
System.out.println(Arrays.toString(pets));
pets = new String[] {"zzz", "fff"};
System.out.println(Arrays.toString(pets));
  • 배열을 생성만하고 값을 안넣으면?
    -> 각 타압의 기본값 으로 미리 값을 넣어놓음
    -> 기본값: 정수 0, 실수 0.0, 논리 false, 문자(char): 공백, 기타: null
        byte[] bArr = new byte[3];
        double[] dArr = new double[6];
        boolean[] blArr = new boolean[4];
        String[] sArr = new String[5];

        System.out.println(Arrays.toString(bArr)); // [0, 0, 0]
        System.out.println(Arrays.toString(dArr)); // [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
        System.out.println(Arrays.toString(blArr)); // [false, false, false, false]
        System.out.println(Arrays.toString(sArr)); // [null, null, null, null, null]
        System.out.println(bArr.length); // 3
        System.out.println(dArr.length); // 6
        System.out.println(blArr.length); // 4
        System.out.println(sArr.length); // 5

배열끝에 데이터 추가 (push)

  • java는 javascript처럼 push를 통해 쉽게 추가할 수 없음
  • 새로운 배열을 생성해서 진행
		// push: 맨 끝에 데이터 추가
        int[] numbers = {10, 20, 30, 40};
        int newNumber = 50;

        // 1. 기존 사이즈보다 1개가 큰 새로운 배열 생성
        int[] temp = new int[numbers.length + 1];

        // 2. 기존 데이터를 새로운 배열에 전부 복사
        for (int i = 0; i <numbers.length; i++) {
            temp[i] = numbers[i];
        }

        // 3. 새 배열의 끝 인덱스에 넣을 데이터 추가
        temp[temp.length -1] = newNumber;

        // 4. numbers에 저장된 주소값을 temp의 주소값으로 변경
        numbers = temp;

        // 5. temp는 더이상 배열을 관리하면 안됨
        temp = null;

        System.out.println("numbers: " + Arrays.toString(numbers));
        System.out.println("temp: " + Arrays.toString(temp));

배열끝에 데이터 삭제 (pop)

  • 마찬가지로 새로운 배열을 생성해서 진행
		int[] numbers = {10, 20, 30, 40, 50, 60};

        // pop: 배열의 맨 끝 데이터를 삭제하면서 꺼내옴

        // 1. 기존사이즈보다 1개 적은 사이즈의 배열을 생성
        int[] temp = new int[numbers.length -1];

        // 2. 원본 배열에서 맨 끝 인덱스를 제외한 모든 내용 사본에 복사
        for (int i = 0; i <temp.length ; i++) {
            temp[i] = numbers[i];
        }

        // 삭제값 백업 (pop의 특징)
        int removedNumber = numbers[numbers.length -1];

        // 3. 주소값 이전
        numbers = temp;
        temp = null;

        System.out.println("numbers: " + Arrays.toString(numbers));
        System.out.println("temp: " + Arrays.toString(temp));
        System.out.println("삭제된 값 = " + removedNumber);

배열 데이터 복사

  • 배열복사가 된다면 원본과 복사본은 달라야함
    -> 새로운 배열을 생성하지 않고 진행할 경우에는 주소복사가 되어 원본과 복사본이 같아짐
    배열 주소복사가 돼서 원본과 복사본이 똑같은 주소를 가지게 되는 것에 주의! (복사본만 수정, 삭제 하고싶은데 원본도 수정, 삭제되는 문제가 발생할 수 있음)
  • 마찬가지로 새로 배열을 생성 후에 반복문을 통해 값을 넣어주어 복사
		String[] pets = {"멍멍이", "야옹이", "짹짹이"};
//      String[] petsCopy = pets; // 배열 복사가 아니라 배열 주소복사

        // 배열 복사 : 새로운 배열을 생성 후 반복문을 통해 값을 넣어줌
        String[] petsCopy = new String[pets.length];
        for (int i = 0; i < pets.length; i++) {
            petsCopy[i] = pets[i];
        }

        pets[1] = "냥냥이"; // 복사 후 원본 수정

        System.out.println("pets = " + Arrays.toString(pets));
        System.out.println("petsCopy = " + Arrays.toString(petsCopy));

배열에서 원하는 위치의 값 삭제

int[] numbers = {1, 3, 5, 7, 9, 11};

위와 같은 배열이 있다고 생각해보자. 여기서 나는 5를 삭제하고 싶다. 그렇다면 어떻게 해야할까?
1. 5 -> 7로 바꿔서 , [1, 3, 7, 7, 9, 11] 만듦
2. 7 -> 9로 바꿔서 , [1, 3, 7, 9, 9, 11] 만듦
3. 9 -> 11로 바꿔서, [1, 3, 7, 9, 11, 11] 만듦
4. numbers보다 길이가 1 작은 temp 임시배열 생성
5. temp 배열 길이만큼 반복문을 돌며 numbers의 인덱스들을 넣음
6. [1, 3, 7, 9, 11] 의 배열을 얻을 수 있음
-> 즉, 1 ~ 3번 과정을 반복문에 넣은다면 내가 원하는 위치의 값을 삭제할 수 있음 !

package day02;

import java.util.Arrays;

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

        // 배열에서 원하는 위치의 값 삭제하기
        int[] numbers = {1, 3, 5, 7, 9, 11};

        int targetIndex = 0; // 내가 삭제하고싶은 인덱스

        for (int i = targetIndex; i < numbers.length - 1; i++) {
            numbers[i] = numbers[i + 1];
        }
          // 5 삭제 (targetIndex = 2)
//        numbers[2] = numbers[3]; // 5 -> 7, [1, 3, 7, 7, 9, 11]
//        numbers[3] = numbers[4]; // 7 -> 9, [1, 3, 7, 9, 9, 11]
//        numbers[4] = numbers[5]; // 9 -> 11, [1, 3, 7, 9, 11, 11]



        int[] temp = new int[numbers.length -1];
        for (int i = 0; i <temp.length; i++) {
            temp[i] = numbers[i];
        }
        numbers = temp;
        temp = null;

        System.out.println(Arrays.toString(numbers));
    }
}
profile
백엔드 개발자
post-custom-banner

0개의 댓글