static 멤버


  • 객체 생성 없이도 사용가능한 멤버이다.
  • 클래스 당 하나만 생성되는 멤버이다.
  • 클래스 로딩시에 멤버가 생성된다.

static 멤버의경우 여러 멤버들과 공유될 수 있다.

예시


전역 함수로 작성하고자 하는 abs,max,min의 3개의 함수를 static 메소드로 작성하고 호출하는 사례를 보여라.


class Calc{
    public static int abs(int a) {
        return a>0?a:-a;
    }
    public static int max(int a, int b) {
        return (a>b)?a:b;
    }
    public static int min(int a, int b) {
        return (a>b)?b:a;
    }
}

public class CalcEx {
    public static void main(String[] args) {
        System.out.println(Calc.abs(-5));
        System.out.println(Calc.max(10,8));
        System.out.println(Calc.min(-3,-8));
    }
}

실행결과
5
10
-8

예시


static 멤버를 이용하여 달러와 원화를 변환 해주는 환율 계산기를 만들어보자.


import java.util.Scanner;

class CurrencyConverter {
    private static double rate;
    public static double toDollar(double won) {
        return won/rate;
    }
    public static double toKWR(double dollar) {
        return dollar * rate;
    }
    public static void setRate(double r) {
        rate = r;
    }
}

public class StaticMember {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("환율(1달러)>> ");
        double rate = scanner.nextDouble();
        CurrencyConverter.setRate(rate);
        System.out.println("백만원은 $" + CurrencyConverter.toDollar(1000000)+"입니다.");
        System.out.println("$100는 "+ CurrencyConverter.toKWR(100)+ "원입니다.");
        scanner.close();
    }
}

실행결과
환율(1달러)>> 1332
백만원은 $750.7507507507507입니다.
$100는 133200.0원입니다.

메소드 형식


  • 메소드는 클래스의 멤버 함수이다.

인자 전달 방식


기본 타입의 값이 전달되는 경우 ( call by value )

  • 인자가 건네는 값이 매개변수에 복사되어서 전달된다.

객체가 전달되는 경우

  • 객체의 레퍼런스 값이 전달된다.

배열이 전달되는 경우

  • 배열에 대한 레퍼런스 값이 전달된다.

예시


char[] 배열을 전달받아 출력하는 printCharArray() 메소드와 배열 속의 공백(' ') 문자를 '.'로 대치하는 replaceSpace() 메소드를 작성하라.



public class AraayPassingEx {
    static void replaceSpace(char a[]) {
        for(int i=0; i<a.length; i++)
            if(a[i] == ' ')
                a[i] = ',';
    }

    static void printCharArray(char a[]) {
        for(int i=0; i<a.length; i++)
            System.out.print(a[i]);
        System.out.println();
    }

    public static void main(String[] args) {
        char c[] = {'T', 'h', 'i', 's', ' ','i','s',' ','a',' ','p','e','n','c','i','l','.'};
        printCharArray(c);
        replaceSpace(c);
        printCharArray(c);
    }
}

실행결과
This is a pencil.
This,is,a,pencil.

객체 배열


  • 객체를 원소로 갖는 객체 배열이다.
  • 객체를 원소로 갖는 객체 배열이라는 말은, 객체 레퍼런스를 원소로 갖는 배열이다.

객체 배열을 만들기 위해 다음과 같은 단계로 진행된다.

객체에 대한 레퍼런스 선언 -> 레퍼런스 배열 생성 -> 객체 생성



Circle [] c; // Circle 클래스의 배열에 대한 레퍼런스 변수 c를 선언한다.
c = new Circle[5]; // Circle 객체에 대한 레퍼런스 5개를 생성한다.
for(int i=0; i<c.length; i++) 
    c[i] = new Circle(i); // i 번째 Circle 객체 생성

for(int i=0; i<c.length; i++)
    System.out.print((int)(c[i].getArea()) + " "); //배열 c의 i번째 객체에 접근하기 위해서 c[i]레퍼런스를 사용한다.

예시


