[ITWILL : JAVA]배열과 함께쓰는 메서드

ITWILL학원 : 10강 JAVA BY 윤미영강사

1. for each문

향상된 for문인 for each문은 기존 for문과 비교해서 초기값과 증감식을 사용하지 않으며 배열이 가지고 있는 요소들을 특정 변수로 바로 할당해서 사용할 수 있게한다

1
2
3
for(데이터타입 변수명 : 반복할 배열명/컬렉션){
//반복할 문장
}

이 반복문은 내부적으로 배열의 인덱스 0번부터 배열의 길이만큼을 반복한다.

  • 장점 : 전체적으로 for문을 훨씬 간결히 작성할 수 있다.

  • 단점

    • 인덱스를 사용하지않고 사용불가능.
    • 반복 처리할 범위를 지정불가능.
  • 결론 : 따라서 인덱스를 써야하거나 특정범위를 반복해야하는 경우는 전통적인 for문을 쓰고 아닐 경우 for each를 쓰면 된다

아래 for문과 for each문의 예시를 보자.
랜덤한 짝수를 3개를 뽑은 뒤 그 합을 구해보자.

랜덤한 짝수 3개뽑기는 index를 사용해야하기때문에 for each를 쓸 수 없다.
뽑은 짝수합을 구하는 경우 index도 필요없고 특정범위반복도 필요없기때문에 for each를 쓰면 한결 간결해진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] evendatas = new int[3];

//랜덤한 짝수 3개 뽑기
for(int i=0;i<evendatas.length;i++){
evendatas[i] = rd.nextInt(8)+1;
if(evendatas[i]%2 !=0){
evendatas[i] = evendatas[i]+1;
}
System.out.print(evendatas[i]+"\t");
}

//뽑은 짝수합구하기
evenSum = 0;
for(int data : evendatas){
evenSum+=data;
}
System.out.print("랜덤한 짝수의 합 : "+evenSum);

2. 배열 데이터의 정렬

배열과 같은 자료구조에 대해서는 정렬에 대한 요구사항이 빈번하다.
정렬을 구현하기 위한 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬 등 여러가지 방식이 있다.

Arrays.sort() 오름차순정렬

Arrays클래스 API를 이용하기 위해 import java.util.Arrays;해줘야한다.
만약 문자열을 관리하는 배열이 파라미터로 들어온다면 대문자->소문자의 사전순으로 정렬한다.

1
2
3
4
5
6
7
8
9
10
int[] data = {5, 7, 2, 9, 1};
Arrays.sort(data);

//정렬 후 출력
for(int x : data){
System.out.print(x + "\t");
}

//출력값
1 2 5 7 9

3. 배열 데이터의 출력 : Arrays.toString(arr)

배열데이터를 출력하기 위해서 for문을 이용해도 되지만 Arrays클래스 API를 이용하여 출력할수있다.
Arrays.toString(arr)사용하기 위해서는 import를 먼저 해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String [] arr1 = {"JAVA", "is", "Not", "bad"};
Arrays.sort(arr1);

//배열출력1 : for each이용
for(String s :arr1){
System.out.print(s + "\t");
}
//배열출력2 : Arrays클래스 API이용
System.out.println(Arrays.toString(arr1));


// 출력값
JAVA Not bad is
[JAVA, Not, bad, is]

4. Arrays 로또 만들기

배열에 무작위 숫자로 구성된 로또를 만들고 정렬 후 출력하는 게임을 만들어보자.
로또는 1~45사이의 숫자로 구성되며 6개의 숫자를 랜덤으로 뽑느다.
그리고 모든 숫자의 중복 x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int[] selected = new int[6]; //로또를 저장할 배열
int[] fullBall = new int[45]; //모든 공의 정보를 가지고 있는 배열

