자바 5강 - switch, for, 배열

2018. 11. 27. 22:40IT/JAVA

5강

클래스명 객체이름 = new 생성자();

 

new 라는 옵션에 생성자를 호출하여 메모리에 데이터를 저장할 공간을 만들고 객체이름은 할당된 메모리 주소를 가진다.

 

만약 String str = "java" 였을때

조건식이 str == "java" 인 경우 flase가 나온다. 왜냐하면 str은 레퍼런스 변수이기 때문에 “java"란 내용이 들어가는 것이 아니라 ”java"라는 문자열을 저장된 메모리 주소만을 가지고 있기 때문에 str 과 “java"는 서로 같지 않으므로 false가 반환되는 것이다. 그러므로 str.equals("java")라고 하면 true를 반환한다.

 

str = br.readLine();

java이거나 C면 처리를 하고 싶어 한다. 그래서 아래와 같이 소스코드를 하였다.

 

if(str.equals("java" || "c") {.....}

 

이때 컴파일을 하면 에러가 난다.

왜냐하면 OR라는 연산자는 기본적으로 ("java" || "c") 요 문장은 boolean이 와야 하는데 여기엔 문자열이 왔다는것에 문제가 있다. 그러므로 boolean을 반환할수 있는 값으로 바꿔주면 되는데 그것은 아래와 같다.

 

if(str.equals("java" || str.equals("c")) {....} 이렇게 한다면 원하는 결과를 얻을수 있다.

 

http://java.sun.com/j2se/1.5.0/docs/api/ 에서 String 클래스의 equals를 찾아보면 equals 메소드는 boolean이 반환된다 고적혀있다. api문서를 참고하면서 프로그래밍을 하면 문제를 쉽게 해결할 수 있으므로 자주 api본다.

 

 

switch 문 - 여러 가지중 한 가지를 택하는 경우 사용

switch을 만들면 ()안의 오는 값에 따라서 그 값에 해당하는 case 문으로 가서 그 case문부터 실행한다는 것이 switch문이다. case 문부터 실행한다는 것을 잘봐라. 그 라인부터 시작되고 끝까지 실행되는 메커니즘이기 때문에 내가 생각하는 액션이 오지않는 오동작될수 있다. 그러므로 break; 문을 사용하여 해당 case를 실행후 break;를 만나서 switch를 나가게 하면 자신이 원하는 동작을 할 수 있을 것이다.

 

public static void main (String args[]) {

char a='e';

switch(a){

case e: // 이것은 e라는 문자가 아니다. 이것은 변수이다. 그러므로 문자형에 맞는 ‘e'라고 찍어주면 에러없이 돌아갈 것이다.

System.out.println("글자는 e 입니다.");

break;

default:

System.out.println("DEFAULT");

break;

}

}

 

 

public static void main (String args[]) {

String a="Hello";

switch(a){ // (a)라는 값은 아니기 때문에 에러가 난다.

case "Hello": // 이것도 위와 같은 문제이다.

System.out.println("Hello입니다.");

break;

default:

System.out.println("DEFAULT");

break;

}

}

 

do while 문

일단 한번 실행해보고나서 조건을 판단하는 반복문이다.

 

* 고민하는게 있을 때 앉아서 고민만 하면 해결이 안된다. 고민과 관련된 일을 어느정도 해보면 해결이 되는경우가 있다. 예를들어, 내가 나의 진로를 편입할꺼냐 취업을 할꺼냐 고민한다고 해보자. 그럼 먼저 학원을 다녀보자. 거기서 맞으면 편입하는것이고, 안맞으면 취업하면 되는게 아니냐??? 인생사는게 고민만 하지말고 실행을 먼저 해보면 문제 해결에 많은 도움이 될 것이다.

 

* 반복문을 사용할 때 중심이 되는 변수를 하나하나 단계를 밟아보면 반복문은 쉬울 것이다. 어려울게 없다.

 

continue문

반복문에서 실행되다가 중간에 continue문을 만나면 반복문의 맨 처음으로 돌아간다.

public static void main(String args[]) {

int num = 0;

while(num <= 100) {

num++;

 

if((num%3)!=0 || (num)%7!=0) {

continue; // 반복문을 반복하는도중에 continue를 만났으니 아래 System.out.println();문을 실행하지 않고 반복문 맨위로 올라가서 또 차례대로 실행된다.

}

 

System.out.println(num + "는 3과 7의 공배수입니다.");

}

}

 

for문

다른 반복문보다 형식은 복잡한것에 비해 복잡하기 때문에 실수하는일이 적다(예로 들면 while에서 무한루프 도는 반복문을 만드는 것이 빈번하다)

 

 

* for문에서 (카운터)변수의 초기값과 (카운터)변수의 증감치는 생략될 수 있다.

=> for(;;){...} 이것도 가능한데 3개 다 생략하면 무한루프가 된다

 

* for문의 앞에서 변수를 선언하고 초기화 했을 때는 변수의 초기값을 입력하지 않아도 된다. 변수의 증감치를 입력하지 않았을 때는 실행문에서 변수의 값을 변경해야 한다.

** 변수의 값을 변경하지 않는다면 for문은 무한루프가 되어 종료되지 않는다.

 

조로가 가다가 적을 만나면

1. 칼을 뽑고

2. 적이 죽었는지 살았는지 확인

3. 적이 있다면 아래 찌르고

4. 위에 찌르고

5. 적이 죽었는지 살았는지 확인

6. 죽었다.

7. 조로가 길을 걷는다.

 

class Test

{

public static void main(String[] args)

{

int i,sum;

for(i=0,sum=0;i<=5;i++,sum+=i){

System.out.println("sum은"+sum);

}

System.out.println("for를 빠져나왔습니다.");

}

}

 

결과

C:\>java Test

sum은0

sum은1

sum은3

sum은6

sum은10

sum은15

for를 빠져나왔습니다.

 

 

3단 출력 프로그램

class Test

{

public static void main(String[] args)

{

for(int i=3, j=1;i<=30;i+=3,j++)

{

System.out.println(j+"숫자는"+i+"입니다");

}

System.out.println("프로그램이 끝났습니다.");

}

}

 

* 별수의 개별값을 하나하나 변해가면서 프로그램의 흐름을 따라가는 훈련이 필요하다.

* 영어에는 왕도가 없다. 말이 있는데 프로그래밍 언어를 배우는것에도 왕도가 없다. 매일매일 익숙해질때까지 사용해야 자연스럽게 몸에서 느낄수 있을 것이다.

 

구구단을 외자

class Test

{

public static void main(String[] args)

{

for (int i=2;i<=9 ;i++ )

{

for(int j=1;j<=9;j++)

{

System.out.print(i+"*"+j+"="+i*j+"\t");

}

System.out.println();

}

}

}

 

결과

C:\>java Test

2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18

3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27

4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36

5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45

6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54

7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63

8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72

9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

 

0<= x <= 10, 0 <= y <=10 일 때 가능한 (x,y)쌍에 대하여 x와 y의 값이 서로 다를 경우만 출력하는 프로그램을 작성하고 실행하여라.

class Test

{

public static void main(String[] args)

{

for(int x=0;x<=10;x++)

{

for(int y=0;y<=10;y++)

{

if(x!=y)

{

System.out.print("("+x+","+y+")");

}

}

System.out.println();

 

}

 

}

}

 

결과

C:\>java Test

(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9)(0,10)

(1,0)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(1,9)(1,10)

(2,0)(2,1)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10)

(3,0)(3,1)(3,2)(3,4)(3,5)(3,6)(3,7)(3,8)(3,9)(3,10)

(4,0)(4,1)(4,2)(4,3)(4,5)(4,6)(4,7)(4,8)(4,9)(4,10)

(5,0)(5,1)(5,2)(5,3)(5,4)(5,6)(5,7)(5,8)(5,9)(5,10)

(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,7)(6,8)(6,9)(6,10)

(7,0)(7,1)(7,2)(7,3)(7,4)(7,5)(7,6)(7,8)(7,9)(7,10)

(8,0)(8,1)(8,2)(8,3)(8,4)(8,5)(8,6)(8,7)(8,9)(8,10)

(9,0)(9,1)(9,2)(9,3)(9,4)(9,5)(9,6)(9,7)(9,8)(9,10)

(10,0)(10,1)(10,2)(10,3)(10,4)(10,5)(10,6)(10,7)(10,8)(10,9)

 

 

0 <= x <= 10, 0<= y <=10, 0<= z <=10 일 때 가능한 (x,y,z)쌍을 모두 출력하는 프로그램을 작성하라. (단,x, y, z의 값이 모두 같은 경우는 제외한다.)

class Test

{

public static void main(String[] args)

{

for(int x=0;x<=10;x++)

{

for(int y=0;y<=10;y++)

{

if(x!=y)

{

for(int z=0;z<=10;z++)

{

if(z!=y && z!=x)

{

System.out.print("("+x+","+y+","+z+")");

}

}

}

}

System.out.println("");

}

}

}

 

시험문제 - 자바기본문법(3) 38 ~ 41

class Test {

public static void main(String[] args) {

int i , j , cnt ;

cnt = 0 ;

for(i = 0 ; i < 5 ; i++)

for(j = 0 ; j < 5 ; j++)

cnt++ ;

cnt++ ;

cnt++ ;

System.out.println("[" + cnt + "]") ;

}

}

 

이것의 cnt의 결과값은 무엇인가??

 

배열

여러개의 동일한 데이터형의 변수를 묶어 놓는 것

배열의 인덱스는 0부터 시작한다.

 

배열의 선언

자료형 [] 배열명 = new 자료형 [배열크기];

* 배열도 클래스이기 때문에 new를 써야한다.

 

int [] a = new int [4];

int [] a 가 의미하는 것은 int형을 가지는 a라는 변수를 배열로 쓰겠다라는 뜻이다.

[]는 단지 a라는 변수가 배열이라는 것을 알려주는것만 알려주는 것이다.

new int [4] 가 의미하는 것은 메모리에 int형을 가지는 4개의 int만큼의 공간을 메모리에 할당한다. 라는 뜻이다.

 

배열의 크기를 구하기 위해서는 배열 객체의 맴버변수인 length를 사용하여 알수 있다.

a.length // 반환값은 4가 나온다.

 

이것을 활용하는 것은 반복문에서 조건에 유용하다.

int [] a = new int[4];

for(int i=0;i<a.length;i++)

{

System.out.println(a[i]);

}

 

10개의 요소를 갖는 정수형 배열 p를 선언하고 첫 요소부터 차례로 1,2,3,4,5,6,7,8,9,10을 대입한 후 그 배열의 값을 차례로 출력하는 프로그램을 작성하세요.

class Test

{

public static void main(String[] args)

{

int [] p = new int[10];

 

// p.length는 10을 반환할 것이다.

for(int i=0;i<p.length;i++)

{

p[i] = i+1;

}

 

for(int i=0;i<p.length;i++)

{

System.out.println(p[i]);

}

}

}

 

* vector는 배열의 발전된 형태로 vector를 이해하는데 배열을 알아야 적절히 사용할 수 있다. 지금 배열에 대해서 정확히 알고 넘어가자.

 

public static void main(String args[]) {

        int stuNum[] = {1, 2, 3};

        String stuName[];

        stuName = new String[3];

     

        stuName[0] = new String("정진철");

        stuName[1] = new String("강성우");

        stuName[2] = new String("김태수");

   

        System.out.println("번호\t이름\t");

        for(int index=0; index < stuNum.length; index++) {

            String text = stuNum[index]+"\t";

            text += stuName[index];

                 

            System.out.println(text);

        }

}

 

문자열 배열 객체를 만들었을 때 각각의 인덱스는 객체 이름으로 사용할 수 있다.

String stuName [] = new String[3]; // 문자열 객체를 지정할 수 있는 변수가 들어갈 배열을 만드는 행위이다.

 

StuName[0] = new String("ㅎㅎ“); // 문자열 객체 변수가 있기는 한데 메모리를 문자열을 가리키는 메모리 주소가 필요하다. 그래서 new라는 명령을 통해 ㅎㅎ가 메모리에 할당되고 그 메모리 주소를 StuName[0]에 저장하였다.

 

소녀시대, 원더걸스로 다시 코딩해보았다.

class Test

{

public static void main(String[] args)

{

String [] str = new String[4];

str[0] = new String("티파니");

str[1] = new String("유나");

str[2] = new String("안소희");

str[3] = new String("효크");

 

System.out.println("번호\t이름");

for(int i=0;i<str.length;i++)

{

System.out.println(i+1+"\t"+str[i]);

}

}

}

 

결과

C:\>java Test

번호 이름

1 티파니

2 유나

3 안소희

4 효크

 

* 변수를 선언하는 방법, 배열을 선언하는 방법은 아무런 자료 도움없이 할 수 있어야 한다. 기본적인 지식에서 응용방법이 나오는 것이다. 자연스럽게 될 때까지 연습을 하자.

 

int [] [] a = new int [2][5]

 

[2] : 행

[5] : 열

 

 

가로 세로

1열 2열 3열 4열 5열

--------------------

+00 +01 +02 +03 +04 + 1행

--------------------

+10 +11 +12 +13 +14 + 2행

--------------------

 

int [][]a = new int[3][4];

[0][0]

[0][1]

[0][2]

[0][3]

[1][0]

[1][1]

[1][2]

[1][3]

[2][0]

[2][1]

[2][2]

[2][3]

 

int [][] p = new int[3][1]

p[0][0]

p[1][0]

p[2][0]

 

 

문제 2차월 배열에 아래에서 보여주는 바와 같이 값을 할당하고 그림과 같이 출력하는 프로그램을 만들어라.

class Test

{

public static void main(String[] args)

{

int [][] a = new int[3][2];

int sum=0;

 

for(int i=0;i<a.length;i++)

{

for(int j=0;j<a[0].length;j++)

{

sum+=10;

System.out.print("a["+i+"]["+j+"]="+sum+", ");

}

System.out.println();

}

}

}