반지름이 0~4인 Circle 객체 5개를 가지는 배열을 생성하고, 배열에 있는 모든 Circle 객체의 면적을 출력하라.


class Circle{
    int radius;
    public Circle(int radius) {
        this.radius = radius;
    }
    public double getArea() {
        return 3.14*radius*radius;
    }
}

public class CircleArray {
    public static void main(String[] args) {
        Circle [] c;
        c = new Circle[5];

        for(int i=0; i<c.length; i++) {
            c[i] = new Circle(i);
        }

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

실행결과
0 3 12 28 50 

예시


예제 4-4의 Book 클래스를 활용하여 2개짜리 Book 객체 배열을 만들고, 사용자로부터 책의 제목과 저자를 입력받아 배열을 완성하라.


import java.util.Scanner;
class Book{
    String title,author;
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }
}
public class BookArray {
    public static void main(String[] args) {
        Book [] book = new Book[2];

        Scanner scanner = new Scanner(System.in);
        for(int i=0; i<book.length; i++) {
            System.out.print("제목>>");
            String title = scanner.nextLine();
            System.out.print("저자>>");
            String author = scanner.nextLine();
            book[i] = new Book(title, author);
        }

        for(int i=0; i<book.length; i++) {
            System.out.print("(" + book[i].title+", "+book[i].author + ")");

        }
        scanner.close();
    }
}

실행결과
제목>>캠잰슨
저자>>데이비드아들러
제목>>씨플프로그래밍
저자>>황기태
(캠잰슨, 데이비드아들러)(씨플프로그래밍, 황기태)

생성자


  • 객체가 생성될 때, 자동으로 실행되는 메소드다.
  • 매개변수의 갯수에 따라서 여러 개의 생성자를 만들 수 있다.
  • 하나의 생성자만 만들면, 나머지 생성자가 필요할 경우에는 직접 만들어야 한다.
  • 기본생성자만 필요한 경우, 기본생성자가 없어도 컴파일 오류없이 실행된다.
  • 생성자의 리턴타입이 없다고 해서 void를 삽입하면 컴파일 오류가 생길 수 있다.

예시1


2개의 생성자를 가진 Circle 클래스이다.



public class Circle {
    int radius;
    String name;

    public Circle() {
        radius = 1; name = "";
    }

    public Circle(int r, String n) {
        radius = r; name = n;
    }

    public double getArea() {
        return 3.14*radius*radius;
    }

    public static void main(String[] args) {
        Circle pizza = new Circle(10, "피자");

        double area = pizza.getArea();
        System.out.println(pizza.name + "의 면적은 "+ area);

        Circle donut = new Circle();
        donut.name = "도넛";
        area = donut.getArea();
        System.out.println(donut.name + "의 면적은 " + area);
    }
}

실행결과
피자의 면적은 314.0
도넛의 면적은 3.14

예시2


제목과 저자를 나타내는 title 과 필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화하라.



public class Book {

    String title;
    String author;

    public Book(String t) {
        title = t;
        author = "작자미상";
    }

    public Book(String t, String a) {
        title = t;
        author = a;
    }

    public static void main(String[] args) {
        Book littlePrince = new Book("어린왕자", "생택쥐페리");

        Book loveStory = new Book("춘향전");

        System.out.println(littlePrince.title+ " "+ littlePrince.author);
        System.out.println(loveStory.title+ " "+ loveStory.author);

    }
}

실행결과
어린왕자 생택쥐페리
춘향전 작자미상

생성자가 필요한 이유는 객체가 생성될 때, 필요한 초기 작업을 하기 위함이다.


this 레퍼런스


  • 객체 자신을 가리키는 레퍼런스이다.
  • 컴파일러에 의해 자동 관리되므로 그냥 쓰면 된다.
  • 객체가 있어야 this 레퍼런스를 사용할 수 있다.

예시



public class Book {
    String title;
    String author;

    public Book() {
        this("","");
        System.out.println("생성자 호출됨");
    }