int cnt= 0;
Random rd = new Random();
while(cnt < 6){ //총 6개의 공을 선택할 조건
int index = rd.nextInt(45); //0~44사이의 정수
int ball = fullBall[index];
if(ball ==0){ //중복체크
selected[cnt] = index +1;
fullBall[index] = -1;
cnt ++;
}
}
Arrays.sort(selected);
System.out.println(Arrays.toString(selected));
}
  1. random.nextInt(n)
    이는 0~(n-1)개의 정수를 랜덤하게 생성한다.
    그렇다면 여기선 random.nextInt(45)이므로 0~44사이의 랜덤한 정수를 생성하게된다.
    왜그럴까?
    selected된 공은 index에서 +1해주기때문이다
    if문을 보자.
    랜덤으로 index가 0이 걸리면 선택된 공은 1이되고
    랜덤으로 index가 44가 걸리면 선택된공은 45가된다.

  2. ball if문으로 중복체크
    ball = 0이 참이면 이 fullBall[index]가 한번도 뽑힌적이 없는 숫자라는 의미이다.
    그리고 선택되어지고 selected[cnt] = index +1을 준다.
    그리고 이미 뽑힌 수는 -1로 값을 준다.
    그렇게되면 다음번에 또 뽑혔을때 -1이기때문에 거짓이 되어 selected가 되지않는다.

1
2
3
예를 들어
fullBall[2]가 처음뽑혔으면 if문이 참이므로 selected[1]가 되고 로또숫자는 3이다.
그리고 난 뒤 fullBall[2] = -1로 바뀌어서 다음번에 뽑혀도 if문에서 거짓으로 팅겨나간다

5. System.arraycopy()

배열은 한 번 생성되면 메모리의 연속성때문에 그 크기를 변경할 수 없다.
하지먼 프로그래밍을 하다 보면 처음 예상했던 데이터의 개수보다 더 많은 데이터를 관리해야할 경우가 있다.
이를 예방하기위해 처음부터 배열의 크기를 크게 지정해버린다면 불필요한 메모리를 낭비하는 꼴이다.

필요에 따라 배열의 길이를 늘이기 위해서는 기존배열의 길이를 늘일수는 없고
배열의 길이 큰 새로운 배열은 만들고 기존 데이터를 복사해 넣은 다음 새로운 데이터를 추가해야한다.

첫번째 방법 : for문과 Arrays.toString()이용

1
2
3
4
5
6
7
8
9
int[] source = {1,2,3};
int[] newSource = new int[7]; //원하는 배열길이만큼의 숫자입력

for(int i=0; i<source.length; i++){
newSource[i] = source[i];
}System.out.println(Arrays.toString(newSource));

//출력값
[1, 2, 3, 0, 0]

두번째 방법 : System.arraycopy()와 Arrays.toString()이용

System.arraycopy(기존배열명, 카피할데이터인덱스, 새로운배열명, 데이터붙여넣을시작인덱스, source.length);

아래처럼 데이터붙여넣을시작인덱스에 2를 넣었기때문에 출력값은 인덱스2번부터 [0, 0, 1, 2, 3, 0, 0]부터 붙여넣기가 된다.
만약 0을 넣었다면 출력값은 인덱스0번부터 [1, 2, 3, 0, 0, 0, 0]이 된다.

1
2
3
4
5
6
7
int[] source = {1,2,3};
int[] newnewSource2 = new int[7] //원하는 배열길이만큼의 숫자입력
System.arraycopy(source, 0, newnewSource2, 2, source.length);
System.out.println(Arrays.toString(newnewSource2));

//출력값
[0, 0, 1, 2, 3, 0, 0]

5. Integer.parseInt(파라미터)

GUI환경에서 가장 잘 사용하는 메서드이다.
정수의 형태인 파라미터를 int로 변경해 리턴한다.
만약 파라미터가 정수형태가 아닐 경우 NumberFormatException 에러가 난다.

[ITWILL : JAVA]369게임만들기

ITWILL학원 : 9강 JAVA BY 윤미영강사

JAVA 369게임만들기

369게임을 만들어보았다.
일의 자리와 소수점첫번째자리를 나누어서 처리했다.

변수 input는 사용자가 scanner를 통해 입력하는 숫자이다.
변수 remainder는 숫자를 10으로 나눈뒤 소수점첫째짜리를 3,6,9인지확인한다.

함수 divideTen()는 10으로 나눠서 369인지 체크하는 반복되는 코드이므로 밖으로 뺐다.
함수를 어디로 빼야하는지몰랐는데 main함수밖이면서 class안으로 빼야하는 것이었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class game369 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("1~99까지 정수를 입력해주세요");
int input = sc.nextInt();
int remainder = input%10; //소수점첫번째자리체크

