상세 컨텐츠

본문 제목

[TIL#8] Java를 자바랑 part.3 <연산자, 조건문(if, switch-case), 반목문(for, while, break, countinue), 배열(Arrays.), 깊은복사&얕은복사>

내배캠/Chapter2

by DK9 2023. 10. 16. 19:14

본문

<어제 검색해서 찾은 것들>

 : 없을 무

 

<데일리 루틴>

내배캠 공부

밥 잘 먹기

운동 (사유 : 감기)

 

 

1. 연산자

 : 계산할 때 계산의 대상이 되는 것이 피연산자(변수, 상수 등), 계산의 목적이 되는 것이 연산자(+,-,*,/ 등)

 

 1) 연산자의 우선순위 : 교육과정에서 배운 수학의 것과 동일. 연산자 종류에 따른 우선순위는 '산술 > 비교 > 논리 > 대입' 순으로.

 

 2) 연산 전에 두 피연산자의 타입이 다른 경우 :  두 피연산자의 타입을 둘 중 저장공간 크기, 표현 범위가 더 큰 타입으로 일치시킨다. double > float > long > int > short

 

2. 연산자의 종류

 1) 산술 연산자 : +, -, *, /, %(나눗셈 이후 나머지를 출력), <<(비트 연산자) , >>

비트 연산
컴퓨터의 가장 작은 단위인 bit의 자리수를 옮기는 것        연산이 가장 빠름
<<(왼쪽으로 자리 수 옮기기 = 2의 배수로 곱셈)       >>(오른쪽으로 자리수 옮기기 = 2의 배수로 나눗셈)
(3 << 2); //자리수를 2번 옮긴다. 값 12 3*2*2        (8 >> 2); //자리수를 2번 옮긴다. 값 2 8/2/2


 2) 비교 연산자 : < , > , <=, >=, ==, !=, 비교 연산자는 꼭 2개씩만 비교, 2개 초과 비교 시 논리 연산자와 함께 사용

1 < 3 < 5 불가능        1 < 3 || 혹은 && 3 < 5 가능


 3) 논리 연산자 : &&(and), ||(or), !(not)
 

4) 대입 연산자 : =, ++(= += 1, 1 증가), --(= -= 1, 1 감소), -=, +=(=복합대입연산자 = 기본 대입 연산자를 줄여 쓴 것)

int num = 10;

num += 2;        num -= 2;        num *= 2;        num /= 2;        num %= 2;
값 12            값 10              값 20            값 5             값 0

a++ a사용한 후 1 증가 /  a-- a를 사용한 후 1 감소
++a a를 1 증가시킨 후 사용 /  --a a를 1 감소시킨 후 사용

 5) 기타 연산자 : (type) =형 변환 연산자, ? : ==삼항 연산자(=if 문), instance of(클래스와 객체 관련)

//형 변환 연산자
int A = 39 + (int)37.595; // 39 + 더블을 인트로 바꾸고 37
double B = (double) 94 + 45.234; // 인트를 더블로 바꾸고 94.0 + 45.234

//삼항연산자 비교연산자와 항상 함께 쓰인다.
// 조건 ? 참 : 거짓 (조건일 때 ? 참인 경우 실행 : 거짓인 경우 실행)
int X = 1;  int Y = 9;

boolean b = (X==Y) ? true : false; // 값은 false
String s = (X != Y) ? "정답" : "오답"; // 값은 정답
int max = (X > Y) ? X : Y; //값은 9(=Y)
int min = (X < Y) ? X : Y; //값은 1(=X)

//instance of(클래스, 객체 관련)
//피 연산자가 조건에 명시된 클래스의 객체인지 비교하여 맞으면 true 틀리면 false

 

2. 조건문

 1) if문 : 특정 조건에 따라 다른 연산을 수행하고 싶을 때 사용하는 조건문, 여러 개의 조건문을 수행할 수 있다.

입력값 정의한 후 // 입력값=조건 : 참 // 입력값 != 조건 : 거짓

if (조건) {조건이 참일 경우 수행할 연산}
if (true) {System.out.println("조건이 참일 경우 실행, if문 입니다.");} // "if문 입니다' 출력됨

 2) if-else문 : if문 이후 false일 때 실행할 연산을 추가한 형태.

if문 + else {조건이 거짓일 경우 수행할 연산}
if (true) {System.out.println("조건이 참일 경우 실행, if문 입니다.");}
else {System.out.println("조건이 거짓일 경우 실행, else문 입니다.");}

 3) if-elseif-else : if-else문 형태에서 참인 조건을 추가할 수 있는 형태. 추가할 조건마다 elseif를 사용한다.

if문 + elseif(참인 조건) {조건이 참일 경우 수행할 연산} + else문
if (1 < 3) {System.out.println("조건이 참일 경우 실행, if문 입니다.");}
else if (3 < 5) {System.out.println("새로운 조건이 참일 경우 실행, elseif문 입니다.");}
else {System.out.println("조건이 거짓일 경우 실행, else문 입니다.");}

 4) 중첩 if문 : if문의 조건이 참일 경우 수행할 연산에 if문을 추가한 형태, 계속 중첩할 수 있고 else문에도 작성이 가능하다.