    public Book(String title) {
        this(title,"작자미상");

    }

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    public static void main(String[] args) {

        Book littlePrince = new Book("어린왕자", "생텍쥐페리");
        Book loveStory = new Book("춘향전");
        Book emptyBook =new Book();

        System.out.println(loveStory.title + " " + loveStory.author);

    }
}

실행결과
생성자 호출됨
춘향전 작자미상

레퍼런스 변수 loveStory가 기리키는 객체가 생성될 때, 생성자도 실행된다. 생성자에서는 다른 생성자를 호출한다. 이 때, 첫번째 인수가 "춘향전"을 받는다.


객체지향


  • 객체 지향 언어는 실세계의 객체를 프로그램으로 표현하기 위해서 클래스와 객체 개념을 도입한 언어를 말한다.
  • 특징으로는 캡슐화(객체 내부를 보호하고 볼 수 없게 하는 것)
  • 객체는 클래스라는 캡슐을 사용하며, 필드메소드 를 구성된다.

클래스와 객체 생성 및 활용


  • 클래스는 객체를 만들기 위한 틀이다.
  • 클래스로 만들어진 것이 객체이다.
  • 간단한 예시로 붕어빵 틀과 만들어진 붕어빵이 있다.

public class Circle{ //클래스의 구성요소를 멤버라 한다. 멤버 변수를 필드, 멤버 함수를 메소드 라 한다.
    public int radius; //필드
    public String name; //필드
    public Circle() {}; // 생성자
    public double getArea() { // 메소드
        return 3.14*radius*radius;
    }

public static void main (String args[]){
    Circle pizza; 
    // Cirlce 에 대한 객체 레퍼런스 변수 pizza를 선언한다. 레퍼런스를 가지는 변수이지 객체가 생성된 것이 아니다.
    pizza = new Circle(); // Circle 객체를 생성한다.

    pizza.radius = 10; // 
    pizza.name = "자바피자";
    double area = pizza.getArea();
}

C++과 달리 레퍼런스 변수를 선언하고 객체를 생성하는 코드를 입력해야 객체가 생성된다!!


예시


반지름과 이름을 가진 Circle 클래스를 작성하고, Circle 클래스의 객체를 작성하라.


public class Circle {
    int radius;
    String name;

    public Circle() {}

    public double getArea() {
        return 3.14*radius*radius;
    }

    public static void main(String[] args) {
        Circle pizza;
        pizza = new Circle();
        pizza.radius = 10;
        pizza.name = "자바피자";
        double area = pizza.getArea();
        System.out.println(pizza.name + "의 면적은 "+area);

        Circle donut = new Circle();
        donut.radius = 2;
        donut.name = "도넛";
        area = donut.getArea();
        System.out.println(donut.name + "의 면적은 "+area);
    }
}

실행결과
자바피자의 면적은 314.0
도넛의 면적은 12.56

예시


너비와 높이를 입력받아 사각형의 합을 출력하는 프로그램을 작성하라. 너비(width)와 높이(height)필드, 그리고 면적 값을 제공하는 getArea() 메소드를 가진 Rectangle 클래스를 만들어 활용하라.


import java.util.Scanner;

class Rectangle{
    int width;
    int height;
    int getArea() {
        return width*height;
    }
}

public class RectApp {
    public static void main(String[] args) {
    Rectangle rect = new Rectangle();
    Scanner scanner =new Scanner(System.in);
    System.out.print(">>");
    rect.width = scanner.nextInt();
    rect.height = scanner.nextInt();

    System.out.println("사각형의 면적은 "+rect.getArea());
    scanner.close();
    }
}

실행결과
>>7 4
사각형의 면적은 28

클래스를 활용하여 만든 객체의 필드 안에 Scanner 클래스를 활용해서 값을 입력 받는다는 아이디어가 좋다!

예외 처리


