Java - 기초문법(자료형, 연산자, 배열, 조건/반복문)

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


기본 자료형 (/객체 자료형)

기본 자료형은 데이터가 변수에 직접 저장되고, 객체 자료형은 객체 메모리 주소(레퍼런스)가 변수에 저장된다.

형변환

  • 자동(묵시적) 형 변환: 작은 공간의 메모리에서 큰 공간의 메모리로 이동
byte by = 10;
int in = by;
System.out.println("in = " + in);
  • 명시적 형 변환: 큰 공간의 메모리에서 작은 공간의 메모리로 이동
    • 데이터 누실 가능성이 있음
int iVar = 100;
byte bVar = (byte)iVar;
System.out.println("bVar = " + bVar);

iVar = 123456;
bVar = (byte)iVar;
System.out.println("bVar = " + bVar);

서식문자

  • %d: 10진수 / %o: 8진수 / %x: 16진수
  • %c: 문자 / %s: 문자열 / %f: 실수

연산자

증감연산자

  • 전위연산자(++x): 연산 후 출력
  • 후위연산자(x++): 일단 값을 출력 후 메모리상으로 연산된 숫자가 들어가있음
int x = 10;
System.out.println(x++); //결과값: 11
System.out.println(++x); //결과값: 10

논리연산자

  • &&: 논리곱(AND), 모두 참이면 참
  • ||: 논리합(OR), 하나라도 참이면 참
  • ! : 논리부정(NOT), 상태를 부정
Boolean x = true
Boolean y = false

System.out.println(x&&y) //결과값: false
System.out.println(x||y) //결과값: true

조건(삼항)연산자

조건식 ? 식1:식2 조건식이 참이면 식1이 실행되고, 거짓이면 식2가 실행된다.

x = 10;
y = 20;
int result = 0;
result = (x>y) ? 100:200;
System.out.println("result: " + result);

배열

인덱스를 이용해서 자료형이 같은 데이터를 관리하는 것

자료형 [배열기호] 배열이름 = new키워드(연산자) 배열의 크기

// 배열 선언 후 초기화
int[] arr1 = new int[5];

// 배열 선언과 초기화를 동시에
int[] arr2 = {10,20,30,40,50};

배열을 선언했다는 것은 메모리에 배열의 크기만큼 메모리를 확보했다는 것을 의미

배열의 메모리 크기

  • 배열을 구성하는 데이터의 자료형에 따라서 배열의 메모리 크기가 결정된다.
  • 기본 자료형 데이터를 담고있는 변수와 달리 배열 변수는 배열 데이터의 주소를 담고있다.
// 배열 기본순서
int[] arrAtt1 = {10, 20, 30, 40, 50, 60};
int[] arrAtt2 = null;
int[] arrAtt3 = null;

// 배열 길이
System.out.println("arrAtt1.length : " + arrAtt1.length); //결과값: 6

// 배열 요소출력(배열의 값, Arrays라는 객체를 이용함)
System.out.println("arrAtt1 : " + Arrays.toString(arrAtt1)); //결과값: [10,20,30,40,50]

// 배열 요소 복사(복사하려는 배열, 복사하려는 배열의 크기)
arrAtt3 = Arrays.copyOf(arrAtt1, arrAtt1.length);

/*arr3과 arr1은 주소를 복사해서 같은 곳{10,20,~}을 가리키고 있는 것이 아니라,
arr1에 해당하는 주소가 가리키고 있는 값들을 그대로 복사해서
메모리 어딘가에 다시한번 만들어놓고 그 메모리 주소를 arr3이 가지고 있는 것

그래서 두 값은 같을 지언정 가지고 있는 메모리는 다르다는 것을 생각하자! (같은 객체가 아님)
요소만 복사해서 새로운 곳에 새로운 객체(배열)을 만들어놓고 새로운곳을 가리킴!*/

System.out.println("arrAtt3 : " + Arrays.toString(arrAtt3)); //결과값: [10,20,30,40,50]

// 배열 레퍼런스
arrAtt2 = arrAtt1;

/*즉 같은 주소를 가지고 있음 (같은 주소를 레퍼런스를 하고있다)
대입했다는 것은 새로운 객체를 만드는 것이 아니라, arr1의 객체는 그대로 놔두고
arr2도 arr1과 같은 동일한 주소{10,20,~}를 담고있다는 것
같은 곳을 바라보는 레퍼런스*/

System.out.println("arrAtt1 : " + arrAtt1); //결과값: [I@4439f31e
System.out.println("arrAtt2 : " + arrAtt2); //결과값: [I@4439f31e
System.out.println("arrAtt3 : " + arrAtt3); //결과값: [I@5dfcfece
// arr1, arr2은 같은 배열의 주소를 갖고, arr3은 다른 주소를 가지고있음

다차원 배열

int[][]  arrMul  = new int[3][2]; //3행 2열

조건문 (if/switch)

조건의 결과에 따라서 양자택일 또는 다자택일을 진행

if문 (양자택일 / if, else, elseif)

int num1 = 10;
int num2 = 20;

if (num1==num2) {
	System.out.println("같다.");
} else if (num1 > num2) {
	System.out.println("크다.");
} else {
	System.out.println("작다.");
}

switch문 (다자택일)

비교대상이 되는 결과값과 선택사항이 많을 경우 사용

int score = inputNum.nextInt();

switch (score) { //key값은 비교할 대상의 값을 넣어줌
case 100:
case 90:
	System.out.println("수");
	break;
case 80:
	System.out.println("우");
	break;
case 70:
	System.out.println("미");
	break;

default: //사용자가 입력한 값이 그 어느값도 아닐때(위에 설정한 값중에서) 실행해라.
	System.out.println("what score?");
	break;
}

inputNum.close();

반복문 (for/while/do~while)

프로그램 진행을 특정 조건에 따라 반복적으로 진행

for문

for(int = i; (i>10), i++){…}

for(int=i; (i<10); i++){
  System.out.println(i);
}

while문

while(true or false){…}

int i = 1;
while(i<10) {
  System.out.println(i);
  i++;
}

do ~ while문

while문과 비슷하지만 차이점은 조건결과와 상관없이 무조건 최초 1번은 {…}의 프로그램을 수행 do{…}while(rNum <10)

do {
  System.out.println("어쨌든 무조건 한번은 실행된다.");
} while(false);
int i = 1;
do {
  System.out.println(i);
  i++;
} while(i<10);