if (조건) {if문(if else, if elseif else 등)}
 if (true) {if (num == 1) {System.out.println("조건이 true, num은 1, 충첩 if문입니다.");}
 	else if (num == 2) {System.out.println("조건이 true, num은 2, 충첩 if문의 else if문입니다.");}
    	else if (num == 3) {if (A==1) {System.out.println("조건이 true, num은 3, A는 1 충첩 if문의 else if문의 중첩 if문 입니다.");
        		}
            }
        } else if (true) {
            System.out.println("새로운 조건이 참일 경우 실행, elseif문 입니다.");
        } else {
            System.out.println("조건이 거짓일 경우 실행, else문 입니다.");
        }
    }
}

 5) switch-case문 : if문보다 가독성이 좀 더 좋은 표현, break; 와 default : (수행할 연산)을 꼭 같이 사용해야 한다. 하나의 조건만 지원한다.

switch ( 피연사자 ) {
 case ~~ : 연산; break;  //~~일 때 연산하고 switch문 끝냄
 case @@ : 연산; break;  //@@ 일 때 연산하고 switch문 끝냄
 default : 연산;} 	 //default(=if문의 else) 일 때 연산하고 switch문 끝냄

 

3. 반복문

 1) for문 : 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 반복문. 초기값이 조건문을 만족할 때까지 연산을 수행하면서 회차마다 증가연산을 수행한다. 초기값과 조건문, 증가연산은 공란으로 작성할 수도 있다. 특정 조건은 초기값과 조건문을 통해서 정의하고 반복할 때마다 값을 증가시키려면 증가연산을 정의한다. for문은 중첩해서 사용할 수 있다.

(for문은 정수형)초기값 : int i=0  /  조건문 : i < 4  /  증가 연산 : i++

for(초기값; 조건문; 증가연산) { 실행할 연산 }
for (int i = 0; i < 4; i++) {System.out.println(i + "번째 출력!")}

//구구단
for (int i = 2; i <= 9; i++)
	{for (int j =2; j <= 9; j++)
    	{System.out.println(i +" 곱하기 "+ j +" = "+ i*j +"입니다." );
        }
    }

 값은 '0번째 출력, 1번째 출력, 2번째 출력, 3번째 출력' 으로 나옴

 

 2) 향상된 for문 : 3개의 표현(초기값, 조건문, 증가연산)을 배열을 사용하여 2개로 간소화

2) int[] A = {3, 6, 9, 12, 15};
for (int B : A) {System.out.println(B)}

 값 '3 6 9 12 15'로 출력, A 배열의 값을 int B에 순차적으로 사용한다.

 

 3) while문 : for문과 같이 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 반복. 조건문을 만족(true)하면 연산이 반복수행되고, 불만족(false)이면 반복을 중단. 

while (조건문) {실행할 연산}
int A = 0;
while (A < 4) {System.out.println(A + "째 반복");  A++;}

 값은 '0째 반복, 1째 반복, 2째 반복', A가 0일때 sout출력한 후 A를 1 증가시키고 다시 while문 반복. A1, A2, A3출력 이후 A값이 4가 되면서 while문 조건 불만족. while문 종료

 

 4) do-while문 : do 연산을 실행한 다음 do연산을 while 조건이 만족할 때까지 반복하겠다. 조건을 최초에 만족하지 않더라도 특정작업을 무조건 선행해야 하는 상황에 사용하는 반복문.

do {실행할 연산} while (조건);
int A = 4;
do {System.out.println(A);}
	while (A < 3);

 값은 4, do를 실행하고 while의 조건을 봤는데 A는 언제나 3보다 큼. 따라서 while이 조건 불만족이기에 종료.

 

4. break

 : 가장 가까운 블록의 반복문, switch문을 중단시킴.

while (true) {
    System.out.println("별점을 작성해주세요");
    double snum = Double.parseDouble(Kinput());
    double rate = snum * 100 / 5;

    if (snum >= 0 && snum <= 5.0) {
        System.out.println("별점 : " + snum + " ( " + rate + "%)");
        break;
    } else {
        System.out.println("0~5 사이의 숫자를 입력해주세요.");
    }
}

while을 계속해서 반복(while의 조건이 항상 참(=만족) 하기 때문), snum이 0보다 크거나 같 고(&&(=AND)) 5.0(double) 보다 작거나 같을 때 sout 하고 break(=가장 가까운 반복문, switch문 중단) 후 코드 진행. if조건이 아니라면 조건을 달성할 때까지 while문 반복.

 

5. coutinue

 : break와 비슷하지만, continue를 만나는 순간 해당 반복을 생략하는 코드.

int num = 0;
while (num < 3) {num++;
    if (num == 2) {continue;}
    System.out.println(num + "출력");
}

값은 '1출력, 3 출력', 2출력이 생략되었다.

 

6. 배열

  : 한 번에 많은 양의 데이터를 다루거나 계산할 때 사용한다. 반복문과 자주 사용된다.

  1) 선언과 생성

A) 선언
데이터타입 [] 변수이름; (일반적인 방식)					데이터타입 변수이름 [];