  • 작성한 프로그램의 실행 중에 예외가 발생하면 이에 대응하는 것이다.
  • 예외 타입이란 아래에 있는 예외 클래스를 말한다.

try {
    예외가 발생할 가능성이 있는 실행문(try 블록)
}
catch (처리할 예외 타입 선언) {
    예외 처리문(catch 블록)
}
finally {
    예외 발생 여부와 상관없이 무조건 실행되는 문장(finally 블록){
}

예외 타입(예외 클래스) 예외 발생 경우 패키지
ArithmeticException 정수를 0으로 나눌 때 발생 java.lang
NullPointerException null 레퍼런스를 참조할 때 발생 java.lang
ClassCastException 변환할 수 없는 타입으로 객체를 변환할 때 발생 java.lang
OutOfMemoryError 메모리가 부족한 경우 발생 java.lang
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 접근 시 발생 java.lang
IllegalArgumentException 잘못된 인자 전달 시 발생 java.lang
IOException 입출력 동작 실패 또는 인터럽트 시 발생 java.io
NumberFormatException 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생 java.lang
InputMismatchException Scanner 클래스의 nextInt()를 호출하여 정수로 입력받고자 하였지만, 사용자가 'a' 등과 같이 문자를 입력한 경우 java.util

예시ArithmeticException


두 정수를 입력받아 나눗셈을 하고 몫을 구하는 프로그램 코드이다. 사용자가 나누는 수에 0을 입력하면 ArithmeticException 예외가 발생하여 프로그램이 강제 종료된다.


import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);

        int dividend;
        int divisor;

        System.out.print("나뉨수를 입력하시오:");
        dividend = scanner.nextInt();
        System.out.print("나눗수를 입력하시오:");
        divisor = scanner.nextInt();
        System.out.println(dividend+"를 "+divisor+"로 나누면 몫은 "+ dividend/divisor +"입니다.");
        scanner.close();
    }
}

실행결과
나뉨수를 입력하시오:100
나눗수를 입력하시오:0
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at DivideByZero.main(DivideByZero.java:15)

예시ArithmeticException e


try-catch 블록을 이용하여 예제 3-14를 수정하여, 정수를 0으로 나누는 경웨 "0으로 나눌 수 없습니다!"를 출력하고 다시 입력 받는 프로그램을 작성하라.


import java.util.Scanner;
public class DevideByZeroHandling {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while(true) {
            System.out.print("나뉨수를 입력하시오:");
            int dividend = scanner.nextInt();
            System.out.print("나눗수를 입력하시오:");
            int divisor = scanner.nextInt();
            try {
                System.out.println(dividend+ "를 "+ divisor + "로 나누면 몫은 "+ dividend/divisor + "입니다.");
                break;
            }
            catch (ArithmeticException e){
                System.out.println("0으로 나눌 수 없습니다.! 다시 입력하세요");
            }
        }
        scanner.close();
    }
}

실행결과
나뉨수를 입력하시오:100
나눗수를 입력하시오:0
0으로 나눌 수 없습니다.! 다시 입력하세요
나뉨수를 입력하시오:18
나눗수를 입력하시오:6
18를 6로 나누면 몫은 3입니다.

예시ArrayIndexOutOfBoundsException


배열의 인덱스가 범위를 벗어날 때 발생하는 ArrayIndexOutOfBoundsException을 처리하는 프로그램을 작성하라.



public class ArrayException {
    public static void main(String[] args) {
        int[] intArray = new int[5];
        intArray[0] = 0;
        try {
            for (int i=0; i<5; i++) {
                intArray[i+1] = i+1 + intArray[i];
                System.out.println("intArray["+i+"]"+"="+intArray[i]);
            }
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("배열의 인덱스가 범위를 벗어났습니다.");
        }
    }
}

실행결과
intArray[0]=0
intArray[1]=1
intArray[2]=3
intArray[3]=6
배열의 인덱스가 범위를 벗어났습니다.

예시InputMismatchException


3개의 정수를 입력받아 합을 구하는 프로그램을 작성하라. 사용자가 정수가 아닌 문자를 입력할 때 발생하는 InputMismatchException 예외를 처리하여 다시 입력받도록 하라.


 import java.util.Scanner;
import java.util.InputMismatchException;