if(remainder == 3){
divideTen(input);
}else if(remainder == 6){
divideTen(input);
}else if(remainder == 9){
divideTen(input);
}
}

private static void divideTen(int input){
if(input/10 == 3 || input/10 == 6 || input/10 == 9){ //1의자리체크
System.out.println("박수짝짝");
}else{
System.out.println("박수짝");
}
}
}

강사님 코드는 아래와 같다.
박수치는 횟수를 카운드해서 if조건문으로 박수2번이면 박수짝짝을 입력하는 함수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("1~99까지 정수를 입력해주세요");
int num = sc.nextInt();
int digit10 = num/10; //1의자리체크
int digit1 = num%10; //소수점첫째자리체크

int clapCnt = 0;//박수횟수

if(digit1%3 == 0 && digit1 !=0){ clapCnt++; } //else가 필요없다. 변수가 0일때도 카운트되기때문에 꼭 제거해야한다.
if(digit10%3 == 0 && digit10 !=0){ clapCnt++; } //변수가 0일때도 카운트되기때문에 꼭 빼줘야한다.

if(clapCnt == 2){
System.out.println("박수짝짝");
}else if(clapCnt == 1){
System.out.println("박수짝");
}
}

[ITWILL : JAVA]자바포맷스트링, Random 숫자 뽑기, 상황별 반복문 추천(for, while, do~while)

ITWILL학원 : 8강 JAVA BY 윤미영강사

1. JAVA format string

자바 format string은 System.out.printf(“”,)를 이용하여 나타낸다.

자바 포맷 스트링

주요한 변환코드는 아래와 같다.

주요 포맷스트링

포맷스트링으로 자릿수도 표현할 수 있다.

포맷스트링 자릿수 표현1

포맷스트링 자릿수 표현2

2. Random 숫자 뽑기

  • Random 라이브러리 : 무작위 숫자를 생성하기 위해 Random 객체를 사용해야하기때문에 import해야한다.

  • null : 아무 값이 없다. 예약어이고 실제 값은 맨 뒤에 위치해있다.

    • 실무에선 null보단 “”로 String을 초기화시켜준다.
    • 왜냐하면 보통 DB에서 데이터를 가져와서 사용하는 경우가 많은데 null로 초기화해버리면 생각하지 못한 에러가 발생할 수 있기때문이다.
  • nextlnt(n); : 매서드로 0 ~ (n-1)사이의 무작위 정수를 생성한다.

아래 코드는 0부터 99중에 랜덤숫자를 뽑아서 50이상이면 큰수로 출력하고 그 이하면 작은수로 출력한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Random;

public static void main(String[] args) {
String result = null;
Random myRandom = new Random();

System.out.println("----- 큰수 작은수체크");

int num1 = myRandom.nextInt(100); //0 &#126; 99사이의 정수
if(num1 >= 50){
result ="큰 수";
}else{
result ="작은 수";
}
System.out.printf("%d는 %s이다.%n", num1, result);
}

2. 상황별 반복문 추천

반복문은 크게 3가지 종류가 있다.
for 문, while 문, do ~ while문!

상화별로 추천하는 반복문이 있다.

  • for 문 : 반복해야하는 횟수가 지정될 경우 유리

    • ex) 10번 먹으세요
    • 1
      2
      3
      for(초기화;조건식;증감식){
      조건식이 true일때 실행할 문장
      }
  • while 문 : 반복횟수보다는 상황에 의한 반복을 정의할 경우 유리

    • ex) 다 먹으세요
    • 1
      2
      3
      4
      while(조건식){
      조건식이 true일 경우 실행할 문장
      증감식;
      }
  • do ~ while문 : while작업 중 최소 한 번은 실행해야 할 작업이 있는 경우 유리

    • ex) 한 번 먹어보고 맛있으면 다 먹으세요, 홈페이지의 메뉴 (꼭 한번은 실행되어져야하기때문에)
    • 1
      2
      3
      4
      5
      초기화;
      do{
      조건식이 true일때 실행할 문장
      증감식;
      } while(조건식);

[ITWILL : JAVA]비트연산자, 이진수와 십진수 변환

ITWILL학원 : 7강 JAVA BY 윤미영강사

1. 비트연산자