B) 생성
new 데이터타입 [숫자] // [숫자]갯수 만큼의 데이터타입을 저장할 배열을 new 만든다.

ex) 변수 선언과 비슷하다.
int[] Iarray = new int [8]; 	String Sarray[] = new int [4]; 	boolean Barray[] = new boolean [7];

int[] Iarray2;  Iarray2 = new int[2]; // 선언과 생성을 분리할 수 있다.

2) 초기화

  가. 배열에 특정값을 대입해서 선언

A) 직접 대입
int [] Iarray3 = {1, 2, 3, 4, 5};

B)
int [] Iarray = {7, 8, 9, 10, 11};
for (int i = 0; i < Iarray.length; i++){Iarray[i]= i;}

   A) 배열에 특정값을 대입해서 선언, Iarray3 배열을 선언하고 값은 1, 2, 3, 4, 5를 저장한다. 그러니 저장길이(=크기, 개수)는 5개이다.

   B) 반복문 등의 기능일 이용해 직접 대입, 예시는 for문의 경우.

 

 3) 순회

 : 배열의 값을 하나씩 뽑아서 조회한다.

int [] Iarray = {1, 2, 3, 4};

가. System.out.println(Iarray[1]);

나. for (int i=0; i<Iarray.length; i++) {System.out.print(Iarray[i] + " ");}

 {1, 2, 3, 4}를 저장하는 Iarray라는 배열을 만들고 데이터타입은 int로 한다.

  가. 단건 조회 : Iarray의 1번째 자리 값을 출력한다. 출력 값은 2.

  나. 다건 조회 : 여러 가지 방법 중 for문을 사용하는 경우.  for문으로 i = 0이고, i 가 Iarray배열의 길이(저장 개수) 보다 작고, for문을 실행할 때마다 i는 1씩 증가할 때, Iarray배열의 i번째 값을 출력한다. 출력 값은 1, 2, 3, 4.

 

 4) Arrays.

 : Java에서 배열에 관련된 모든 작업을 할 수 있는 메서드를 호출하는 메서드.

import java.util.Arrays;

int [] Iarray = {10, 20, 30, 40, 50};
Arrays.fill(Iarray, 1);

 Arrays.fill(적용할배열, 바꾸고싶은값) :  위의 예시에 적용하면 Iarray배열의 모든 값을 1로 초기화한다.

 

   가) 얕은 복사

int [] a = {1, 5, 7, 9, 11};
int [] b = a;

b[0] = 3;
System.out.println(a[0]);

 값이 3으로 출력된다. 그 이유는 참조변수는 특별한 저장공간(=heap영역)에 값이 저장되고, 주소 값을 가져와서 대입하기 때문이다.(3. 참조형 심화 참조)

https://getmsld9.tistory.com/entry/TIL6-%EB%82%B4%EB%B0%B0%EC%BA%A0-Chapter-2-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B8%B0%EC%B4%88-Java%EB%A5%BC-%EC%9E%90%EB%B0%94%EB%9E%91-part3?category=1185643

 

[TIL#6 내배캠 Chapter 2 프로그래밍 기초] Java를 자바랑 part.3

: 없을 무 내배캠 공부 밥 잘 먹기 운동 1. 아스키코드 : Java의 기본적인 문자 저장(=표현) 규칙 1) import : 해당 코드 안쪽으로 바깥으로부터 리소스를 가지고 들어온다 2) Scanner : 코드를 실행시키면

getmsld9.tistory.com

그렇기에 int [ ] b = a;는 a 배열을 가져온 것이 아니라 a 배열의 값이 저장된 주소 값을 가져오게 되는 것이고, a와 b는 동일한 주소를 공유한다. 따라서 b에서 수정해도 a도 값이 바뀌는 것이다. 이를 '얕은 복사'라고 한다.

 

   나) 깊은 복사

 : 새로운 배열을 똑같이 만들고 싶을 때 깊은 복사를 해야 한다. 여러 메서드를 사용하는 방법들이 있지만 여기서는 for문을 사용해 보겠다.

int [] a = {1, 5, 7, 9, 11};
int[] b = new int[a.length];

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

b[0] = 3;
System.out.println(a[0]);

 출력 값은 1이다. 새로운 배열을 선언하고 for문으로 a의 값을 돌아가면서 실행해서 b에 대입하였다. 그리고 난 후 b를 수정한다.

   다) clone ( )

 : 깊은 복사를 해주는 가장 간단한 메서드.

int[] a = { 1, 2, 3, 4 };
int[] b = a.clone();

하지만, clone() 메서드는 2차원이상 배열(배열의 값으로 배열이 오는 경우)에서는 얕은 복사로 동작한다.

 

   라) Arrays.copyOf( , )

 : 일반적인 방법

public static void main(String[] args) {

	int[] a = {1, 2, 3, 4};
	int[] b = Arrays.copyOf(a, a.length);

 Arrays.copyOf(복사하고싶은배열이름 , 복사하고싶은배열값의자리)

 

 

 

 

 

 

<TMI. 감기 걸렸다. 환절기 감기 조심하자>

관련글 더보기