public class InputException {
    public static void main(String [] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("정수 3개를 입력하세요");
        int sum=0,n = 0;

        for(int i=0; i<3; i++) {
            System.out.print(i+">>");
            try {
                n = scanner.nextInt();
            }
            catch(InputMismatchException e) {
                System.out.println("정수가 아닙니다. 다시 입력하세요!");
                scanner.nextLine();
                i--;
                continue;
            }
            sum += n;
        }
        System.out.println("합은 "+ sum);
        scanner.close();
    }

}

 실행결과
 정수 3개를 입력하세요
0>>6
1>>K
정수가 아닙니다. 다시 입력하세요!
1>>3
2>>9
합은 18

scanner.nextLine()을 사용하는 이유는 현재 입력 스트림에 남아 있는 토큰을 지우기 위해서이다. i--;를 하는 이유는 잘못 증가된 제어변수를 다시 감소시키기 위해서이다. continue;를 하여서 올바르지 않은 값을 더하지 않고 아래의 코드를 넘어간다.

예시NumberFormatException


문자열을 정수로 변환할 때 발생하는 NumberFormatException을 처리하는 프로그램을 작성하라.



public class NumException {
    public static void main(String[] args) {
        String[] stringNumber = {"23", "12", "3.141592", "998"};

        int i=0;
        try {
            for (i=0; i<stringNumber.length; i++) {
                int j = Integer.parseInt(stringNumber[i]);
                System.out.println("정수로 변환된 값은 "+j);
            }
        }
        catch (NumberFormatException e) {
            System.out.println(stringNumber[i]+ "는 정수로 변환할 수 없습니다.");
        }
    }
}

실행결과
정수로 변환된 값은 23
정수로 변환된 값은 12
3.141592는 정수로 변환할 수 없습니다.

Integer.parseInt()에 대한 추가 보충이 필요하다.

2차원 배열


  • 자바의 다차원 배열은 C/C++와 달리 독특한 구조를 가진다. (독특한 구조가 무엇인가? 이에 대한 보충이 필요하다.)
  • 배열은 배열에 대한 레퍼런스 변수를 생성하고 배열을 생성한다.
  • length 필드의 사용이 가능하다.

legnth 필드의 의미
-   i.legnth -> 배열의 행의 개수, n //n은 임의의 수

2차원 배열 레퍼런스 변수 선언
int intArray [][];
char charArray [][];
double doubleArray [][];

2차원 배열의 생성
intArray = new int [2][5];
charArray = new char [5][5];
doubleArray = new double [5][2];

레퍼런스 변수 선과 배열 생성을 동시에
int intArray [][] = new int [2][5];
char charArray [][] = new char [5][5];
double doubleArray  [][] = new double [5][2];

예시


2차원 배열에 학년별로 1, 2학기 성적으로 저장하고, 4년간 전체 평점 평균을 출력하라.


public class ScoreAverage {
    public static void main(String [] args) {
        double score[][] = {{3.3, 3.4}, {3.5,3.6}, {3.7, 4.0}, {4.1, 4.2}};
        double sum = 0;

        for(int year = 0; year<score.length; year++) {
            for(int term = 0; term<score[year].length; term++) {
                sum += score[year][term];
            }
        }

        int n = score.length;
        int m = score[0].length;
        System.out.println("4년 전체 평점 평균은 " +sum/(n*m));


    }
}

실행결과
4년 전체 평점 평균은 3.725

2차원 배열을 선언 및 생성할 때, 첫번째 중괄호 안에 있는 4개의 중괄호가 행이 되고, 각각의 중괄호 안에 있는 요소의 갯수가 열이 된다. for 문을 이용해서 점수를 모두 더할 때, 안쪽 for 문에서 행을 지정하는 것이 중요하다.


비정방형 배열


  • 정방형 배열은 각 행의 열의 개수가 모두 동일한 배열을 말한다.
  • 비정방형 배열은 각 행의 열의 개수가 서로 다른 배열을 말한다.

정방형 배열
1 1 1
1 1 1
1 1 1

비정방형 배열
1 2 3
4
3 7 4 7
3 4 6

예시


다음과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하라.