2진수 형태로 연산을 진행한다.
따라서 2진수로 표현할 수 있는 정숨나이 피연산자가 될 수 있다.
흔히 쓰는 건 아니고 임베디드개발환경이나 안드로이드개발환경에서 종종 사용하는 연산방법이다.

비트연산자 종류

a /= b의 의미는 a|b 연산값을 a에 할당한다는 의미이다.

참고링크 : 비트연산자 개념 및 예시

2. 이진수와 십진수 변환

비트연산자를 잘 활용하려면 십진수와 이진수의 변환이 머리속에서 빨리 일어나야한다 ㅋㅋㅋㅋㅋㅋㅋㅋ
이진수는 중학교때 배웠을 거같지만… 기억나지않으므로 다시 한번 더 보자.

이진수와 십진수 변환

[ITWILL : JAVA]리터럴(literal), byte + byte가 왜 에러날까, int VS Integer, void와 int차이

ITWILL학원 : 6강 JAVA BY 윤미영강사

1. 리터럴(literal)

실제 값.
변수의 값이 변하지 않는 데이터(메모리 위치안의 값)이다.

참고링크 : 상수와 리터럴차이

2. byte + byte가 왜 에러날까

b1과 b2는 연산결과는 잘 나오지만 b3의 연산결과는 에러가 난다.

1
2
3
4
5
6
7

byte b1 = 10;
byte b2 = 20;
System.out.println(b1+b2); //30

byte b3 = b1+b2;
System.out.println(b3); //Type mismatch: cannot convert from int to byte

산술연산자는 기본적으로 int형이다. 그래서 type mismatch가 나타난다
int형으로 산술하면 잘~출력된다

1
2
3
4
int i1 = 100;
int i2 = 200;
int i3 = i1+i2;
System.out.println(i3); //300

3. int VS Integer

아래 데이터형의 차이점이 뭘까?

  • int a; 기본데이터형
  • Integer i; 참조데이터형
    • 라이브러리
    • 매서드사용가능
1
2
3
4
5
6
int a1 = 100;
Integer a2 = 100;

System.out.println(a2.toString()); //100
System.out.println(Integer.MAX_VALUE); //2147483647
System.out.println(Integer.MIN_VALUE); //-2147483648

4. void와 int차이

void와 int 매서드의 차이를 알아보자
public static 뒤에 void가 오기도하고 int등 다른 데이터타입이 올 수 있다.

  • void의 의미 : myPrint가 가지고 있는 값이 없을때, 돌려줄값이 없을때 return이 없을때 사용.
  • int의 의미 : 반대로 가지고있는 값이 있을때, 돌려줄값이 있을때. return과 함께 사용
1
2
3
4
5
6
7
public static void 매서드이름(매개변수){ //void 매서드 정의하기
System.out.println("void 매서드")
}

public static int 매서드이름(int 변수명1, int 변수명2){ //int 매서드 정의하기
return 변수명1 + 변수명2;
}

[ITWILL : JAVA]기본 반복문암기, String인지 체크(typeof), N개의 양수를 받아 최대값 출력, char와 String의 차이점 산술연산자

ITWILL학원 : 5강 JAVA BY 윤미영강사

1. 기본 반복문암기

  1. 1~10까지 나열하기
1
2
3
for(int i=1; i<=10; i++){
System.out.print(i);
} //12345678910
  1. 누적합구하기
1
2
3
4
5
int sum = 0;
for(int i=0; i<=10; i++){
sum+=i
}
System.out.println(sum) //55
  1. 카운트세기
    자주 사용하는 카운트 세기 반복문
1
2
3
4
5
int count = 0;
for(int i=1; i<=10; i++){
count+=1;
}
System.out.println(count); //10

2. 자바에서의 String인지 체크(typeof)

자바에서는 typeof는 없고 각 데이터별로 체크할 수 있는 방법이 있다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 1. 사용자로부터 입력받아오자
String [] str = new String[3];
Scanner sc = new Scanner(System.in);

for(int i=0; i<str.length; i++){
str[i] = sc.next();
}

// 2. 사용자가 입력한 데이터가 string인지 체크

String s = Arrays.toString(str);
if( s instanceof String) {
System.out.println('참');
}else{
System.out.println("거짓");
}

3. N개의 양수를 받아 최대값 출력