10 | 11 | 12
20 | 21
30 | 31 | 32
40 | 41


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

        int intArray[][] = new int [4][];
        intArray[0] = new int[3];
        intArray[1] = new int[2];
        intArray[2] = new int[3];
        intArray[3] = new int[2];

        for(int i=0; i<intArray.length; i++) {
            for(int j=0; j<intArray[i].length; j++) {
                intArray[i][j] = (i+1)*10+j;
            }
        }

        for(int i=0; i<intArray.length; i++) {
            for(int j=0; j<intArray[i].length; j++) {
                System.out.print(intArray[i][j]+"\t");
            }
            System.out.println();
        }
    }
}

실행결과
10    11    12    
20    21    
30    31    32    
40    41    

이중 for 문이 총 두번 나오는데, 둘 다 안 쪽 for 문에서의 조건식 이 매우 매우 중요하다. 배열의 length 필드를 지정할 때 행을 바깥 for 문의 제어변수로 설정하여 각 행의 열을 차례대로 대입하거나 출력할 수 있다.


배열과 for 문을 같이 사용할 때, 행과 열의 관계를 생각하면서 프로그램을 짜는 것이 중요하다.

배열 기초

  • 같은 타입의 데이터들이 연속적으로 저장된다.
  • 배열의 생성은 배열에 대한 레퍼런스 변수를 생성하고 배열을 생성한다.
  • 배열의 인덱스는 정수만 가능하다.

래퍼런스 변수 생성
int intArray[];

배열 생성
intArray = new int[5];

예시


양수 5개를 입력받아 배열에 저장하고, 제일 큰 수를 출력하는 프로그램을 작성하라.

import java.util.Scanner;
public class ArrayAccess {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int intArray[] = new int[5];
        int max = 0;
        System.out.println("양수 5개를 입력하세요.");
        for(int i=0; i<5; i++) {
            intArray[i] = scanner.nextInt();
            if(intArray[i] > max)
                max = intArray[i];
        }
        System.out.print("가장 큰 수는"+max + "입니다.");

        scanner.close();
    }
}

실행결과
양수 5개를 입력하세요.
39
28
17
3
9
가장 큰 수는39입니다.

length 필드


  • 자바에서는 배열을 객체로 다룬다. 객체에는 배열의 저장 공간의 함께 배열의 크기 값을 가진 legnth 필드가 존재한다.
  • length 필드가 있기에 배열의 크기를 따로 관리할 필요가 없다.

예시


배열의 legnth 필드를 이용하여 배열 크기만큼 정수를 입력받고 평균을 구하는 프로그램을 작성하라.


import java.util.Scanner;

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

        int intArray[] = new int [5];
        int sum = 0;


        Scanner scanner = new Scanner(System.in);
        System.out.print(intArray.length+"개의 정수를 입력하세요>> ");
        for(int i=0; i<intArray.length; i++) {
            intArray[i] = scanner.nextInt();
        }

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

        System.out.print("평균은 "+ (double)sum/intArray.length);
        scanner.close();
    }
}

실행결과
5개의 정수를 입력하세요>> 3 6 2 67 3 1
평균은 16.2

for-each 문


  • 배열 또는 나열의 크기만큼 루프를 돌면서 각 원소에 순차적으로 접근할 때 유용하게 만든 변형 for 문이 for-each 문이다.

for (변수 : 배열래퍼런스) {
    ...반복작업문...
}

배열 n에 들어 있는 모든 정수를 더하는 코드를 for-each 문으로 작성하면 다음과 같다.


int [] n = {1,2,3,4,5};
int sum = 0;
for (int k : n){ // n.length만 반복, k는 n[0], ..., n[4]로 번갈아 반복
    sum += k;
}

위 아래 코드는 서로 같다.

for (int i=0; i<n.length; i++){
    int k=n[i];
    sum+=k;

예시


for-each 문을 활용하는 사례를 보자.


public class foreachEx {
    enum Week {월,화,수,목,금,토,일}

    public static void main(String[] args) {
        int [] n = {1,2,3,4,5};
        String names[] = {"사과", "배", "바나나", "체리", "딸기", "포도"};

        int sum = 0;
        for (int k:n) {
            System.out.print(k+ " ");
            sum += k;
        }
        System.out.println("합은" +sum);

        for(String s: names) {
            System.out.print(s + " ");

        }
        System.out.println();

        for(Week day : Week.values()) {
            System.out.print(day + "요일");

        }
        System.out.println();
    }
}

실행결과
1 2 3 4 5 합은15
사과 배 바나나 체리 딸기 포도 
월요일화요일수요일목요일금요일토요일일요일

배열에 대한 개념내용 보충이 필요하다. for-each 문은 변형된 문법이기에 확실히 아는 것이 중요하다.

중첩반복문


  • 중첩반복문에서 break 문이 실행될 경우, 하나의 반복문만 벗어난다.

예시


2중 중첩 for 문을 사용하여 구구단을 출력하는 프로그램을 작성하라.



public class NestedLoop {
    public static void main(String[] args) {
        for(int i=1; i<10; i++) {
            for(int j= 1; j<10; j++) {
                System.out.print(i+"*"+"="+ i*j);
                System.out.print('\t');
            }
            System.out.println();
        }
    }
}

실행결과
1*=1    1*=2    1*=3    1*=4    1*=5    1*=6    1*=7    1*=8    1*=9    
2*=2    2*=4    2*=6    2*=8    2*=10    2*=12    2*=14    2*=16    2*=18    
3*=3    3*=6    3*=9    3*=12    3*=15    3*=18    3*=21    3*=24    3*=27    
4*=4    4*=8    4*=12    4*=16    4*=20    4*=24    4*=28    4*=32    4*=36    
5*=5    5*=10    5*=15    5*=20    5*=25    5*=30    5*=35    5*=40    5*=45    
6*=6    6*=12    6*=18    6*=24    6*=30    6*=36    6*=42    6*=48    6*=54    
7*=7    7*=14    7*=21    7*=28    7*=35    7*=42    7*=49    7*=56    7*=63    
8*=8    8*=16    8*=24    8*=32    8*=40    8*=48    8*=56    8*=64    8*=72    
9*=9    9*=18    9*=27    9*=36    9*=45    9*=54    9*=63    9*=72    9*=81    

continue 문


  • continue 문이 실행되면 for 문은 반복 후 작업 단계로 넘어간다.
  • continue 문이 실행되면 do-while 문과 while 문은 조건식으로 넘어간다.

예시


5개의 정수를 입력받고 그 중 양수들만 합하여 출력하는 프로그램을 작성하라.
(입력된 수가 0이나 음수이면 continue 문을 이용하여 합하지 않고 다음 반복으로 넘어간다.)


import java.util.Scanner;

public class ContinueExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int sum = 0;
        int input; 
        int i;
        for(i= 1; i<=5; i++) {
            input = scanner.nextInt();
            if(input <=0)
                continue;
            else
                sum +=input;
        }
        System.out.print("합:"+sum);
        scanner.close();
    }
}

실행결과
3
-5
19
-9
33
합:55

break 문


  • break 문이 실행되면 현재 반복문을 벗어난다.

예시


"exit"이 입력되면 while 문을 벗어나도록 break 문을 활용하는 프로그램을 작성하라.


import java.util.Scanner;
public class BreakExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("exit를 입력하면 종료합니다.");
        while(true) {
            System.out.print(">>");
            String text = scanner.nextLine();
            if(text.equals("exit"))
                break;
        }
        System.out.println("종료합니다...");
        scanner.close();
    }
}

실행결과
exit를 입력하면 종료합니다.
>>edit
>>check
>>exit
종료합니다...

특정한 문자열이 입력될 때까지 계속 반복하도록 하기 위해서 먼저 while 문 조건식에 true를 해서 무한반복하도록 한다. Scanner 클래스를 이용해서 값을 입력받고 if문을 활용하여 "exit"를 입력받으면 break 문을 통하여 while 문을 빠져나오도록 한다.