scanner로 사용자로부터 양수 n개를 받아 그 중 최대값을 화면에 출력해보자
기본적으로 양수 n개를 받는 코드를 작성하면 아래와 같다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Scanner sc = new Scanner(System.in);
System.out.println("양수 5개를 입력하세요");
int [] num = new int[5];

for(int i=0; i<num.length; i++){ //1. 숫자 5개 입력받기
num[i] = sc.nextInt();
}

for(int i=0; i<num.length; i++){ //2. 양수인지 체크(정수전체에서 max를 구하고싶다면 이부분을 없애면된다)
if( num[i] > 0){
System.out.print(num[i]+ " ");
}else{
System.out.print("양수아님 ");
}
}System.out.println();

이제 두가지 방법으로 최대값을 구해보자

  1. 첫번째 방법 : 삼항연산자 사용
1
2
3
4
5
6
7
int max = num[0];

for( int i = 1; i < num.length; i++) { //최대값구하기
max = num[i] > max ? num[i] : max;
}

System.out.println("최대값은 : "+ max);
  1. 두번재 방법 : if문 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int max = num[0];

    for(int i=1; i<num.length; i++){
    if(max > num[i]){
    max = max;
    }else{
    max = num[i];
    }
    }
    System.out.println("최대값은 : "+ max);

위의 코드를 자세히보자. 리팩토링할 부분이 보인다.
max가 가장 큰 수 인 경우 굳이 동일값(max = max;)을 대입할 필요가 없다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int max = num[0];

for(int i=1; i<num.length; i++){
if(max < num[i]){
max = num[i];
}
}
System.out.println("최대값은 : "+ max);


// 위의 식을 간단하게 {} 중괄호를 생략할 수 있다
// 중괄호생략은 블록안의 내용이 한줄일때 생략가능하다


for(int i=1; i<num.length; i++){
if(max < num[i]) max = num[i];
}
System.out.println("최대값은 : "+ max);

중괄호를 생략하니 세상 간단간단해보인다

4. char와 String의 차이점 산술연산자

char는 연결연산자가 사용이 안된다.
String이 어느 한 변수 이상에 있는 경우에는 연결연산자가 사용이 된다.
캐릭터에서 연결연산자를 사용하고싶으면 변수들 사이에 “”를 입력해줘야한다.

1
2
3
4
5
6
char c1= 'a', c2= 'b';
System.out.println(a + b); //195


String c1= 'a', c2= 'b';
System.out.println(a + b); //ab

만약 char를 ab로 나타내고 싶다면 변수들 사이에 “”해주면 된다

1
2
char c1= 'a', c2= 'b';
System.out.println(a +""+ b); //ab

[ITWILL : JAVA]Method, 변수와 상수, 배열 Array, new키워드

ITWILL학원 : 4강 JAVA BY 윤미영강사

1. Method

괄호가 있으면 다 메서드라고 부른다
매서드는 항상 Class라는 주인이 있어야 한다.

다른 사람이 만들어 놓은 매서드를 사용할 수 있다. = 라이브러리라고 부른다

예시

  • main() : 메인매서드
  • println() : OutputStream이라는 라이브러리안에 정의되어있는 매서드
  • Scanner sc = new Scanner(System.in) sc.next(); InputStream 라이브러리에 정의되어 있는 next()매서드

2. 변수와 상수

  1. 변수
    변하는 값.
    값을 저장할 수 있는 메모리 위치.
    변수를 사용하기위해서는 항상 변수선언을 데이터타입과 함께 먼저 해줘야한다.

  2. 상수
    변하지 않는 하나의 값
    앞에 final이 붙는다

  • 예시 PI : 3.141592…
  • 사용법 : final double PI = 3.141592;

3. 배열 Array

배열이란 쉽게말해 여러개의 변수를 한꺼번에 선언하는 것이다
변수를 선언한다는 것은 메모리에 a변수가 생성이 된다는 의미이다.
배열에서는 변수갯수를 선언할 수 있다 -> int [] ar = new int[10]는 메모리에 10개의 정수 변수 생성된다는 의미이다

여기서 주의할 점은 ar1의 데이터타입은 int가 아님을 명심하자!
int[]의미는 int를 관리한느 배열타입이지 int타입이 아니다.
ar1의 데이터타입은 기본형에 포함되지않는 참조형의 데이터타입이다.

배열객체를 생성하기 위해서는 new키워드와 함께 어떤 데이터를 몇개나 저장할지에 대한 정보가 필요하다.
그렇다면 new키워드란 무엇일까?
아래 잘 설명한 블로그가 있어서 가져왔다.
참고링크 : 자바 변수들의 메모리 구조,new 키워드

배열변수선언에는 두가지 방법이 있다

3-1. 첫번째 배열선언 방법

배열생성과 배열갯수만 선언하는 방법이다
int [] ar1 = new int[3]로 배열과 배열갯수를 한꺼번에 선언. 초기화는 안됨!

1
2
3
4
5
6
7
8
9
10
11
12
13
int [] ar1;  //배열생성 : 메모리에 a변수 생성

ar1 = new int[3]; //배열갯수선언. 메모리에 3개의 정수 변수 생성. 값을 넣어주지않기때문에 초기화는 아니다

// 1번과 2번을 합쳐서 한줄로 많이 쓴다
int [] ar1 = new int[3]; // 초기화하지 않은 배열은 기본적으로 0의 값을 가진다
ar1[0] = 0;
ar1[1] = 0;
ar1[2] = 0;

for(int i=0; i<ar1.length; i++){
System.out.print(ar1[i]);
} //000

데이터형마다 기본값이 다르다
기본데이터형이 아닌 참조데이터형인 경우 기본값이 다르다

  • 기본데이터형의 기본값은 데이터형에 따라 다르다
    • int 는 0
    • double은 0
    • char는 ‘’(빈칸)
1
2
3
4
char [] chs = new char[2];
for (int i=0; i<chs.length; i++){
System.out.println(chs[i]);
} //00 - 유니코드 -> ''''(빈칸2개)
  • 참조데이터형의 기본값은 null (자바언어의 예약어이고 실제 값이 없다는 의미이다)
    • string은 null
  1. String형
1
2
3
4
String [] str = new String[3];
for (int i=0; i<str.length; i++){
System.out.print(str[i]);
} // nullnullnull
  1. 참조형
    기본적으로 같은 타입을 한 배열에 넣을 수 있다.
1
2
3
4
5
Person[] p = {new Person, new Person};

SpiderMan[] sp = {new SpiderMan, new SpiderMan};

AquaMan[] aq = {new AquaMan, new AquaMan};

타입이 다른 참조형데이터를 하나의 배열에 넣을 순 없을까?
다형성을 이용하면 가능하다.
상속관계인 경우에만 타입이 다른 참조형데이터를 하나의 배열에 묶을 수 있다.

1
2
3
4
5
6
Person[] p = {new Person. new Person}

Dobject d = new Dobject[3];
d[0] = new Line();
d[1] = new Circle();
d[2] = new Reat();

3-2. 두번째 배열선언 방법

배열생성과 초기화를 한꺼번에 선언하는 방법이다

int [] ar2 = {10, 20, 30}

여기서는 new int[5]를 하지않아도 된다 왜냐면 위의 코드 자체에 변수갯수선언이 포함되어있다
이 방법은 테스트용으로 주로 사용할뿐 실무는 new int[]형태로 사용한다

1
2
3
4
5
int [] ar2 = {10, 20, 30}; //배열생성과 초기화 한꺼번에!

for(int j=0; j<ar2.length; j++){
System.out.println(ar2[j]);
}
  1. 위의 두 방법의 차이점
    일반적으로는 new int[]형태를 더 많이 쓰인다
    왜냐하면 보통 다른 파일이나 데이터베이스의 내용을 가져오기 때문에 변수갯수가 정해져있다.
    배열을 사용하려면 항상 크기를 미리 알아야한다.
    만약 배열의 크기를 모른다면 쓸 수 있는 가장 큰 수를 적어주면되지만 대신 메모리를 많이 잡아먹는다.
    그래서 사용하는 것이 Collection(컬렉션)이다
  • Collection 컬렉션 :
    • 참조형데이터형태
    • 배열과 같은 역할을 하지만 크기를 모를때 사용
    • 정적 메모리 할당이 아닌 동적 메모리 할당이 되어서 필요한 만큼 공간을 계속 추가할수있다
    • 컬렉션참고링크

[ITWILL : java]Scanner라이브러리와 equals()를 이용한 사칙연산계산기, if문과 switch문 변환 예시, 반복문과 break