while 문을 무한반복하도록 한 뒤, if 문을 활용해서 반복을 탈출하도록 코딩하는 것이 꿀팁이다.!! 문자열 비교 시 equals()를 사용한다. 문자열이 같으면 equals()는 true를 리턴한다.

for 문

 

for (초기문; 조건식; 반복 후 작업) {
    ..작업문..
}

 

  • 반복 횟수를 아는 경우에 사용한다.
  • 초기문은 시작할 때 한 번만 실행된다.
  • 초기문에 ','를 사용하여 여러문장을 나열할 수 있다.
  • 조건식에 true 가 있거나 비어 있으면 무한 반복된다.
  • 작업문이 실행된 후, 반복 후 작업이 실행된다.

 

예시

 

for 문을 이용하여 1에서 10까지 덧셈으로 표시하고 합을 출력하라.

 

public class ForSample {
    public static void main(String[] args) {
        int sum = 0;

        for(int i=1; i<=10; i++) {
            sum += i;
            System.out.print(i);
            if(i<10)
                System.out.print("+");
        }

        System.out.print("="+sum);
    }
}

 

실행결과
1+2+3+4+5+6+7+8+9+10=55

for 문에서 1부터 10까지의 합을 sum변수에 대입하고 이를 출력한다.

 

while 문

 

whlie (조건식){
    ...작업문...
}

 

  • 조건식이 true 를 만족하는 동안 작업문을 반복 실행한다.
  • 조건식이 없으면 컴파일 오류가 발생한다.

 

예시

 

while 문을 이용하여 -1이 입력될 때까지 정수를 계속 입력받아 합을 구하고 평균을 출력하는 프로그램을 작성하라.

 

import java.util.Scanner;

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

        Scanner scanner = new Scanner(System.in);

        int sum = 0;
        double avg;
        int count = 0;
        int input = scanner.nextInt();
        while(input!= -1) {

            sum = sum + input;
            count ++;
            input = scanner.nextInt();

        }
        avg= (double)sum/count;

        System.out.print("합:"+sum+", 평균:"+avg);
        scanner.close();
    }
}

 

실행결과
38
20
-33
29
15
-1
합:69, 평균:13.8

 

정수를 입력받기 위해서 Scanner클래스를 이용한다. 입력받은 정수를 저장하기 위해서 sum을 선언하고, 입력받은 값들의 평균을 구하기 위해서 avg를 선언한다. 입력받은 값이 -1이 아닐동안에 값을 반복 입력받고 sum변수에 값을 계속 누적한다. 입력받은 값이 -1이라면, 이때까지 입력받은 값들의 합을 입력받은 횟수로 나누어서 평균을 구한다. 그리고 합과 평균을 출력한다.

 

조건식이 만족할 동안에 반복실행하기 때문에 scanner 메소드가 반복문 안에 있어야 한다.

 

do-whlie 문

 

do {
    ..작업문..
} while(조건식);

 

  • 작업문 실행 후 조건식을 검사하므로 작업문은 최초 한 번은 반드시 실행된다.
  • 조건식 뒤에 세미콜론을 빠뜨리지 않도록 한다.

 

예시

 

do-while 문을 이용하여 'a'부터 'z'까지 출력하는 프로그램을 작성하라.

 


public class DoWhileSample {
    public static void main(String[] args) {
        char c = 'a';

        do {
            System.out.print(c);
            c = (char)(c+1);
        }while(c<='z');
    }
}

 

실행결과
abcdefghijklmnopqrstuvwxyz

 

char 변수c 를 선언하고 문자리터럴 'a'로 초기화한다. do-while 문에서 일단 c 를 출력하고 c에 1만큼 더한 뒤(내부적으로는 c에 일대일대응되는 숫자값과 1을 더한 뒤 다시 char형으로 변환한다.), 이를 c가 'z'보다 작거나 같을 때가지 반복한다.

do-while 문을 활용하여 문자 리터럴과 문자열 사이의 개념을 다진 좋은 예제였다. 이 부분에 대해서는 나중에 추가적인 공부가 필요하리라 생각된다.

+ Recent posts