ITWILL학원 : 3강 JAVA BY 윤미영강사

1. Scanner 라이브러리

기능 : 키보드로부터 데이터를 받아온다.
java.util 패키기에 있는 중요한 라이브러리이므로 사용법은 암기필수.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1. 선언
import java.util.Scanner;
// import라는 예약어는
// 단축키는 ctrl + shift + O 누르면 자동으로 import 생성됨

Scanner sc = new Scanner(System.in);
// 의미는 나는 이제부터 스캐너라이브러리를 변수명(ex: sc)이라는 이름으로 불러서 사용하겠다는 의미
// System.in 자바의 표준입력으로 키보드를 의미한다. 즉 키보드로부터 데이터를 받아오겠다라는 의미

System.out.println("단어를 입력하세요");


//2. 변수 s에 저장
String s = sc.next();
// 콘솔창에 입력한 것들이 변수 s에 저장된다.


//3. 출력
System.out.println(s);


//4. 예시
System.out.println("이름을 입력해주세요");
String s = sc.next();

System.out.println("연락처를 -없이 입력해주세요");
int i = sc.nextInt();

System.out.println("입력하신 "+ s +"님의 휴대폰번호 0"+ i +" 가 맞습니까?");

다른 명령어들은 아래와 같다

1
2
3
4
5
6
7
8
sc.nextInt()
//키보드로부터 정수데이터를 가지고 옴

sc.next()
//키보드로부터 string(한단어)를 가지고 옴

sc.nextLine()
//키보드로부터 string(공백을 포함한 한줄전체)를 가지고 옴

2. Scanner 라이브러리를 이용한 사칙연산계산기 만들기

처음 떠오른 코드는 아래와 같다.

1
2
3
4
5
6
7
8
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int convertOper = int(operator);
int data2= sc.nextInt();

System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + convertOper+ data2)+"입니다")

그런데 string으로 연산자를 받으니까 연산이 되지않으니까 int로 형을 바꿀려고했는데 Cannot cast from String to int 에러가 났다.

사칙연산자들의 데이터타입이 무엇인지 구글링했는데 그래도 잘 모르겠어서
강사님께 여쭈어보니 string을 int로 받아도 해결할 수 없다고 한다.

if문을 써서 equals()를 쓰는게 낫다고 했다
equals()를 어떻게 쓰는지 찾아본 뒤 바로 적용해보았다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Scanner sc = new Scanner(System.in);
System.out.println("원하는 사칙연산 수식을 입력하세요");
int data1 = sc.nextInt();
String operator = sc.next();
int data2= sc.nextInt();

if("+".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 + data2)+"입니다");
}else if("-".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 - data2)+"입니다");
}else if("*".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 * data2)+"입니다");
}else if("/".equals(operator)){
System.out.println("입력하신 " + data1 + operator + data2 +"의 값은 "+ (data1 / data2)+"입니다");
}else{
System.out.println("또 잘못입력함? 다시 입력해주세요")
}

작동 잘된다! 역시 가르쳐주는 사람이 있으니까 좋다
switch문으로 바꾸어보자

1
2
3
4
5
6
7
8
9
10
11
switch(operator){
case "+" : System.out.println("덧셈결과는 " + (data1+data2));
break;
case "-" : System.out.println("뺄샘결과는 " + (data1-data2));
break;
case "*" : System.out.println("곱셈결과는 " + (data1*data2));
break;
case "/" : System.out.println("나눗셈결과는 " + (data1/data2));
break;
default : System.out.println("또 잘못입력함? 다시 입력해주세요");
}

3. 제어문 종류

  • 조건문
    • if(조건문)
    • switch(값)
  • 반복문
    • for(반복횟수)
    • while(조건식)

4. 조건문 : Switch문

정수식안에는 변수, 숫자, 문자, 조건들이 들어갈 수 있다.
case안의 값에는 and연산자, Boolean, 실수는 아예 들어갈 수 없다.
break;문이 없을 경우 다음 break;를 찾을때까지 모든 문장을 실행한다.
default문은 가장 마지막 작업으로 위의 case 이외의 값인 경우 default문은이 출력되고 Switch문은 끝난다

1
2
3
4
5
6
7
8
9
switch( 정수식 ){ //숫자,문자
case 값 : 출력값1;
break;
case 값 : 출력값2;
break;
case 값 : 출력값3;
break;
default : 출력값4;
}

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

switch(season){
case "spring" :
System.out.println("봄 사랑 벚꽃 말고 by 아이유");
break;
case "summner" :
System.out.println("party by 소녀시대");
break;
case "autumn" :
case "fall" :
System.out.println("11:11 by 태연");
break;
case "winter" :
System.out.println("Santa tell me by Ariana grande");
break;

default : System.out.println("잘못입력하셨거나 스페..펠..ㄹ..잉 틀리셨나봐요?");
}

5. 조건문 : switch문과 if문 비교

임의의 노래방 점수를 터미널에 입력하면 점수대별로 아래 문구를 출력하고싶다.

100점의 문구 : 실화냐? 가수다! 가수가 나타났다!

80 ~ 99점의 문구 : 노래실력이 아주 좋으신데요~

40 ~ 79점의 문구 : 매력이~ 넘쳐요

40점미만의 문구 : 노ㄹ..아니 박수실력이 나날이 늘어가네요!
그외의 점수들 : 잘못된 숫자를 입력하셨습니다.다시 입력해주세요

  1. if일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Scanner sc = new Scanner(System.in);
    System.out.println("점수를 입력하세요");
    int inputScore = sc.nextInt(10);

    if (inputScore == 100){
    System.out.println("WOW " + inputScore + "점 실화냐? 가수다! 가수가 나타났다!");
    }else if(inputScore >= 80 && inputScore < 100 ){
    System.out.println(inputScore + "점! 노래실력이 아주 좋으신데요~");
    }else if(inputScore >= 40 && inputScore < 80 ){
    System.out.println("내 노래 점수는 " + inputScore + "점! 매력이~ 넘쳐요");
    }else if(inputScore < 40 && inputScore >= 0){
    System.out.println(inputScore + "점! 노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    }else{
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }
  2. switch일때

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    switch(inputScore/10){
    case 10 :
    System.out.println("100점 실화냐? 가수다! 가수가 나타났다!");
    break;
    case 9 :
    case 8 :
    System.out.println("노래실력이 아주 좋으신데요~");
    break;
    case 7 :
    case 6 :
    case 5 :
    ystem.out.println("매력이~ 넘쳐요");
    break;
    case 4 :
    case 3 :
    case 2 :
    case 1 :
    System.out.println("노ㄹ..아니 박수실력이 나날이 늘어가네요!");
    break;
    default :
    System.out.println("잘못된 숫자를 입력하셨습니다.다시 입력해주세요");
    }

6. 반복문 : for문

for문의 기본은 아래와 같다

1
2
3
for(int i=0; 조건식; 증감식){
출력값
}

간단한 예시를 보면서 어떻게 컴파일이 되는지 순서를 보자

1
2
3
for(int i=1; i<10; i++){
System.out.println("Hi");
}
  1. 조건문 확인 : i는 1이고 10보다 작다 ->true
  2. 괄호안의 코드출력
  3. 증감식 확인 : 이제 i는 2
  4. 조건문 확인 : i는 2이고 10보다 작다 ->true
  5. 괄호안의 코드출력
  6. 증감식 확인 : 이제 i는 2
  7. 계속반복
  8. 조건문 확인 : i는 10이고 10보다 작다 -> false
  9. for문 종료

7. 반복문 : break

반복문에서 break를 사용하면 반복문이 바로 종료된다.

구구단 3단 예시를 들어보자

1
2
3
4
5
6
7
8
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27,

출력값의 마지막 컴마를 없애고 싶다.
어떻게 하면 좋을까? if와 break를 사용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==9){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15,18,21,24,27

break를 입력하면 if조건이 만족되는 순간 바로 반복문이 종료된다
아래 예시는 구구단 3단 나타내지만 if조건문을 5까지 입력했다
3*5까지 진행하는 구구단이다.

1
2
3
4
5
6
7
8
9
10
11
12
int multiply;
int result;
multiply = 3;
for(int x=1; x<=9; x++){
result = multiply * x;
if(x==5){
System.out.println(result);
break;
}
System.out.print(result + ",");
}
//출력값 : 3,6,9,12,15

x가 6,7,8,9가 남았지만 if조건을 만족하고 break때문에 반복문이 종료된다.